From fbf8a14ae2825739bd7bf92b57c63b9bd2fc2684 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B3=95=E6=8B=8951246?= <719602854@qq.com> Date: Fri, 6 Jun 2025 17:43:02 +0800 Subject: [PATCH] =?UTF-8?q?less=E6=94=B9=E4=B8=BAscss=20=E6=89=93=E5=8D=B0?= =?UTF-8?q?=E5=AE=8C=E6=88=90=20=E5=A4=A7=E5=B1=8F=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/core/util/WebFrameworkUtils.java | 5 +- .../system/service/dept/DeptServiceImpl.java | 5 +- .../controller/admin/home/HomeController.java | 62 +++- .../controller/admin/home/vo/HomeReqVO.java | 4 +- .../controller/admin/info/InfoController.java | 14 +- .../customerinfo/CustomerInfoServiceImpl.java | 2 +- .../visit/service/home/HomeService.java | 4 +- .../visit/service/home/HomeServiceImpl.java | 63 +++- .../src/views/Home/Index.vue | 4 +- .../src/views/Home/YearRangeSelector.vue | 4 +- .../src/views/Home/components/BarChart.vue | 4 +- .../src/views/Home/components/LineChart.vue | 4 +- .../src/views/Home/components/PieChart.vue | 6 +- .../src/views/Home/components/barChart_1.vue | 4 +- .../visit/customerinfo/CustomerInfoForm.vue | 4 +- .../src/views/visit/customerinfo/index.vue | 40 ++- .../src/views/visit/info/InfoForm.vue | 6 +- .../src/views/visit/info/index.vue | 32 +- .../src/views/visit/util/PrintContent.vue | 288 ++++++++++++++++++ .../src/views/visit/util/print.ts | 35 +++ 20 files changed, 526 insertions(+), 64 deletions(-) create mode 100644 yudao-ui/yudao-ui-admin-vue3/src/views/visit/util/PrintContent.vue create mode 100644 yudao-ui/yudao-ui-admin-vue3/src/views/visit/util/print.ts 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 f41d7f5..71aaa70 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 94a4435..d83d6fb 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 a38805a..5161e2b 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 4fc0548..c58e8e3 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 a4fae27..b924304 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 5faacf9..f3056cb 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 1200945..e805f71 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 644c080..d576eee 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 5d91947..57e9edb 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 05d540d..f90fcf5 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 7e153c5..fa4a396 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 7301bd4..d8a7530 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 a7c2952..2e53548 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 a223b8c..335f470 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 435c479..9e1d71c 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 b0dfd0b..b959040 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 afd5da5..23b706d 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 2f3ec6e..9f8d9e3 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 0000000..7eab30c --- /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 + }) + } +} -- 2.22.0