diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/util/WebFrameworkUtils.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/util/WebFrameworkUtils.java index f41d7f504bed2be74e8d83aebe5ff21bb2098d60..71aaa70e49a5373f2cd54a8d143300d08c4c3a09 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/util/WebFrameworkUtils.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/util/WebFrameworkUtils.java @@ -11,6 +11,7 @@ import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.ServletRequest; import javax.servlet.http.HttpServletRequest; +import java.util.Optional; /** * 专属于 web 包的工具类 @@ -106,7 +107,9 @@ public class WebFrameworkUtils { if (request == null) { return null; } - return request.getAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_NAME).toString(); + return Optional.ofNullable(request.getAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_NAME)) + .map(Object::toString) + .orElse(""); } /** diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java index 94a443535cbac4ee6ce867a519bd06b5031059af..d83d6fb06b3c65c200ff5ac185875d01b41e3d46 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java @@ -68,7 +68,10 @@ public class DeptServiceImpl implements DeptService { validateParentDept(updateReqVO.getId(), updateReqVO.getParentId()); // 校验部门名的唯一性 validateDeptNameUnique(updateReqVO.getId(), updateReqVO.getParentId(), updateReqVO.getName()); - + //如果没有leaderUserId说明是删除了leaderUserId + if (ObjectUtil.isNull(updateReqVO.getLeaderUserId())) { + updateReqVO.setLeaderUserId(null); + } // 更新部门 DeptDO updateObj = BeanUtils.toBean(updateReqVO, DeptDO.class); deptMapper.updateById(updateObj); diff --git a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/home/HomeController.java b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/home/HomeController.java index a38805a3c9a5a1e2cadb2456fd40763e04085f8f..5161e2b32f15121fbf6f09d156ff938a1efdfcc6 100644 --- a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/home/HomeController.java +++ b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/home/HomeController.java @@ -13,6 +13,12 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.Year; +import java.time.YearMonth; +import java.util.Objects; + import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @Tag(name = "管理后台 - 首页信息") @@ -32,6 +38,8 @@ public class HomeController { @GetMapping("/getHomeInfoFirst") @Operation(summary = "获得首页第一排信息") public CommonResult getHomeInfoFirst(@Valid HomeReqVO reqVO) { + LocalDateTime[] localDateTimes = parseSearchTime(reqVO.getSearchTimeString()); + reqVO.setSearchTime(localDateTimes); HomeFirstRespVO data = homeService.getHomeInfoFirst(reqVO); return success(data); } @@ -40,6 +48,8 @@ public class HomeController { @GetMapping("/getHomeInfoBfztj") @Operation(summary = "获得首页拜访周统计") public CommonResult getHomeInfoBfztj(@Valid HomeReqVO reqVO) { + LocalDateTime[] localDateTimes = parseSearchTime(reqVO.getSearchTimeString()); + reqVO.setSearchTime(localDateTimes); HomeBfztjRespVO data = homeService.getHomeInfoBfztj(reqVO); return success(data); } @@ -48,20 +58,26 @@ public class HomeController { @GetMapping("/getHomeInfoKhxzdjzbqk") @Operation(summary = "获得首页客户性质等级占比情况") public CommonResult getHomeInfoKhxzdjzbqk(@Valid HomeReqVO reqVO) { + LocalDateTime[] localDateTimes = parseSearchTime(reqVO.getSearchTimeString()); + reqVO.setSearchTime(localDateTimes); HomeKhxzdjzbqkRespVO data = homeService.getHomeInfoKhxzdjzbqk(reqVO); return success(data); } @GetMapping("/getHomeInfoBfrjfbqk") @Operation(summary = "获得首页拜访人均分布情况") - public CommonResult getHomeInfoBfrjfbqk(@Valid HomeReqVO reqVO) { - HomeBfrjfbqkRespVO data = homeService.getHomeInfoBfrjfbqk(reqVO); + public CommonResult getHomeInfoBfrjfbqk(@Valid HomeReqVO reqVO) { + LocalDateTime[] localDateTimes = parseSearchTime(reqVO.getSearchTimeString()); + reqVO.setSearchTime(localDateTimes); + HomeKhxzdjzbqkRespVO data = homeService.getHomeInfoBfrjfbqk(reqVO); return success(data); } @GetMapping("/getHomeInfoKhbffszbqk") @Operation(summary = "获得首页客户拜访方式占比情况") public CommonResult getHomeInfoKhbffszbqk(@Valid HomeReqVO reqVO) { + LocalDateTime[] localDateTimes = parseSearchTime(reqVO.getSearchTimeString()); + reqVO.setSearchTime(localDateTimes); HomeKhxzdjzbqkRespVO data = homeService.getHomeInfoKhbffszbqk(reqVO); return success(data); } @@ -69,6 +85,8 @@ public class HomeController { @GetMapping("/getHomeInfoKhbmzbqk") @Operation(summary = "获得首页客户部门占比情况") public CommonResult getHomeInfoKhbmzbqk(@Valid HomeReqVO reqVO) { + LocalDateTime[] localDateTimes = parseSearchTime(reqVO.getSearchTimeString()); + reqVO.setSearchTime(localDateTimes); HomeKhxzdjzbqkRespVO data = homeService.getHomeInfoKhbmzbqk(reqVO); return success(data); } @@ -76,14 +94,18 @@ public class HomeController { @GetMapping("/getHomeInfoKhbflxzbqk") @Operation(summary = "获得首页客户拜访类型占比情况") public CommonResult getHomeInfoKhbflxzbqk(@Valid HomeReqVO reqVO) { + LocalDateTime[] localDateTimes = parseSearchTime(reqVO.getSearchTimeString()); + reqVO.setSearchTime(localDateTimes); HomeKhxzdjzbqkRespVO data = homeService.getHomeInfoKhbflxzbqk(reqVO); return success(data); } @GetMapping("/getHomeInfoBfcplxzbqk") @Operation(summary = "获得首页拜访产品类型占比情况") - public CommonResult getHomeInfoBfcplxzbqk(@Valid HomeReqVO reqVO) { - HomeBfrjfbqkRespVO data = homeService.getHomeInfoBfcplxzbqk(reqVO); + public CommonResult getHomeInfoBfcplxzbqk(@Valid HomeReqVO reqVO) { + LocalDateTime[] localDateTimes = parseSearchTime(reqVO.getSearchTimeString()); + reqVO.setSearchTime(localDateTimes); + HomeKhxzdjzbqkRespVO data = homeService.getHomeInfoBfcplxzbqk(reqVO); return success(data); } @@ -91,6 +113,8 @@ public class HomeController { @GetMapping("/getHomeInfoBfrtj") @Operation(summary = "获得首页拜访日统计") public CommonResult getHomeInfoBfrtj(@Valid HomeReqVO reqVO) { + LocalDateTime[] localDateTimes = parseSearchTime(reqVO.getSearchTimeString()); + reqVO.setSearchTime(localDateTimes); HomeBfrtjRespVO data = homeService.getHomeInfoBfrtj(reqVO); return success(data); } @@ -98,7 +122,37 @@ public class HomeController { + //将前端传的查询时间String[] 转换为LocalDateTime[] + public static LocalDateTime[] parseSearchTime(String[] searchTime) { + if (searchTime == null || searchTime.length != 2 || + Objects.equals(searchTime[0], "") || Objects.equals(searchTime[1], "")) { + return null; + } + + String startStr = searchTime[0]; + String endStr = searchTime[1]; + + LocalDateTime startTime; + LocalDateTime endTime; + if (startStr.matches("^\\d{4}$") && endStr.matches("^\\d{4}$")) { + // 年 + startTime = Year.parse(startStr).atDay(1).atStartOfDay(); + endTime = Year.parse(endStr).atMonth(12).atEndOfMonth().atTime(23, 59, 59); + } else if (startStr.matches("^\\d{4}-\\d{2}$") && endStr.matches("^\\d{4}-\\d{2}$")) { + // 年-月 + startTime = YearMonth.parse(startStr).atDay(1).atStartOfDay(); + endTime = YearMonth.parse(endStr).atEndOfMonth().atTime(23, 59, 59); + } else if (startStr.matches("^\\d{4}-\\d{2}-\\d{2}$") && endStr.matches("^\\d{4}-\\d{2}-\\d{2}$")) { + // 年-月-日 + startTime = LocalDate.parse(startStr).atStartOfDay(); + endTime = LocalDate.parse(endStr).atTime(23, 59, 59); + } else { + throw new IllegalArgumentException("searchTime 格式非法,必须是 [yyyy] 或 [yyyy-MM] 或 [yyyy-MM-dd]"); + } + + return new LocalDateTime[]{startTime, endTime}; + } } \ No newline at end of file diff --git a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/home/vo/HomeReqVO.java b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/home/vo/HomeReqVO.java index 4fc0548ae0d3e8b0c126b3948f4dfc65c0f2b0cc..c58e8e3d8c202c63ed7524348fcc4d56ccc72530 100644 --- a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/home/vo/HomeReqVO.java +++ b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/home/vo/HomeReqVO.java @@ -20,7 +20,9 @@ public class HomeReqVO { private String companyName; @Schema(description = "查询时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] searchTime; + @Schema(description = "查询时间前端传入的String[]") + private String[] searchTimeString; + } \ 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 a4fae2758c1bbefdf94635a08a53a27d769f9805..b92430483ab66e3a724802c8c8dbc9b93ca94a6f 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 @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.visit.controller.admin.info; +import com.fhs.common.utils.StringUtil; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -74,6 +75,10 @@ public class InfoController { @GetMapping("/getPrintListByIds") @Operation(summary = "获得客户拜访打印信息根据Ids") public CommonResult> getPrintListByIds(@RequestParam("ids") String ids) { + //如果ids是空的,返回异常提示,请先选择需要打印的记录 + if (StringUtil.isEmpty(ids)) { + throw new RuntimeException("请先选择需要打印的记录"); + } String[] split = ids.split(","); //转为List List idList = new ArrayList<>(); @@ -86,9 +91,14 @@ public class InfoController { @GetMapping("/getPrintListByCompanyName") @Operation(summary = "获得客户拜访打印信息根据公司名称") - public CommonResult getPrintListByCompanyName(@RequestParam("companyName") String companyName) { + public CommonResult> getPrintListByCompanyName(@RequestParam("companyName") String companyName) { InfoPrintVO info = infoService.getInfoByCompanyName(companyName); - return success(info); + List infoPrintVO = new ArrayList<>(); + if (info == null){ + return success(infoPrintVO); + } + infoPrintVO.add(info); + return success(infoPrintVO); } @GetMapping("/page") 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 5faacf934130142bc2f8363557cadcbfa4cf1380..f3056cbbf40ae617a4004d95e3e358edc94c27d4 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,7 @@ public class CustomerInfoServiceImpl implements CustomerInfoService { // 更新 CustomerInfoDO updateObj = BeanUtils.toBean(updateReqVO, CustomerInfoDO.class); CustomerInfoDO customerInfoDO = customerInfoMapper.selectByCompanyName(updateObj.getCompanyName()); - if (customerInfoDO != null) { + if (customerInfoDO != null && !customerInfoDO.getId().equals(updateObj.getId())) { throw exception(CUSTOMER_INFO_COMPANY_NAME_DUPLICATE); } if (updateObj.getLocationImage() != null&& updateObj.getLocationImage().startsWith("https://apis.map.qq.com/ws/staticmap/v2/")){ diff --git a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/home/HomeService.java b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/home/HomeService.java index 12009457a7a80e8db558cf43fc0b53c3a9ac0e78..e805f712a1b802027a44bcc573f24be635f649fd 100644 --- a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/home/HomeService.java +++ b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/home/HomeService.java @@ -18,7 +18,7 @@ public interface HomeService { HomeKhxzdjzbqkRespVO getHomeInfoKhxzdjzbqk(@Valid HomeReqVO reqVO); - HomeBfrjfbqkRespVO getHomeInfoBfrjfbqk(@Valid HomeReqVO reqVO); + HomeKhxzdjzbqkRespVO getHomeInfoBfrjfbqk(@Valid HomeReqVO reqVO); HomeKhxzdjzbqkRespVO getHomeInfoKhbffszbqk(@Valid HomeReqVO reqVO); @@ -26,7 +26,7 @@ public interface HomeService { HomeKhxzdjzbqkRespVO getHomeInfoKhbflxzbqk(@Valid HomeReqVO reqVO); - HomeBfrjfbqkRespVO getHomeInfoBfcplxzbqk(@Valid HomeReqVO reqVO); + HomeKhxzdjzbqkRespVO getHomeInfoBfcplxzbqk(@Valid HomeReqVO reqVO); HomeBfrtjRespVO getHomeInfoBfrtj(@Valid HomeReqVO reqVO); } \ No newline at end of file diff --git a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/home/HomeServiceImpl.java b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/home/HomeServiceImpl.java index 644c08009686bc8179e18a0b96bdc4f46c176847..d576eeed045b50e5b2f0da059bb05864a2476002 100644 --- a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/home/HomeServiceImpl.java +++ b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/service/home/HomeServiceImpl.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.visit.service.home; +import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.system.api.dict.DictDataApi; import cn.iocoder.yudao.module.system.api.dict.dto.DictDataRespDTO; @@ -85,8 +86,17 @@ public class HomeServiceImpl implements HomeService { //拜访周统计 @Override public HomeBfztjRespVO getHomeInfoBfztj(HomeReqVO reqVO) { - LocalDateTime start = reqVO.getSearchTime()[0]; - LocalDateTime end = reqVO.getSearchTime()[1]; + //如果查询时间是空,则start = LocalDateTime.now().minusWeeks(10); + LocalDateTime start = null; + LocalDateTime end = null; + if (reqVO.getSearchTime() == null) { + start = LocalDateTime.now().minusWeeks(10); + end = LocalDateTime.now(); + }else { + start = reqVO.getSearchTime()[0]; + end = reqVO.getSearchTime()[1]; + } + // 对齐到每周一 start = start.with(DayOfWeek.MONDAY); @@ -155,7 +165,7 @@ public class HomeServiceImpl implements HomeService { //拜访人均分布情况 @Override - public HomeBfrjfbqkRespVO getHomeInfoBfrjfbqk(HomeReqVO reqVO) { + public HomeKhxzdjzbqkRespVO getHomeInfoBfrjfbqk(HomeReqVO reqVO) { //1.先查出所有的拜访记录 InfoPageReqVO infoPageReqVO = new InfoPageReqVO(); infoPageReqVO.setPageSize(-1); @@ -175,12 +185,19 @@ public class HomeServiceImpl implements HomeService { .collect(Collectors.toList()); // 拆分为两个数组 - List names = top10.stream().map(Map.Entry::getKey).collect(Collectors.toList()); - List values = top10.stream().map(e -> e.getValue().intValue()).collect(Collectors.toList()); - - HomeBfrjfbqkRespVO respVO = new HomeBfrjfbqkRespVO(); - respVO.setNames(names); - respVO.setValues(values); +// List names = top10.stream().map(Map.Entry::getKey).collect(Collectors.toList()); +// List values = top10.stream().map(e -> e.getValue().intValue()).collect(Collectors.toList()); + //直接成对放入 + List list = top10.stream() + .map(entry -> { + HomeKhxzdjzbqkRespVO.TypeCountItem item = new HomeKhxzdjzbqkRespVO.TypeCountItem(); + item.setName(entry.getKey()); + item.setValue(entry.getValue().intValue()); + return item; + }) + .collect(Collectors.toList()); + HomeKhxzdjzbqkRespVO respVO = new HomeKhxzdjzbqkRespVO(); + respVO.setList(list); return respVO; } @@ -296,7 +313,7 @@ public class HomeServiceImpl implements HomeService { } @Override - public HomeBfrjfbqkRespVO getHomeInfoBfcplxzbqk(HomeReqVO reqVO) { + public HomeKhxzdjzbqkRespVO getHomeInfoBfcplxzbqk(HomeReqVO reqVO) { //1.先查出所有的客户信息 InfoPageReqVO infoPageReqVO = new InfoPageReqVO(); infoPageReqVO.setPageSize(-1); @@ -317,7 +334,13 @@ public class HomeServiceImpl implements HomeService { .collect(Collectors.toSet()); // 3. 查询产品信息(id => 名称-规格) - List productList = productMapper.selectBatchIds(productIdSet); + //判断是否为空 + if (CollUtil.isEmpty(productIdSet)){ + HomeKhxzdjzbqkRespVO vo = new HomeKhxzdjzbqkRespVO(); + vo.setList(new ArrayList()); + return vo; + } + List productList = productMapper.selectByIds(productIdSet); Map productMap = productList.stream() .collect(Collectors.toMap( ProductDO::getId, @@ -342,13 +365,21 @@ public class HomeServiceImpl implements HomeService { .limit(10) .collect(Collectors.toList()); - List names = topList.stream().map(Map.Entry::getKey).collect(Collectors.toList()); - List values = topList.stream().map(Map.Entry::getValue).collect(Collectors.toList()); + //直接成对放入list + List list = topList.stream() + .map(entry -> { + HomeKhxzdjzbqkRespVO.TypeCountItem item = new HomeKhxzdjzbqkRespVO.TypeCountItem(); + item.setName(entry.getKey()); + item.setValue(entry.getValue()); + return item; + }) + .collect(Collectors.toList()); +// List names = topList.stream().map(Map.Entry::getKey).collect(Collectors.toList()); +// List values = topList.stream().map(Map.Entry::getValue).collect(Collectors.toList()); // 6. 构建返回结果 - HomeBfrjfbqkRespVO vo = new HomeBfrjfbqkRespVO(); - vo.setNames(names); - vo.setValues(values); + HomeKhxzdjzbqkRespVO vo = new HomeKhxzdjzbqkRespVO(); + vo.setList(list); return vo; } diff --git a/yudao-ui/yudao-ui-admin-vue3/src/views/Home/Index.vue b/yudao-ui/yudao-ui-admin-vue3/src/views/Home/Index.vue index 5d91947d4bddc18d9f1ff14603e85ef81d93dcfa..57e9edb7a1eb264233638e6d2e4b6995f4add8ef 100644 --- a/yudao-ui/yudao-ui-admin-vue3/src/views/Home/Index.vue +++ b/yudao-ui/yudao-ui-admin-vue3/src/views/Home/Index.vue @@ -340,7 +340,7 @@ watch(timeRange, (newVal: any) => { getEcharts() }) - \ No newline at end of file + diff --git a/yudao-ui/yudao-ui-admin-vue3/src/views/Home/YearRangeSelector.vue b/yudao-ui/yudao-ui-admin-vue3/src/views/Home/YearRangeSelector.vue index 05d540dbee56d8fe5918c38ae40395f9288f47c3..f90fcf54d9b6e6883ae1c9dbe53d31003ddff75a 100644 --- a/yudao-ui/yudao-ui-admin-vue3/src/views/Home/YearRangeSelector.vue +++ b/yudao-ui/yudao-ui-admin-vue3/src/views/Home/YearRangeSelector.vue @@ -231,7 +231,7 @@ onUnmounted(() => { }) - \ No newline at end of file + diff --git a/yudao-ui/yudao-ui-admin-vue3/src/views/Home/components/BarChart.vue b/yudao-ui/yudao-ui-admin-vue3/src/views/Home/components/BarChart.vue index 7e153c5108b04c7b0e35d31d531beed9770fd062..fa4a396fa833c24636d1dfe5580c7006c6a397be 100644 --- a/yudao-ui/yudao-ui-admin-vue3/src/views/Home/components/BarChart.vue +++ b/yudao-ui/yudao-ui-admin-vue3/src/views/Home/components/BarChart.vue @@ -125,7 +125,7 @@ const handleChartReady = (chart: any) => { } - \ No newline at end of file + diff --git a/yudao-ui/yudao-ui-admin-vue3/src/views/Home/components/LineChart.vue b/yudao-ui/yudao-ui-admin-vue3/src/views/Home/components/LineChart.vue index 7301bd4270e6661908e19f24d2048ed1f5ea4b50..d8a75305ddf51e8edffe3d534079131c89876f69 100644 --- a/yudao-ui/yudao-ui-admin-vue3/src/views/Home/components/LineChart.vue +++ b/yudao-ui/yudao-ui-admin-vue3/src/views/Home/components/LineChart.vue @@ -142,7 +142,7 @@ const handleChartReady = (chart: any) => { } - \ No newline at end of file + 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 a7c29529f33cb256824b8dd005c9c4cd79c78cbd..2e535482028c22e52fff7c7252b369cfc9a4d844 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 @@ -47,7 +47,7 @@ const props = defineProps({ const chartOption = computed(() => { // console.log(props.data,"props.data"); - + const legendData = props.data.map((item) => item.name) return { tooltip: { @@ -135,7 +135,7 @@ const handleChartReady = (chart: echarts.ECharts) => { } - \ No newline at end of file + diff --git a/yudao-ui/yudao-ui-admin-vue3/src/views/Home/components/barChart_1.vue b/yudao-ui/yudao-ui-admin-vue3/src/views/Home/components/barChart_1.vue index a223b8c06f102310d3294c1d91795a5ddfcf6114..335f470ebd098d0ca2ab47702e9f77dfd8f905cd 100644 --- a/yudao-ui/yudao-ui-admin-vue3/src/views/Home/components/barChart_1.vue +++ b/yudao-ui/yudao-ui-admin-vue3/src/views/Home/components/barChart_1.vue @@ -116,7 +116,7 @@ const handleChartReady = (chart: any) => { } - \ No newline at end of file + 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 435c479733dfe843b8461d919b1d4cb4e0d5c3e7..9e1d71ca1772441e2ef5bfc525fabefe522f053d 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 @@ -160,10 +160,10 @@ const formRules = reactive({ cityName: [{ required: true, message: '市名称不能为空', trigger: 'blur' }], areaName: [{ required: true, message: '区名称不能为空', trigger: 'blur' }], regionFullName: [{ required: true, message: '所在地区不能为空', trigger: 'blur' }], - locationText: [{ required: true, message: '详细地址不能为空', trigger: 'blur' }], + locationText: [{ required: true, message: '详细地址不能为空', trigger: 'change' }], longitude: [{ required: true, message: '经度不能为空', trigger: 'blur' }], latitude: [{ required: true, message: '纬度不能为空', trigger: 'blur' }], - locationImage: [{ required: true, message: '定位静态图 URL不能为空', trigger: 'blur' }], + locationImage: [{ required: true, message: '定位静态图不能为空', trigger: 'blur' }], }) const formRef = ref() // 表单 Ref diff --git a/yudao-ui/yudao-ui-admin-vue3/src/views/visit/customerinfo/index.vue b/yudao-ui/yudao-ui-admin-vue3/src/views/visit/customerinfo/index.vue index b0dfd0b414fb18c6ffcacbdf965c6bcaa1f8e883..b95904050d4eafbca480636d7c24908829348150 100644 --- a/yudao-ui/yudao-ui-admin-vue3/src/views/visit/customerinfo/index.vue +++ b/yudao-ui/yudao-ui-admin-vue3/src/views/visit/customerinfo/index.vue @@ -166,7 +166,12 @@ - + + +
+ +
+
@@ -181,6 +186,8 @@ import ProductList from "@/views/visit/util/ProductList.vue"; import {useRouter} from 'vue-router' import {InfoApi, InfoPrintVO} from "@/api/visit/info"; import CustomerImportForm from "@/views/visit/customerinfo/CustomerImportForm.vue"; +import PrintContent from "@/views/visit/util/PrintContent.vue"; +import {usePrint} from "@/views/visit/util/print"; /** 客户信息 列表 */ @@ -212,25 +219,36 @@ const importFormRef = ref() const handleImport = () => { importFormRef.value.open() } +const printData = ref([]) - -const visitPrintRef = ref() +const printComp = ref() // 模拟获取详情数据的方法(你应该调 InfoApi.getInfoListByIds 或类似接口) -const selectedData = ref([]) - -const handlePrint = async (companyName: string) => { - selectedData.value = await InfoApi.getPrintListByCompanyName(companyName) +const handlePrint = async (companyName) => { + printData.value = await InfoApi.getPrintListByCompanyName(companyName) + await nextTick() + console.log(printData.value) //判断是否有数据 - if (!selectedData.value) { + if (printData.value.length === 0) { message.warning('该客户暂无拜访记录') return } - console.log(selectedData.value) - await nextTick() - visitPrintRef.value?.print() + const dom = printComp.value.printRef + if (dom) usePrint(dom) } +// const handlePrint = async (companyName: string) => { +// selectedData.value = await InfoApi.getPrintListByCompanyName(companyName) +// //判断是否有数据 +// if (!selectedData.value) { +// message.warning('该客户暂无拜访记录') +// return +// } +// console.log(selectedData.value) +// await nextTick() +// printComp.value?.print() +// } + /** 多选操作**/ const handleSelectionChange = (val) => { multipleSelection.value = val.map(item=>item.id) 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 afd5da5b289bf50f896aef9093d6b3731eab2105..23b706d3b0cd388d3b19582f28eaab37b98d96dc 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 @@ -123,7 +123,7 @@ :autosize="{ minRows: 4, maxRows: 6 }" /> - + @@ -185,10 +185,10 @@ const formRules = reactive({ cityName: [{ required: true, message: '市名称不能为空', trigger: 'blur' }], areaName: [{ required: true, message: '区名称不能为空', trigger: 'blur' }], regionFullName: [{ required: true, message: '所在地区不能为空', trigger: 'blur' }], - locationText: [{ required: true, message: '定位地址文字描述不能为空', trigger: 'blur' }], + locationText: [{ required: true, message: '详细地址不能为空', trigger: 'change' }], longitude: [{ required: true, message: '经度不能为空', trigger: 'blur' }], latitude: [{ required: true, message: '纬度不能为空', trigger: 'blur' }], - locationImage: [{ required: true, message: '定位静态图URL不能为空', trigger: 'blur' }], + locationImage: [{ required: true, message: '定位静态图不能为空', trigger: 'blur' }], visitDate: [{ required: true, message: '拜访日期不能为空', trigger: 'blur' }], customerStatus: [{ required: true, message: '性质等级不能为空', trigger: 'blur' }], department: [{ required: true, message: '客户部门不能为空', trigger: 'blur' }], diff --git a/yudao-ui/yudao-ui-admin-vue3/src/views/visit/info/index.vue b/yudao-ui/yudao-ui-admin-vue3/src/views/visit/info/index.vue index 2f3ec6e6abe552a07e1eba944449e5cf517b9475..9f8d9e3c46885cdaad10374cb407c14b3ed023da 100644 --- a/yudao-ui/yudao-ui-admin-vue3/src/views/visit/info/index.vue +++ b/yudao-ui/yudao-ui-admin-vue3/src/views/visit/info/index.vue @@ -214,7 +214,14 @@ - + + + +
+ +
+
+ + + diff --git a/yudao-ui/yudao-ui-admin-vue3/src/views/visit/util/print.ts b/yudao-ui/yudao-ui-admin-vue3/src/views/visit/util/print.ts new file mode 100644 index 0000000000000000000000000000000000000000..7eab30c0d552102f1b7015b4871b2dcf5e777951 --- /dev/null +++ b/yudao-ui/yudao-ui-admin-vue3/src/views/visit/util/print.ts @@ -0,0 +1,35 @@ +// src/utils/print.ts + +export const usePrint = (target: HTMLElement) => { + const printWindow = window.open('', '_blank') + if (!printWindow) return + + const style = ` + + ` + const content = target.innerHTML + printWindow.document.write(`打印${style}${content}`) + printWindow.document.close() + + const images = printWindow.document.images + let loaded = 0 + const onload = () => { + loaded++ + if (loaded === images.length) { + printWindow.print() + printWindow.close() + } + } + + if (images.length === 0) { + printWindow.print() + printWindow.close() + } else { + Array.from(images).forEach(img => { + img.onload = img.onerror = onload + }) + } +}