From 07703c77dabfd5f5eaddb885a192bad66da5250c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B3=95=E6=8B=8951246?= <719602854@qq.com> Date: Fri, 30 May 2025 19:57:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=89=8D=E7=AB=AF=E8=85=BE=E8=AE=AF=E5=9C=B0?= =?UTF-8?q?=E5=9B=BEapi=E5=AF=B9=E6=8E=A5=20=E5=AE=A2=E6=88=B7=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E9=A1=B5=E9=9D=A2=E7=9C=81=E5=B8=82=E5=8C=BA=E7=BA=A7?= =?UTF-8?q?=E8=81=94+=E9=80=89=E6=8B=A9=E5=9C=B0=E7=82=B9=E5=8A=9F?= =?UTF-8?q?=E8=83=BD+=E5=AD=98=E5=82=A8=E8=85=BE=E8=AE=AF=E5=9C=B0?= =?UTF-8?q?=E5=9B=BE=E9=9D=99=E6=80=81=E5=9C=B0=E5=9B=BEURL=20-----=20?= =?UTF-8?q?=E5=90=8E=E7=AB=AF=E5=A2=9E=E5=8A=A0=E4=BA=A7=E5=93=81=E7=9A=84?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=20=E6=94=B9=E5=8F=98app-api=E7=9A=84?= =?UTF-8?q?=E4=BC=9A=E5=91=98=E8=BA=AB=E4=BB=BD=E6=A0=A1=E9=AA=8C=EF=BC=88?= =?UTF-8?q?=E9=83=BD=E6=94=B9=E4=B8=BA=E7=AE=A1=E7=90=86=E5=91=98=E8=BA=AB?= =?UTF-8?q?=E4=BB=BDuserType=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/core/util/WebFrameworkUtils.java | 2 +- .../controller/admin/user/UserController.java | 8 +- yudao-module-visit/pom.xml | 4 + .../customerinfo/vo/CustomerInfoRespVO.java | 23 +++ .../admin/product/ProductController.java | 36 ++++- .../product/vo/ProductImportExcelVO.java | 37 +++++ .../admin/product/vo/ProductImportRespVO.java | 24 ++++ .../dal/mysql/product/ProductMapper.java | 4 + .../visit/enums/ErrorCodeConstants.java | 2 + .../visit/service/product/ProductService.java | 7 + .../service/product/ProductServiceImpl.java | 52 +++++++ .../yudao-ui-admin-vue3/package-lock.json | 14 ++ yudao-ui/yudao-ui-admin-vue3/package.json | 1 + .../src/api/visit/product/index.ts | 5 + .../src/views/system/user/index.vue | 16 +-- .../visit/customerinfo/CustomerInfoForm.vue | 118 ++++++++++++--- .../views/visit/product/ProductImportForm.vue | 134 ++++++++++++++++++ .../src/views/visit/product/index.vue | 17 +++ .../src/views/visit/util/MapPicker.vue | 63 ++++++++ 19 files changed, 528 insertions(+), 39 deletions(-) create mode 100644 yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/product/vo/ProductImportExcelVO.java create mode 100644 yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/product/vo/ProductImportRespVO.java create mode 100644 yudao-ui/yudao-ui-admin-vue3/src/views/visit/product/ProductImportForm.vue create mode 100644 yudao-ui/yudao-ui-admin-vue3/src/views/visit/util/MapPicker.vue 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 1acc6b0..6dc18c2 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 @@ -113,7 +113,7 @@ public class WebFrameworkUtils { return UserTypeEnum.ADMIN.getValue(); } if (request.getServletPath().startsWith(properties.getAppApi().getPrefix())) { - return UserTypeEnum.MEMBER.getValue(); + return UserTypeEnum.ADMIN.getValue();//暂时去掉会员的用户类型,全部都是管理员用户类型 } return null; } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java index 3f7dc61..1f6600b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java @@ -147,10 +147,10 @@ public class UserController { public void importTemplate(HttpServletResponse response) throws IOException { // 手动创建导出 demo List list = Arrays.asList( - UserImportExcelVO.builder().username("yunai").deptId(1L).email("yunai@iocoder.cn").mobile("15601691300") - .nickname("芋道").status(CommonStatusEnum.ENABLE.getStatus()).sex(SexEnum.MALE.getSex()).build(), - UserImportExcelVO.builder().username("yuanma").deptId(2L).email("yuanma@iocoder.cn").mobile("15601701300") - .nickname("源码").status(CommonStatusEnum.DISABLE.getStatus()).sex(SexEnum.FEMALE.getSex()).build() + UserImportExcelVO.builder().username("falao").deptId(1L).email("666666@qq.com").mobile("15601691300") + .nickname("模板用户1").status(CommonStatusEnum.ENABLE.getStatus()).sex(SexEnum.MALE.getSex()).build(), + UserImportExcelVO.builder().username("fala").deptId(2L).email("666666@qq.com").mobile("15601701300") + .nickname("模板用户2").status(CommonStatusEnum.DISABLE.getStatus()).sex(SexEnum.FEMALE.getSex()).build() ); // 输出 ExcelUtils.write(response, "用户导入模板.xls", "用户列表", UserImportExcelVO.class, list); diff --git a/yudao-module-visit/pom.xml b/yudao-module-visit/pom.xml index d4f34c9..46fd7df 100644 --- a/yudao-module-visit/pom.xml +++ b/yudao-module-visit/pom.xml @@ -41,6 +41,10 @@ cn.iocoder.boot yudao-spring-boot-starter-excel + + cn.iocoder.boot + yudao-spring-boot-starter-biz-data-permission + diff --git a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/customerinfo/vo/CustomerInfoRespVO.java b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/customerinfo/vo/CustomerInfoRespVO.java index 7a9e296..2909cc8 100644 --- a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/customerinfo/vo/CustomerInfoRespVO.java +++ b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/customerinfo/vo/CustomerInfoRespVO.java @@ -40,6 +40,29 @@ public class CustomerInfoRespVO { @ExcelProperty("所在地区") private String regionFullName; + @Schema(description = "详细地址", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("详细地址") + private String locationText; + + @Schema(description = "经度", requiredMode = Schema.RequiredMode.REQUIRED) + private BigDecimal longitude; + + @Schema(description = "纬度", requiredMode = Schema.RequiredMode.REQUIRED) + private BigDecimal latitude; + + @Schema(description = "产品ID", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("产品ID") + private String productIds; + + @Schema(description = "部门", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("部门") + @DictFormat("customer_dept") + private String department; + + @Schema(description = "静态图", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("静态图") + private String locationImage; + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("创建时间") private LocalDateTime createTime; 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 15fff17..4f30414 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 @@ -1,5 +1,8 @@ package cn.iocoder.yudao.module.visit.controller.admin.product; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.module.system.enums.common.SexEnum; +import io.swagger.v3.oas.annotations.Parameters; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -28,6 +31,7 @@ import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; import cn.iocoder.yudao.module.visit.controller.admin.product.vo.*; import cn.iocoder.yudao.module.visit.dal.dataobject.product.ProductDO; import cn.iocoder.yudao.module.visit.service.product.ProductService; +import org.springframework.web.multipart.MultipartFile; @Tag(name = "管理后台 - 产品") @RestController @@ -38,9 +42,6 @@ public class ProductController { @Resource private ProductService productService; - public ProductController(){ - System.out.println("生效"); - } @PostMapping("/create") @Operation(summary = "创建产品") @@ -96,4 +97,33 @@ public class ProductController { BeanUtils.toBean(list, ProductRespVO.class)); } + + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入品种资料模板") + public void importTemplate(HttpServletResponse response) throws IOException { + // 手动创建导出 demo + List list = Arrays.asList( + ProductImportExcelVO.builder().productName("阿莫西林胶囊").specification("20x20mg").packageName("盒装") + .status(CommonStatusEnum.ENABLE.getStatus()).build(), + ProductImportExcelVO.builder().productName("阿莫西林胶囊").specification("10x50mg").packageName("袋装") + .status(CommonStatusEnum.DISABLE.getStatus()).build() + ); + // 输出 + ExcelUtils.write(response, "品种资料导入模板.xls", "品种资料列表", ProductImportExcelVO.class, list); + } + + @PostMapping("/import") + @Operation(summary = "导入品种资料") + @Parameters({ + @Parameter(name = "file", description = "Excel 文件", required = true), + @Parameter(name = "updateSupport", description = "是否支持更新,默认为 false", example = "true") + }) + @PreAuthorize("@ss.hasPermission('system:product:import')") + public CommonResult importExcel(@RequestParam("file") MultipartFile file, + @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception { + List list = ExcelUtils.read(file, ProductImportExcelVO.class); + return success(productService.importProductList(list, updateSupport)); + } + } \ No newline at end of file diff --git a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/product/vo/ProductImportExcelVO.java b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/product/vo/ProductImportExcelVO.java new file mode 100644 index 0000000..fcd36e0 --- /dev/null +++ b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/product/vo/ProductImportExcelVO.java @@ -0,0 +1,37 @@ +package cn.iocoder.yudao.module.visit.controller.admin.product.vo; + +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * 用户 Excel 导入 VO + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题 +public class ProductImportExcelVO { + + @ExcelProperty("品种名称") + private String productName; + + @ExcelProperty("规格") + private String specification; + + @ExcelProperty("包装信息") + private String packageName; + + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.COMMON_STATUS) + private Integer status; + +} diff --git a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/product/vo/ProductImportRespVO.java b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/product/vo/ProductImportRespVO.java new file mode 100644 index 0000000..b19ec75 --- /dev/null +++ b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/controller/admin/product/vo/ProductImportRespVO.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.module.visit.controller.admin.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Schema(description = "管理后台 - 用户导入 Response VO") +@Data +@Builder +public class ProductImportRespVO { + + @Schema(description = "创建成功的品种名称数组", requiredMode = Schema.RequiredMode.REQUIRED) + private List createProductNames; + + @Schema(description = "更新成功的品种名称数组", requiredMode = Schema.RequiredMode.REQUIRED) + private List updateProductNames; + + @Schema(description = "导入失败的品种名称用户集合,key 为品种名称,value 为失败原因", requiredMode = Schema.RequiredMode.REQUIRED) + private Map failureProductNames; + +} diff --git a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/dal/mysql/product/ProductMapper.java b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/dal/mysql/product/ProductMapper.java index 403a09f..6573103 100644 --- a/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/dal/mysql/product/ProductMapper.java +++ b/yudao-module-visit/src/main/java/cn/iocoder/yudao/module/visit/dal/mysql/product/ProductMapper.java @@ -17,6 +17,10 @@ import cn.iocoder.yudao.module.visit.controller.admin.product.vo.*; @Mapper public interface ProductMapper extends BaseMapperX { + default ProductDO selectByProductParam(String productName, String specification, String packageName) { + return selectOne(ProductDO::getProductName, productName, ProductDO::getSpecification, specification, ProductDO::getPackageName, packageName); + } + default PageResult selectPage(ProductPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() .likeIfPresent(ProductDO::getProductName, reqVO.getProductName()) 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 9c49060..9a65768 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 @@ -11,6 +11,8 @@ public interface ErrorCodeConstants { // ========== 产品 ========== ErrorCode PRODUCT_NOT_EXISTS = new ErrorCode(1001000001, "产品不存在"); + ErrorCode PRODUCT_IMPORT_LIST_IS_EMPTY = new ErrorCode(1001000002, "导入产品数据不能为空!"); + ErrorCode PRODUCT_PRODUCT_EXISTS = new ErrorCode(1001000002, "导入产品已存在!"); // ========== 客户信息 ========== ErrorCode CUSTOMER_INFO_NOT_EXISTS = new ErrorCode(1002000001, "客户信息不存在"); 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 38657ea..f36e1e8 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 @@ -52,4 +52,11 @@ public interface ProductService { */ PageResult getProductPage(ProductPageReqVO pageReqVO); + /** + * 导入产品信息 + * + * @param list 分页查询 + * @return 产品分页 + */ + ProductImportRespVO importProductList(List list, Boolean updateSupport); } \ 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 a34c844..f269ae3 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 @@ -1,7 +1,15 @@ package cn.iocoder.yudao.module.visit.service.product; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.framework.common.exception.ServiceException; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils; +import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import javax.validation.ConstraintViolationException; + import org.springframework.validation.annotation.Validated; import org.springframework.transaction.annotation.Transactional; @@ -15,6 +23,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.visit.dal.mysql.product.ProductMapper; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.module.visit.enums.ErrorCodeConstants.*; /** @@ -71,4 +80,47 @@ public class ProductServiceImpl implements ProductService { return productMapper.selectPage(pageReqVO); } + @Override + @Transactional(rollbackFor = Exception.class) // 添加事务,异常则回滚所有导入 + public ProductImportRespVO importProductList(List importProducts, Boolean isUpdateSupport) { + // 1 参数校验 + if (CollUtil.isEmpty(importProducts)) { + throw exception(PRODUCT_IMPORT_LIST_IS_EMPTY); + } + + // 2. 遍历,逐个创建 or 更新 + ProductImportRespVO respVO = ProductImportRespVO.builder().createProductNames(new ArrayList<>()) + .updateProductNames(new ArrayList<>()).failureProductNames(new LinkedHashMap<>()).build(); + importProducts.forEach(importProduct -> { + + // 2.1.1 校验,判断是否有不符合的原因 + try { + validateProductUnique(importProduct.getProductName(), importProduct.getSpecification(), importProduct.getPackageName()); + } catch (ServiceException ex) { + respVO.getFailureProductNames().put(importProduct.getProductName()+importProduct.getSpecification()+importProduct.getPackageName(), ex.getMessage()); + return; + } + + // 2.2.1 判断如果不存在,在进行插入 + ProductDO existProduct = productMapper.selectByProductParam(importProduct.getProductName(),importProduct.getSpecification(), importProduct.getPackageName()); + if (existProduct == null) { + productMapper.insert(BeanUtils.toBean(importProduct, ProductDO.class)); + respVO.getCreateProductNames().add(importProduct.getProductName()+importProduct.getSpecification()+importProduct.getPackageName()); + } + }); + return respVO; + } + + + private void validateProductUnique(String productName, String specification, String packageName) { + ProductPageReqVO productPageReqVO = new ProductPageReqVO(); + productPageReqVO.setProductName(productName); + productPageReqVO.setSpecification(specification); + productPageReqVO.setPackageName(packageName); + PageResult productDOPageResult = productMapper.selectPage(productPageReqVO); + if (productDOPageResult.getTotal() > 0) { + throw exception(PRODUCT_PRODUCT_EXISTS); + } + } + } \ No newline at end of file diff --git a/yudao-ui/yudao-ui-admin-vue3/package-lock.json b/yudao-ui/yudao-ui-admin-vue3/package-lock.json index ffe3a6d..15800d7 100644 --- a/yudao-ui/yudao-ui-admin-vue3/package-lock.json +++ b/yudao-ui/yudao-ui-admin-vue3/package-lock.json @@ -31,6 +31,7 @@ "driver.js": "^1.3.1", "echarts": "^5.5.0", "echarts-wordcloud": "^2.1.0", + "element-china-area-data": "^6.1.0", "element-plus": "2.9.1", "fast-xml-parser": "^4.3.2", "highlight.js": "^11.9.0", @@ -7943,6 +7944,11 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/china-division": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/china-division/-/china-division-2.7.0.tgz", + "integrity": "sha512-4uUPAT+1WfqDh5jytq7omdCmHNk3j+k76zEG/2IqaGcYB90c2SwcixttcypdsZ3T/9tN1TTpBDoeZn+Yw/qBEA==" + }, "node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -9423,6 +9429,14 @@ "dev": true, "license": "ISC" }, + "node_modules/element-china-area-data": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/element-china-area-data/-/element-china-area-data-6.1.0.tgz", + "integrity": "sha512-IkpcjwQv2A/2AxFiSoaISZ+oMw1rZCPUSOg5sOCwT5jKc96TaawmKZeY81xfxXsO0QbKxU5LLc6AirhG52hUmg==", + "dependencies": { + "china-division": "^2.7.0" + } + }, "node_modules/element-plus": { "version": "2.9.1", "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.9.1.tgz", diff --git a/yudao-ui/yudao-ui-admin-vue3/package.json b/yudao-ui/yudao-ui-admin-vue3/package.json index 307b915..8aa2b56 100644 --- a/yudao-ui/yudao-ui-admin-vue3/package.json +++ b/yudao-ui/yudao-ui-admin-vue3/package.json @@ -47,6 +47,7 @@ "driver.js": "^1.3.1", "echarts": "^5.5.0", "echarts-wordcloud": "^2.1.0", + "element-china-area-data": "^6.1.0", "element-plus": "2.9.1", "fast-xml-parser": "^4.3.2", "highlight.js": "^11.9.0", 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 51dea71..ea00260 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 @@ -40,4 +40,9 @@ export const ProductApi = { exportProduct: async (params) => { return await request.download({ url: `/visit/product/export-excel`, params }) }, + + // 下载产品信息导入模板 + importProductTemplate: async () => { + return await request.download({ url: '/visit/product/get-import-template' }) + } } diff --git a/yudao-ui/yudao-ui-admin-vue3/src/views/system/user/index.vue b/yudao-ui/yudao-ui-admin-vue3/src/views/system/user/index.vue index 7694494..a868886 100644 --- a/yudao-ui/yudao-ui-admin-vue3/src/views/system/user/index.vue +++ b/yudao-ui/yudao-ui-admin-vue3/src/views/system/user/index.vue @@ -70,14 +70,14 @@ > 新增 - - - - - - - - + + 导入 + 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 78d4987..abbb283 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 @@ -26,30 +26,49 @@ /> - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + + + @@ -73,7 +92,7 @@ \ No newline at end of file + diff --git a/yudao-ui/yudao-ui-admin-vue3/src/views/visit/product/ProductImportForm.vue b/yudao-ui/yudao-ui-admin-vue3/src/views/visit/product/ProductImportForm.vue new file mode 100644 index 0000000..aa11235 --- /dev/null +++ b/yudao-ui/yudao-ui-admin-vue3/src/views/visit/product/ProductImportForm.vue @@ -0,0 +1,134 @@ + + diff --git a/yudao-ui/yudao-ui-admin-vue3/src/views/visit/product/index.vue b/yudao-ui/yudao-ui-admin-vue3/src/views/visit/product/index.vue index b25762d..2a5e803 100644 --- a/yudao-ui/yudao-ui-admin-vue3/src/views/visit/product/index.vue +++ b/yudao-ui/yudao-ui-admin-vue3/src/views/visit/product/index.vue @@ -72,6 +72,14 @@ > 新增 + + 导入 + + + -- 2.22.0