diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/oauth2/OAuth2TokenServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/oauth2/OAuth2TokenServiceImpl.java index db127a5a39af474f8d769163d13928bb1a07ff8b..896d32de26542aab70c13488728d96f3903913bd 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/oauth2/OAuth2TokenServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/oauth2/OAuth2TokenServiceImpl.java @@ -204,7 +204,7 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService { private Map buildUserInfo(Long userId, Integer userType) { if (userType.equals(UserTypeEnum.ADMIN.getValue())) { AdminUserDO user = adminUserService.getUser(userId); - Long branchDeptId = findBranchDeptId(user.getDeptId(), 100L);//找到分公司Id,这里的100L是总公司的ID,未来某一天如果有变,就改这里 + Long branchDeptId = findBranchDeptId(user.getDeptId(), 100L);//找到分公司Id,这里的100L是总公司的ID,未来某一天如果有变,就改这里 锚点 return MapUtil.builder(LoginUser.INFO_KEY_NICKNAME, user.getNickname()) .put(LoginUser.INFO_KEY_DEPT_ID, StrUtil.toStringOrNull(branchDeptId)).build(); } else if (userType.equals(UserTypeEnum.MEMBER.getValue())) { diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java index a4bc2c91cde5c190512a56848a4a509dbb597fd8..a970a30a81d0c9a5322e028d8b209df9ec81cb89 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java @@ -9,10 +9,13 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RolePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.UserRoleDO; import cn.iocoder.yudao.module.system.dal.mysql.permission.RoleMapper; +import cn.iocoder.yudao.module.system.dal.mysql.permission.UserRoleMapper; import cn.iocoder.yudao.module.system.dal.redis.RedisKeyConstants; import cn.iocoder.yudao.module.system.enums.permission.DataScopeEnum; import cn.iocoder.yudao.module.system.enums.permission.RoleCodeEnum; @@ -30,6 +33,7 @@ import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; @@ -50,6 +54,8 @@ public class RoleServiceImpl implements RoleService { @Resource private RoleMapper roleMapper; + @Resource + private UserRoleMapper userRoleMapper; @Override @Transactional(rollbackFor = Exception.class) @@ -187,7 +193,14 @@ public class RoleServiceImpl implements RoleService { @Override public List getRoleListByStatus(Collection statuses) { - return roleMapper.selectListByStatus(statuses); + List roleDOS = roleMapper.selectListByStatus(statuses); + //判断当前用户是不是超级管理员,如果不是,需要过滤掉超级管理员 + List userRoleDOS = userRoleMapper.selectListByUserId(SecurityFrameworkUtils.getLoginUserId()); + // 如果userRoleDOS中没有roleId=1的记录,则过滤掉roleDOS中id=1的记录 + roleDOS = userRoleDOS.stream().noneMatch(userRole -> userRole.getRoleId() == 1L) + ? roleDOS.stream().filter(role -> role.getId() != 1L).collect(Collectors.toList()) + : roleDOS; + return roleDOS; } @Override diff --git a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/customerinfo/CustomerInfoController.java b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/customerinfo/CustomerInfoController.java index d7f6175162f2c22385c1e2b31f4012696209145c..2b8ef9acf0fd2b22e50d4ae7eaa92b29964ea0b6 100644 --- a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/customerinfo/CustomerInfoController.java +++ b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/customerinfo/CustomerInfoController.java @@ -76,6 +76,27 @@ public class CustomerInfoController { return success(true); } + + @DeleteMapping("/deleteByIds") + @Operation(summary = "批量删除客户信息") + @Parameter(name = "ids", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('visit:customer-info:delete')") + @Idempotent(timeout = 10, message = "重复请求,请稍后重试") + public CommonResult deleteCustomerInfoByIds(@RequestParam("ids") String ids) { + //如果ids是空的,返回异常提示,请先选择需要打印的记录 + if (StringUtil.isEmpty(ids)) { + throw new RuntimeException("请先选择需要删除的记录"); + } + String[] split = ids.split(","); + //转为List + List idList = new ArrayList<>(); + for (String s : split) { + idList.add(Long.parseLong(s)); + } + customerInfoService.deleteCustomerInfoByIds(idList); + return success(true); + } + @GetMapping("/get") @Operation(summary = "获得客户信息") @Parameter(name = "id", description = "编号", required = true, example = "1024") 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 d456b16d8b352982e585aee81a3096a67ce59fae..bc4921d5f6a291c36a8b9f3bfd3a929fab2c9c4d 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 @@ -60,12 +60,15 @@ public class CustomerInfoSaveReqVO { private String locationImage; @Schema(description = "产品信息") + @NotEmpty(message = "产品信息不能为空") private String productIds; @Schema(description = "产品信息名称") + @NotEmpty(message = "产品信息名称不能为空") private String productNames; @Schema(description = "客户部门") + @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/InfoController.java b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/info/InfoController.java index 46215333f1aca7d618fb3954c5ea35b0eadc6dfb..bd851f0ecf7529996a00bbc51a7611e8c9049461 100644 --- a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/info/InfoController.java +++ b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/info/InfoController.java @@ -67,6 +67,26 @@ public class InfoController { return success(true); } + @DeleteMapping("/deleteByIds") + @Operation(summary = "删除客户拜访记录") + @Parameter(name = "ids", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('visit:info:delete')") + @Idempotent(timeout = 10, message = "重复请求,请稍后重试") + public CommonResult deleteInfoByIds(@RequestParam("ids") String ids) { + //如果ids是空的,返回异常提示,请先选择需要打印的记录 + if (StringUtil.isEmpty(ids)) { + throw new RuntimeException("请先选择需要删除的记录"); + } + String[] split = ids.split(","); + //转为List + List idList = new ArrayList<>(); + for (String s : split) { + idList.add(Long.parseLong(s)); + } + infoService.deleteInfoByIds(idList); + return success(true); + } + @GetMapping("/get") @Operation(summary = "获得客户拜访记录") @Parameter(name = "id", description = "编号", required = true, example = "1024") @@ -78,6 +98,7 @@ public class InfoController { @GetMapping("/getPrintListByIds") @Operation(summary = "获得客户拜访打印信息根据Ids") + @PreAuthorize("@ss.hasPermission('visit:info:print')") public CommonResult> getPrintListByIds(@RequestParam("ids") String ids) { //如果ids是空的,返回异常提示,请先选择需要打印的记录 if (StringUtil.isEmpty(ids)) { @@ -93,8 +114,41 @@ public class InfoController { return success(info); } + @GetMapping("/getUnionPrintListByIds") + @Operation(summary = "获得合并客户拜访打印信息根据Ids") + @PreAuthorize("@ss.hasPermission('visit:info:print')") + public CommonResult> getUnionPrintListByIds(@RequestParam("ids") String ids) { + //如果ids是空的,返回异常提示,请先选择需要打印的记录 + if (StringUtil.isEmpty(ids)) { + throw new RuntimeException("请先选择需要合并的打印的记录"); + } + String[] split = ids.split(","); + //转为List + List idList = new ArrayList<>(); + for (String s : split) { + idList.add(Long.parseLong(s)); + } + List info = infoService.getUnionInfoByIds(idList); + return success(info); + } + + @GetMapping("/getUnionAllPrintListByIds") + @Operation(summary = "获得合并客户拜访打印信息根据Ids") + @PreAuthorize("@ss.hasPermission('visit:info:print')") + public CommonResult> getUnionAllPrintListByIds(@Valid InfoPageReqVO pageReqVO) { + PageResult pageResult = infoService.getInfoPage(pageReqVO); + if (pageResult.getTotal()==0){ + throw new RuntimeException("当前不存在可打印数据"); + } + List list = pageResult.getList(); + + List info = infoService.getUnionAllInfoByIds(list); + return success(info); + } + @GetMapping("/getPrintListByCompanyName") @Operation(summary = "获得客户拜访打印信息根据公司名称") + @PreAuthorize("@ss.hasPermission('visit:customer-info:print')") public CommonResult> getPrintListByCompanyName(@RequestParam("companyName") String companyName) { InfoPrintVO info = infoService.getInfoByCompanyName(companyName); List infoPrintVO = new ArrayList<>(); diff --git a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/info/vo/InfoPrintVO.java b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/info/vo/InfoPrintVO.java index f55c65984504ab7e85e49dde75a3feb03b0b28da..da8abc09d55a163cfd18a1ab4d128c84b36679e6 100644 --- a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/info/vo/InfoPrintVO.java +++ b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/info/vo/InfoPrintVO.java @@ -10,6 +10,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import java.math.BigDecimal; +import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; @@ -32,7 +33,7 @@ public class InfoPrintVO { private String locationImage; @Schema(description = "最近四次拜访日期", requiredMode = Schema.RequiredMode.REQUIRED) - private List visitDate; + private List visitDate; @Schema(description = "拜访品种") private String visitProductNames; 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 3c36b8e2bd41a7ec20ac41d4c7da013b0d68d96b..c916bfdb01b25f875062e7b973c066f6589bcb6b 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 @@ -17,7 +17,6 @@ public class InfoSaveReqVO { private Long id; @Schema(description = "客户姓名", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "客户姓名不能为空") private String customerName; @Schema(description = "联系方式") @@ -68,27 +67,35 @@ public class InfoSaveReqVO { private Integer customerStatus; @Schema(description = "拜访品种(多选,逗号分隔)") + @NotEmpty(message = "拜访品种不能为空") private String visitProductIds; @Schema(description = "拜访品种名称(多选,逗号分隔)") + @NotEmpty(message = "拜访品种名称不能为空") private String visitProductNames; @Schema(description = "拜访方式(字典)") + @NotNull(message = "拜访方式不能为空") private Integer visitMethod; @Schema(description = "拜访类型(字典)", example = "2") + @NotNull(message = "拜访类型不能为空") private Integer visitType; @Schema(description = "客户所属部门(字典)") + @NotEmpty(message = "客户所属部门不能为空") private String department; @Schema(description = "服务内容") + @NotEmpty(message = "服务内容不能为空") private String serviceContent; @Schema(description = "客户反馈") + @NotEmpty(message = "客户反馈不能为空") private String customerFeedback; - @Schema(description = "服务记录图片URL列表(JSON数组)") + @Schema(description = "服务记录图片") + @NotEmpty(message = "服务记录图片不能为空") private String serviceImages; } \ No newline at end of file diff --git a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/product/ProductController.java b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/product/ProductController.java index 2abf47d695dd6c2cf25baa25449481eabaeea827..71cefc5de4edb3adcc14af883d880282aae6b6ff 100644 --- a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/product/ProductController.java +++ b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/product/ProductController.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.visit.controller.admin.product; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.idempotent.core.annotation.Idempotent; import cn.iocoder.yudao.module.system.enums.common.SexEnum; +import com.fhs.common.utils.StringUtil; import io.swagger.v3.oas.annotations.Parameters; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -71,6 +72,26 @@ public class ProductController { return success(true); } + @DeleteMapping("/deleteByIds") + @Operation(summary = "删除产品") + @Parameter(name = "ids", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('visit:product:delete')") + @Idempotent(timeout = 10, message = "重复请求,请稍后重试") + public CommonResult deleteProductByIds(@RequestParam("ids") String ids) { + //如果ids是空的,返回异常提示,请先选择需要打印的记录 + if (StringUtil.isEmpty(ids)) { + throw new RuntimeException("请先选择需要删除的记录"); + } + String[] split = ids.split(","); + //转为List + List idList = new ArrayList<>(); + for (String s : split) { + idList.add(Long.parseLong(s)); + } + productService.deleteProductByIds(idList); + return success(true); + } + @GetMapping("/get") @Operation(summary = "获得产品") @Parameter(name = "id", description = "编号", required = true, example = "1024") diff --git a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/enums/ErrorCodeConstants.java b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/enums/ErrorCodeConstants.java index a7e86b559d982fb3792e83cf1a8477a1569b1651..e1d8e5de8b77d9274245f76fc5191c6ac22e38d7 100644 --- a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/enums/ErrorCodeConstants.java +++ b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/enums/ErrorCodeConstants.java @@ -13,14 +13,17 @@ public interface ErrorCodeConstants { ErrorCode PRODUCT_NOT_EXISTS = new ErrorCode(1001000001, "产品不存在"); ErrorCode PRODUCT_PRODUCT_EXISTS = new ErrorCode(1001000002, "导入产品已存在!"); ErrorCode PRODUCT_IMPORT_LIST_IS_EMPTY = new ErrorCode(1001000003, "导入产品数据不能为空!"); + ErrorCode PRODUCT_LIST_NOT_EXISTS = new ErrorCode(1001000004, "所选产品中含有不存在的数据"); // ========== 客户信息 ========== ErrorCode CUSTOMER_INFO_NOT_EXISTS = new ErrorCode(1002000001, "客户信息不存在"); ErrorCode CUSTOMER_INFO_COMPANY_NAME_DUPLICATE = new ErrorCode(1002000002, "该公司名称已存在"); ErrorCode CUSTOMER_INFO_IMPORT_LIST_IS_EMPTY = new ErrorCode(1002000003, "导入客户数据不能为空!"); ErrorCode CUSTOMER_INFO_EXISTS = new ErrorCode(1002000004, "导入客户数据已存在!"); + ErrorCode CUSTOMER_INFO_LIST_NOT_EXISTS = new ErrorCode(1002000005, "所选客户信息中含有不存在的数据"); // ========== 客户拜访记录 ========== ErrorCode INFO_NOT_EXISTS = new ErrorCode(1003000001, "客户拜访记录不存在"); + ErrorCode INFO_LIST_NOT_EXISTS = new ErrorCode(1003000002, "所选客户拜访记录中含有不存在的数据"); } diff --git a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/customerinfo/CustomerInfoService.java b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/customerinfo/CustomerInfoService.java index 26d9a53925526bc04053f8f47c2509c74f067a38..3e3c45e6f7f99515e9913ed2e9ad047b5935c241 100644 --- a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/customerinfo/CustomerInfoService.java +++ b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/customerinfo/CustomerInfoService.java @@ -59,4 +59,6 @@ public interface CustomerInfoService { List getAllCustomerInfo(); CustomerImportRespVO importCustomerList(List list, Boolean updateSupport); + + void deleteCustomerInfoByIds(List idList); } \ No newline at end of file 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 e328c446c5060d3e3f75655a9eb90085b5184fbd..02fa06e97ec60ee4931104ab013ef391133d6fc5 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 @@ -106,6 +106,16 @@ public class CustomerInfoServiceImpl implements CustomerInfoService { customerInfoMapper.deleteById(id); } + @Override + public void deleteCustomerInfoByIds(List idList) { + // 校验存在 + if(customerInfoMapper.selectByIds(idList).size() != idList.size()){ + throw exception(INFO_LIST_NOT_EXISTS); + } + // 删除 + customerInfoMapper.deleteByIds(idList); + } + private void validateCustomerInfoExists(Long id) { if (customerInfoMapper.selectById(id) == null) { throw exception(CUSTOMER_INFO_NOT_EXISTS); diff --git a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/info/InfoService.java b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/info/InfoService.java index 21ee9193e41096c753882b35c057b05822d011f0..f7d28a472dafcb9966199f29caaf2fc4105210f6 100644 --- a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/info/InfoService.java +++ b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/info/InfoService.java @@ -65,4 +65,10 @@ public interface InfoService { * @return 客户拜访记录 */ InfoPrintVO getInfoByCompanyName(String companyName); + + List getUnionInfoByIds(List idList); + + void deleteInfoByIds(List idList); + + List getUnionAllInfoByIds(List list); } \ No newline at end of file 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 dfc86bffbbf8c22ef67fee095c074b911e65e662..ebb701295c5931ba41595fcd2c9a788d977a5444 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 @@ -26,11 +26,14 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.io.IOException; +import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.YearMonth; import java.util.*; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.visit.enums.ErrorCodeConstants.INFO_LIST_NOT_EXISTS; import static cn.iocoder.yudao.module.visit.enums.ErrorCodeConstants.INFO_NOT_EXISTS; import static java.nio.file.Files.createFile; @@ -130,6 +133,86 @@ public class InfoServiceImpl implements InfoService { infoMapper.deleteById(id); } + + + @Override + public void deleteInfoByIds(List idList) { + // 校验存在 + if(infoMapper.selectByIds(idList).size() != idList.size()){ + throw exception(INFO_LIST_NOT_EXISTS); + } + // 删除 + infoMapper.deleteByIds(idList); + } + + @Override + public List getUnionAllInfoByIds(List list) { + List vos = new ArrayList<>(); + if (list.isEmpty()){ + return vos; + } + List> groupedByCompany = list.stream() + // 按公司名称分组,取每个公司最近四次(结果:Map>) + .collect(Collectors.groupingBy(InfoDO::getCompanyName)) + .values().stream() // 遍历每个公司的记录列表 + .map(companyRecords -> + companyRecords.stream() + // 按拜访时间降序排序 + .sorted(Comparator.comparing(InfoDO::getVisitDate).reversed()) + .limit(4) // 取最近 4 条 + .collect(Collectors.toList()) + ) + .collect(Collectors.toList()); // 收集为 List> + groupedByCompany.forEach(info -> { + //服务内容(最近四次) + List serviceContent = new ArrayList<>(); + //服务图片(最多四张) + List serviceImages = new ArrayList<>(); + //拜访时间记录 + List visitDateList = new ArrayList<>(); + //以第一个公司名称作为合并打印的公司 + String companyName = info.get(0).getCompanyName(); + //取最多4张服务图片 + int maxImages = 4; + for (InfoDO infoDO : info) { + if (serviceImages.size() >= maxImages) break; + + String imagesStr = infoDO.getServiceImages(); + if (StringUtils.isNotBlank(imagesStr)) { + List imageList = Arrays.asList(imagesStr.split(",")); + int remaining = maxImages - serviceImages.size(); + serviceImages.addAll(imageList.stream().limit(remaining).collect(Collectors.toList())); + } + } + //获取客户拜访记录成功,获取客户信息 + info.forEach(infoDO -> { + //服务内容记录 + serviceContent.add(infoDO.getServiceContent()); + //拜访时间记录 + visitDateList.add(infoDO.getVisitDate().toLocalDate()); + }); + //下面获取客户信息 + InfoPrintVO infoPrintVO = new InfoPrintVO(); + CustomerInfoDO customerInfoDO = customerInfoMapper.selectByCompanyName(companyName); + if (customerInfoDO != null){ + infoPrintVO.setVisitProductNames(customerInfoDO.getProductNames());//本次拜访品种 + infoPrintVO.setCompanyName(customerInfoDO.getCompanyName());//公司名称 + infoPrintVO.setSalesman(customerInfoDO.getCreator());//拜访记录的创建者就是该记录的业务员 + infoPrintVO.setLocationImage(customerInfoDO.getLocationImage());//公司定位图 + infoPrintVO.setContact(customerInfoDO.getContact()); + infoPrintVO.setDepartment(customerInfoDO.getDepartment()); + } + //添加多次的信息 + infoPrintVO.setServiceContent(serviceContent); + infoPrintVO.setVisitDate(visitDateList); + infoPrintVO.setServiceImages(String.join(",", serviceImages)); + //拜访次数 + infoPrintVO.setServiceCount(info.size()); + vos.add(infoPrintVO); + }); + return vos; + } + private void validateInfoExists(Long id) { if (infoMapper.selectById(id) == null) { throw exception(INFO_NOT_EXISTS); @@ -172,7 +255,7 @@ public class InfoServiceImpl implements InfoService { infoPrintVO.setContact(infoDO.getContact());//联系方式 infoPrintVO.setSalesman(infoDO.getCreator());//拜访记录的创建者就是该记录的业务员 infoPrintVO.setLocationImage(infoDO.getLocationImage()); - infoPrintVO.setVisitDate(Collections.singletonList(infoDO.getVisitDate())); + infoPrintVO.setVisitDate(Collections.singletonList(infoDO.getVisitDate().toLocalDate())); //拜访次数按拜访id打印都是1 infoPrintVO.setServiceCount(1); vos.add(infoPrintVO); @@ -189,12 +272,20 @@ public class InfoServiceImpl implements InfoService { //服务图片(最多四张) List serviceImages = new ArrayList<>(); //拜访时间记录 - List visitDateList = new ArrayList<>(); + List visitDateList = new ArrayList<>(); + // 获取当前年月(用于比较月份) + YearMonth currentYearMonth = YearMonth.now(); //现根据客户名称获取历史拜访记录 List info = infoMapper.selectByCompanyName(companyName); if (info != null && !info.isEmpty()){ //取最近四次 - info = info.stream().sorted(Comparator.comparing(InfoDO::getVisitDate).reversed()).limit(4).collect(Collectors.toList()); + info = info.stream() + // 筛选本月记录(基于 LocalDateTime) + .filter(infoDO -> { + LocalDateTime visitDateTime = infoDO.getVisitDate(); + return YearMonth.from(visitDateTime.toLocalDate()).equals(currentYearMonth); + }) + .sorted(Comparator.comparing(InfoDO::getVisitDate).reversed()).limit(4).collect(Collectors.toList()); //取最多4张服务图片 int maxImages = 4; for (InfoDO infoDO : info) { @@ -212,7 +303,7 @@ public class InfoServiceImpl implements InfoService { //服务内容记录 serviceContent.add(infoDO.getServiceContent()); //拜访时间记录 - visitDateList.add(infoDO.getVisitDate()); + visitDateList.add(infoDO.getVisitDate().toLocalDate()); }); //下面获取客户信息 CustomerInfoDO customerInfoDO = customerInfoMapper.selectByCompanyName(companyName); @@ -234,4 +325,76 @@ public class InfoServiceImpl implements InfoService { return infoPrintVO; } + @Override + public List getUnionInfoByIds(List idList) { + List vos = new ArrayList<>(); + + //现根据客户名称获取历史拜访记录 + List infoAll = infoMapper.selectByIds(idList); + + if (infoAll != null && !infoAll.isEmpty()){ + + List> groupedByCompany = infoAll.stream() + // 按公司名称分组,取每个公司最近四次(结果:Map>) + .collect(Collectors.groupingBy(InfoDO::getCompanyName)) + .values().stream() // 遍历每个公司的记录列表 + .map(companyRecords -> + companyRecords.stream() + // 按拜访时间降序排序 + .sorted(Comparator.comparing(InfoDO::getVisitDate).reversed()) + .limit(4) // 取最近 4 条 + .collect(Collectors.toList()) + ) + .collect(Collectors.toList()); // 收集为 List> + groupedByCompany.forEach(info -> { + //服务内容(最近四次) + List serviceContent = new ArrayList<>(); + //服务图片(最多四张) + List serviceImages = new ArrayList<>(); + //拜访时间记录 + List visitDateList = new ArrayList<>(); + //以第一个公司名称作为合并打印的公司 + String companyName = info.get(0).getCompanyName(); + //取最多4张服务图片 + int maxImages = 4; + for (InfoDO infoDO : info) { + if (serviceImages.size() >= maxImages) break; + + String imagesStr = infoDO.getServiceImages(); + if (StringUtils.isNotBlank(imagesStr)) { + List imageList = Arrays.asList(imagesStr.split(",")); + int remaining = maxImages - serviceImages.size(); + serviceImages.addAll(imageList.stream().limit(remaining).collect(Collectors.toList())); + } + } + //获取客户拜访记录成功,获取客户信息 + info.forEach(infoDO -> { + //服务内容记录 + serviceContent.add(infoDO.getServiceContent()); + //拜访时间记录 + visitDateList.add(infoDO.getVisitDate().toLocalDate()); + }); + //下面获取客户信息 + InfoPrintVO infoPrintVO = new InfoPrintVO(); + CustomerInfoDO customerInfoDO = customerInfoMapper.selectByCompanyName(companyName); + if (customerInfoDO != null){ + infoPrintVO.setVisitProductNames(customerInfoDO.getProductNames());//本次拜访品种 + infoPrintVO.setCompanyName(customerInfoDO.getCompanyName());//公司名称 + infoPrintVO.setSalesman(customerInfoDO.getCreator());//拜访记录的创建者就是该记录的业务员 + infoPrintVO.setLocationImage(customerInfoDO.getLocationImage());//公司定位图 + infoPrintVO.setContact(customerInfoDO.getContact()); + infoPrintVO.setDepartment(customerInfoDO.getDepartment()); + } + //添加多次的信息 + infoPrintVO.setServiceContent(serviceContent); + infoPrintVO.setVisitDate(visitDateList); + infoPrintVO.setServiceImages(String.join(",", serviceImages)); + //拜访次数 + infoPrintVO.setServiceCount(info.size()); + vos.add(infoPrintVO); + }); + } + return vos; + } + } \ No newline at end of file diff --git a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/product/ProductService.java b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/product/ProductService.java index aa5b2aab9c87116749595fe3679d130d54cd522e..fdb560cece3ee93cdf95091ee76d3bf8ca98ef1d 100644 --- a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/product/ProductService.java +++ b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/product/ProductService.java @@ -61,4 +61,6 @@ public interface ProductService { ProductImportRespVO importProductList(List list, Boolean updateSupport); List getProductByIds(String productIds); + + void deleteProductByIds(List idList); } \ No newline at end of file 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 fec5d20d48d3c05383f5946cb35b535719b3a9af..3ca33aa43da5ffd02b2e7c6d4a54a69666cb5720 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 @@ -65,6 +65,18 @@ public class ProductServiceImpl implements ProductService { productMapper.deleteById(id); } + + + @Override + public void deleteProductByIds(List idList) { + // 校验存在 + if(productMapper.selectByIds(idList).size() != idList.size()){ + throw exception(PRODUCT_LIST_NOT_EXISTS); + } + // 删除 + productMapper.deleteByIds(idList); + } + private void validateProductExists(Long id) { if (productMapper.selectById(id) == null) { throw exception(PRODUCT_NOT_EXISTS); diff --git a/yudao-ui/yudao-ui-admin-vue3/src/api/visit/customerinfo/index.ts b/yudao-ui/yudao-ui-admin-vue3/src/api/visit/customerinfo/index.ts index 4ccd63ecb5b22cb9e77199ac90bea2a52928bd58..162e47872fe2b46107393ff9b6704aa3fc621920 100644 --- a/yudao-ui/yudao-ui-admin-vue3/src/api/visit/customerinfo/index.ts +++ b/yudao-ui/yudao-ui-admin-vue3/src/api/visit/customerinfo/index.ts @@ -65,6 +65,11 @@ export const CustomerInfoApi = { return await request.delete({ url: `/visit/customer-info/delete?id=` + id }) }, + // 批量删除客户信息 + deleteCustomerInfoByIds: async (ids: String) => { + return await request.delete({ url: `/visit/customer-info/deleteByIds?ids=` + ids }) + }, + // 导出客户信息 Excel exportCustomerInfo: async (params) => { return await request.download({ url: `/visit/customer-info/export-excel`, params }) diff --git a/yudao-ui/yudao-ui-admin-vue3/src/api/visit/info/index.ts b/yudao-ui/yudao-ui-admin-vue3/src/api/visit/info/index.ts index dab507c638c7ae97c925766b159f7edac7e8ca58..cf8e9bb74329d763bba40eaee08a6cc3e291447d 100644 --- a/yudao-ui/yudao-ui-admin-vue3/src/api/visit/info/index.ts +++ b/yudao-ui/yudao-ui-admin-vue3/src/api/visit/info/index.ts @@ -67,6 +67,15 @@ export const InfoApi = { return await request.get({ url: `/visit/info/get?id=` + id }) }, + //查询合并打印客户拜访记录 + getUnionPrintListByIds: async (ids: string) => { + return await request.get({ url: `/visit/info/getUnionPrintListByIds`, params: { ids } }) + }, + + //查询合并打印客户拜访记录(筛选出的所有数据) + getUnionAllPrintListByIds: async (params: any) => { + return await request.get({ url: `/visit/info/getUnionAllPrintListByIds`, params }) + }, //查询打印客户拜访记录 getPrintListByIds: async (ids: string) => { return await request.get({ url: `/visit/info/getPrintListByIds`, params: { ids } }) @@ -93,6 +102,12 @@ export const InfoApi = { return await request.delete({ url: `/visit/info/delete?id=` + id }) }, + + // 删除客户拜访记录 + deleteInfoByIds: async (ids: String) => { + return await request.delete({ url: `/visit/info/deleteByIds?ids=` + ids }) + }, + // 导出客户拜访记录 Excel exportInfo: async (params) => { return await request.download({ url: `/visit/info/export-excel`, params }) diff --git a/yudao-ui/yudao-ui-admin-vue3/src/api/visit/product/index.ts b/yudao-ui/yudao-ui-admin-vue3/src/api/visit/product/index.ts index c354dbb05d4ec4037618afd60c1f415a9d863739..93840f15769b61c42902e1ff2f52c35426c395ef 100644 --- a/yudao-ui/yudao-ui-admin-vue3/src/api/visit/product/index.ts +++ b/yudao-ui/yudao-ui-admin-vue3/src/api/visit/product/index.ts @@ -41,6 +41,12 @@ export const ProductApi = { return await request.delete({ url: `/visit/product/delete?id=` + id }) }, + + // 批量删除产品 + deleteProductByIds: async (ids: String) => { + return await request.delete({ url: `/visit/product/deleteByIds?ids=` + ids }) + }, + // 导出产品 Excel exportProduct: async (params) => { return await request.download({ url: `/visit/product/export-excel`, params }) diff --git a/yudao-ui/yudao-ui-admin-vue3/src/components/UploadFile/src/UploadImgs.vue b/yudao-ui/yudao-ui-admin-vue3/src/components/UploadFile/src/UploadImgs.vue index 0e1ea0276c6c1721f9639b399f47de65f56eac29..2dcbb2ab2b6cb8e5b34a5495185d4f564889ae39 100644 --- a/yudao-ui/yudao-ui-admin-vue3/src/components/UploadFile/src/UploadImgs.vue +++ b/yudao-ui/yudao-ui-admin-vue3/src/components/UploadFile/src/UploadImgs.vue @@ -16,10 +16,9 @@ :on-success="uploadSuccess" list-type="picture-card" > -
+
-