From d40544208678066d51d0ce6d9e73ddf6ddd73a56 Mon Sep 17 00:00:00 2001 From: tengxi <971623072@qq.com> Date: Mon, 21 Aug 2023 10:22:44 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=A2=E6=88=B7=E4=BF=A1=E6=81=AF=E7=AE=A1?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/customer/CustomerController.java | 102 ++++++++ .../admin/customer/vo/CustomerBaseVO.java | 46 ++++ .../customer/vo/CustomerCreateReqVO.java | 14 ++ .../admin/customer/vo/CustomerExcelVO.java | 52 ++++ .../customer/vo/CustomerExportReqVO.java | 48 ++++ .../admin/customer/vo/CustomerPageReqVO.java | 50 ++++ .../admin/customer/vo/CustomerRespVO.java | 22 ++ .../customer/vo/CustomerUpdateReqVO.java | 18 ++ .../convert/customer/CustomerConvert.java | 34 +++ .../dal/dataobject/customer/CustomerDO.java | 63 +++++ .../dal/mysql/customer/CustomerMapper.java | 50 ++++ .../service/customer/CustomerService.java | 70 ++++++ .../mapper/customer/CustomerMapper.xml | 12 + .../customer/CustomerServiceImplTest.java | 223 ++++++++++++++++++ yunxi-ui-admin/src/api/xxjj/customer.js | 54 +++++ 15 files changed, 858 insertions(+) create mode 100644 yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/CustomerController.java create mode 100644 yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/vo/CustomerBaseVO.java create mode 100644 yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/vo/CustomerCreateReqVO.java create mode 100644 yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/vo/CustomerExcelVO.java create mode 100644 yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/vo/CustomerExportReqVO.java create mode 100644 yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/vo/CustomerPageReqVO.java create mode 100644 yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/vo/CustomerRespVO.java create mode 100644 yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/vo/CustomerUpdateReqVO.java create mode 100644 yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/convert/customer/CustomerConvert.java create mode 100644 yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/dal/dataobject/customer/CustomerDO.java create mode 100644 yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/dal/mysql/customer/CustomerMapper.java create mode 100644 yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/service/customer/CustomerService.java create mode 100644 yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/resources/mapper/customer/CustomerMapper.xml create mode 100644 yunxi-module-xxjj/yunxi-module-xxjj-biz/src/test/java/com/yunxi/scm/module/xxjj/service/customer/CustomerServiceImplTest.java create mode 100644 yunxi-ui-admin/src/api/xxjj/customer.js diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/CustomerController.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/CustomerController.java new file mode 100644 index 0000000..1d79307 --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/CustomerController.java @@ -0,0 +1,102 @@ +package com.yunxi.scm.module.xxjj.controller.admin.customer; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.yunxi.scm.framework.common.pojo.PageResult; +import com.yunxi.scm.framework.common.pojo.CommonResult; +import static com.yunxi.scm.framework.common.pojo.CommonResult.success; + +import com.yunxi.scm.framework.excel.core.util.ExcelUtils; + +import com.yunxi.scm.framework.operatelog.core.annotations.OperateLog; +import static com.yunxi.scm.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.yunxi.scm.module.xxjj.controller.admin.customer.vo.*; +import com.yunxi.scm.module.xxjj.dal.dataobject.customer.CustomerDO; +import com.yunxi.scm.module.xxjj.convert.customer.CustomerConvert; +import com.yunxi.scm.module.xxjj.service.customer.CustomerService; + +@Tag(name = "管理后台 - 客户信息") +@RestController +@RequestMapping("/xxjj/customer") +@Validated +public class CustomerController { + + @Resource + private CustomerService customerService; + + @PostMapping("/create") + @Operation(summary = "创建客户信息") + @PreAuthorize("@ss.hasPermission('xxjj:customer:create')") + public CommonResult createCustomer(@Valid @RequestBody CustomerCreateReqVO createReqVO) { + return success(customerService.createCustomer(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新客户信息") + @PreAuthorize("@ss.hasPermission('xxjj:customer:update')") + public CommonResult updateCustomer(@Valid @RequestBody CustomerUpdateReqVO updateReqVO) { + customerService.updateCustomer(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除客户信息") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('xxjj:customer:delete')") + public CommonResult deleteCustomer(@RequestParam("id") Long id) { + customerService.deleteCustomer(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得客户信息") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('xxjj:customer:query')") + public CommonResult getCustomer(@RequestParam("id") Long id) { + CustomerDO customer = customerService.getCustomer(id); + return success(CustomerConvert.INSTANCE.convert(customer)); + } + + @GetMapping("/list") + @Operation(summary = "获得客户信息列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('xxjj:customer:query')") + public CommonResult> getCustomerList(@RequestParam("ids") Collection ids) { + List list = customerService.getCustomerList(ids); + return success(CustomerConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得客户信息分页") + @PreAuthorize("@ss.hasPermission('xxjj:customer:query')") + public CommonResult> getCustomerPage(@Valid CustomerPageReqVO pageVO) { + PageResult pageResult = customerService.getCustomerPage(pageVO); + return success(CustomerConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出客户信息 Excel") + @PreAuthorize("@ss.hasPermission('xxjj:customer:export')") + @OperateLog(type = EXPORT) + public void exportCustomerExcel(@Valid CustomerExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = customerService.getCustomerList(exportReqVO); + // 导出 Excel + List datas = CustomerConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "客户信息.xls", "数据", CustomerExcelVO.class, datas); + } + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/vo/CustomerBaseVO.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/vo/CustomerBaseVO.java new file mode 100644 index 0000000..4809efa --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/vo/CustomerBaseVO.java @@ -0,0 +1,46 @@ +package com.yunxi.scm.module.xxjj.controller.admin.customer.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import javax.validation.constraints.*; + +/** + * 客户信息 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class CustomerBaseVO { + + @Schema(description = "客户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") + @NotNull(message = "客户名称不能为空") + private String customerName; + + @Schema(description = "客户类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotNull(message = "客户类型不能为空") + private String customerType; + + @Schema(description = "统一结算主体") + private String unifiedSettlement; + + @Schema(description = "客户性质", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "客户性质不能为空") + private String customerNature; + + @Schema(description = "合作模式", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "合作模式不能为空") + private String cooperationMode; + + @Schema(description = "隶属业务线", example = "22944") + private Long linebusinessId; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotNull(message = "状态不能为空") + private String status; + + @Schema(description = "归属人员") + private String belongingPeople; + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/vo/CustomerCreateReqVO.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/vo/CustomerCreateReqVO.java new file mode 100644 index 0000000..6dd7b0e --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/vo/CustomerCreateReqVO.java @@ -0,0 +1,14 @@ +package com.yunxi.scm.module.xxjj.controller.admin.customer.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 客户信息创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CustomerCreateReqVO extends CustomerBaseVO { + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/vo/CustomerExcelVO.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/vo/CustomerExcelVO.java new file mode 100644 index 0000000..bba3ae7 --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/vo/CustomerExcelVO.java @@ -0,0 +1,52 @@ +package com.yunxi.scm.module.xxjj.controller.admin.customer.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 客户信息 Excel VO + * + * @author 芋道源码 + */ +@Data +public class CustomerExcelVO { + + @ExcelProperty("编号") + private Long id; + + @ExcelProperty("客户名称") + private String customerName; + + @ExcelProperty("客户类型") + private String customerType; + + @ExcelProperty("统一结算主体") + private String unifiedSettlement; + + @ExcelProperty("客户性质") + private String customerNature; + + @ExcelProperty("合作模式") + private String cooperationMode; + + @ExcelProperty("隶属业务线") + private Long linebusinessId; + + @ExcelProperty("状态") + private String status; + + @ExcelProperty("归属人员") + private String belongingPeople; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("更新时间") + private LocalDateTime updateTime; + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/vo/CustomerExportReqVO.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/vo/CustomerExportReqVO.java new file mode 100644 index 0000000..9a0104e --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/vo/CustomerExportReqVO.java @@ -0,0 +1,48 @@ +package com.yunxi.scm.module.xxjj.controller.admin.customer.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.yunxi.scm.framework.common.pojo.PageParam; +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.yunxi.scm.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 客户信息 Excel 导出 Request VO,参数和 CustomerPageReqVO 是一致的") +@Data +public class CustomerExportReqVO { + + @Schema(description = "客户名称", example = "赵六") + private String customerName; + + @Schema(description = "客户类型", example = "2") + private String customerType; + + @Schema(description = "统一结算主体") + private String unifiedSettlement; + + @Schema(description = "客户性质") + private String customerNature; + + @Schema(description = "合作模式") + private String cooperationMode; + + @Schema(description = "隶属业务线", example = "22944") + private Long linebusinessId; + + @Schema(description = "状态", example = "2") + private String status; + + @Schema(description = "归属人员") + private String belongingPeople; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "更新时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] updateTime; + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/vo/CustomerPageReqVO.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/vo/CustomerPageReqVO.java new file mode 100644 index 0000000..298eb11 --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/vo/CustomerPageReqVO.java @@ -0,0 +1,50 @@ +package com.yunxi.scm.module.xxjj.controller.admin.customer.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.yunxi.scm.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static com.yunxi.scm.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 客户信息分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CustomerPageReqVO extends PageParam { + + @Schema(description = "客户名称", example = "赵六") + private String customerName; + + @Schema(description = "客户类型", example = "2") + private String customerType; + + @Schema(description = "统一结算主体") + private String unifiedSettlement; + + @Schema(description = "客户性质") + private String customerNature; + + @Schema(description = "合作模式") + private String cooperationMode; + + @Schema(description = "隶属业务线", example = "22944") + private Long linebusinessId; + + @Schema(description = "状态", example = "2") + private String status; + + @Schema(description = "归属人员") + private String belongingPeople; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "更新时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] updateTime; + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/vo/CustomerRespVO.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/vo/CustomerRespVO.java new file mode 100644 index 0000000..a822035 --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/vo/CustomerRespVO.java @@ -0,0 +1,22 @@ +package com.yunxi.scm.module.xxjj.controller.admin.customer.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 客户信息 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CustomerRespVO extends CustomerBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "7245") + private Long id; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + + @Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime updateTime; + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/vo/CustomerUpdateReqVO.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/vo/CustomerUpdateReqVO.java new file mode 100644 index 0000000..2d0756e --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/controller/admin/customer/vo/CustomerUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.yunxi.scm.module.xxjj.controller.admin.customer.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 客户信息更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CustomerUpdateReqVO extends CustomerBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "7245") + @NotNull(message = "编号不能为空") + private Long id; + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/convert/customer/CustomerConvert.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/convert/customer/CustomerConvert.java new file mode 100644 index 0000000..ef7ecc6 --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/convert/customer/CustomerConvert.java @@ -0,0 +1,34 @@ +package com.yunxi.scm.module.xxjj.convert.customer; + +import java.util.*; + +import com.yunxi.scm.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.yunxi.scm.module.xxjj.controller.admin.customer.vo.*; +import com.yunxi.scm.module.xxjj.dal.dataobject.customer.CustomerDO; + +/** + * 客户信息 Convert + * + * @author 芋道源码 + */ +@Mapper +public interface CustomerConvert { + + CustomerConvert INSTANCE = Mappers.getMapper(CustomerConvert.class); + + CustomerDO convert(CustomerCreateReqVO bean); + + CustomerDO convert(CustomerUpdateReqVO bean); + + CustomerRespVO convert(CustomerDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/dal/dataobject/customer/CustomerDO.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/dal/dataobject/customer/CustomerDO.java new file mode 100644 index 0000000..ec79801 --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/dal/dataobject/customer/CustomerDO.java @@ -0,0 +1,63 @@ +package com.yunxi.scm.module.xxjj.dal.dataobject.customer; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.yunxi.scm.framework.mybatis.core.dataobject.BaseDO; + +/** + * 客户信息 DO + * + * @author 芋道源码 + */ +@TableName("xxjj_customer") +@KeySequence("xxjj_customer_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CustomerDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 客户名称 + */ + private String customerName; + /** + * 客户类型 + */ + private String customerType; + /** + * 统一结算主体 + */ + private String unifiedSettlement; + /** + * 客户性质 + */ + private String customerNature; + /** + * 合作模式 + */ + private String cooperationMode; + /** + * 隶属业务线 + */ + private Long linebusinessId; + /** + * 状态 + */ + private String status; + /** + * 归属人员 + */ + private String belongingPeople; + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/dal/mysql/customer/CustomerMapper.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/dal/mysql/customer/CustomerMapper.java new file mode 100644 index 0000000..d047c0a --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/dal/mysql/customer/CustomerMapper.java @@ -0,0 +1,50 @@ +package com.yunxi.scm.module.xxjj.dal.mysql.customer; + +import java.util.*; + +import com.yunxi.scm.framework.common.pojo.PageResult; +import com.yunxi.scm.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.yunxi.scm.framework.mybatis.core.mapper.BaseMapperX; +import com.yunxi.scm.module.xxjj.dal.dataobject.customer.CustomerDO; +import org.apache.ibatis.annotations.Mapper; +import com.yunxi.scm.module.xxjj.controller.admin.customer.vo.*; + +/** + * 客户信息 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface CustomerMapper extends BaseMapperX { + + default PageResult selectPage(CustomerPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(CustomerDO::getCustomerName, reqVO.getCustomerName()) + .eqIfPresent(CustomerDO::getCustomerType, reqVO.getCustomerType()) + .eqIfPresent(CustomerDO::getUnifiedSettlement, reqVO.getUnifiedSettlement()) + .eqIfPresent(CustomerDO::getCustomerNature, reqVO.getCustomerNature()) + .eqIfPresent(CustomerDO::getCooperationMode, reqVO.getCooperationMode()) + .eqIfPresent(CustomerDO::getLinebusinessId, reqVO.getLinebusinessId()) + .eqIfPresent(CustomerDO::getStatus, reqVO.getStatus()) + .eqIfPresent(CustomerDO::getBelongingPeople, reqVO.getBelongingPeople()) + .betweenIfPresent(CustomerDO::getCreateTime, reqVO.getCreateTime()) + .betweenIfPresent(CustomerDO::getUpdateTime, reqVO.getUpdateTime()) + .orderByDesc(CustomerDO::getId)); + } + + default List selectList(CustomerExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(CustomerDO::getCustomerName, reqVO.getCustomerName()) + .eqIfPresent(CustomerDO::getCustomerType, reqVO.getCustomerType()) + .eqIfPresent(CustomerDO::getUnifiedSettlement, reqVO.getUnifiedSettlement()) + .eqIfPresent(CustomerDO::getCustomerNature, reqVO.getCustomerNature()) + .eqIfPresent(CustomerDO::getCooperationMode, reqVO.getCooperationMode()) + .eqIfPresent(CustomerDO::getLinebusinessId, reqVO.getLinebusinessId()) + .eqIfPresent(CustomerDO::getStatus, reqVO.getStatus()) + .eqIfPresent(CustomerDO::getBelongingPeople, reqVO.getBelongingPeople()) + .betweenIfPresent(CustomerDO::getCreateTime, reqVO.getCreateTime()) + .betweenIfPresent(CustomerDO::getUpdateTime, reqVO.getUpdateTime()) + .orderByDesc(CustomerDO::getId)); + } + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/service/customer/CustomerService.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/service/customer/CustomerService.java new file mode 100644 index 0000000..3b1aab7 --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/java/com/yunxi/scm/module/xxjj/service/customer/CustomerService.java @@ -0,0 +1,70 @@ +package com.yunxi.scm.module.xxjj.service.customer; + +import java.util.*; +import javax.validation.*; +import com.yunxi.scm.module.xxjj.controller.admin.customer.vo.*; +import com.yunxi.scm.module.xxjj.dal.dataobject.customer.CustomerDO; +import com.yunxi.scm.framework.common.pojo.PageResult; + +/** + * 客户信息 Service 接口 + * + * @author 芋道源码 + */ +public interface CustomerService { + + /** + * 创建客户信息 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createCustomer(@Valid CustomerCreateReqVO createReqVO); + + /** + * 更新客户信息 + * + * @param updateReqVO 更新信息 + */ + void updateCustomer(@Valid CustomerUpdateReqVO updateReqVO); + + /** + * 删除客户信息 + * + * @param id 编号 + */ + void deleteCustomer(Long id); + + /** + * 获得客户信息 + * + * @param id 编号 + * @return 客户信息 + */ + CustomerDO getCustomer(Long id); + + /** + * 获得客户信息列表 + * + * @param ids 编号 + * @return 客户信息列表 + */ + List getCustomerList(Collection ids); + + /** + * 获得客户信息分页 + * + * @param pageReqVO 分页查询 + * @return 客户信息分页 + */ + PageResult getCustomerPage(CustomerPageReqVO pageReqVO); + + /** + * 获得客户信息列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 客户信息列表 + */ + List getCustomerList(CustomerExportReqVO exportReqVO); + +} diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/resources/mapper/customer/CustomerMapper.xml b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/resources/mapper/customer/CustomerMapper.xml new file mode 100644 index 0000000..6f5b3b5 --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/main/resources/mapper/customer/CustomerMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/test/java/com/yunxi/scm/module/xxjj/service/customer/CustomerServiceImplTest.java b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/test/java/com/yunxi/scm/module/xxjj/service/customer/CustomerServiceImplTest.java new file mode 100644 index 0000000..564009d --- /dev/null +++ b/yunxi-module-xxjj/yunxi-module-xxjj-biz/src/test/java/com/yunxi/scm/module/xxjj/service/customer/CustomerServiceImplTest.java @@ -0,0 +1,223 @@ +package com.yunxi.scm.module.xxjj.service.customer; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import com.yunxi.scm.framework.test.core.ut.BaseDbUnitTest; + +import com.yunxi.scm.module.xxjj.controller.admin.customer.vo.*; +import com.yunxi.scm.module.xxjj.dal.dataobject.customer.CustomerDO; +import com.yunxi.scm.module.xxjj.dal.mysql.customer.CustomerMapper; +import com.yunxi.scm.framework.common.pojo.PageResult; + +import javax.annotation.Resource; +import org.springframework.context.annotation.Import; +import java.util.*; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.*; +import static com.yunxi.scm.module.xxjj.enums.ErrorCodeConstants.*; +import static com.yunxi.scm.framework.test.core.util.AssertUtils.*; +import static com.yunxi.scm.framework.test.core.util.RandomUtils.*; +import static com.yunxi.scm.framework.common.util.date.LocalDateTimeUtils.*; +import static com.yunxi.scm.framework.common.util.object.ObjectUtils.*; +import static com.yunxi.scm.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** + * {@link CustomerServiceImpl} 的单元测试类 + * + * @author 芋道源码 + */ +@Import(CustomerServiceImpl.class) +public class CustomerServiceImplTest extends BaseDbUnitTest { + + @Resource + private CustomerServiceImpl customerService; + + @Resource + private CustomerMapper customerMapper; + + @Test + public void testCreateCustomer_success() { + // 准备参数 + CustomerCreateReqVO reqVO = randomPojo(CustomerCreateReqVO.class); + + // 调用 + Long customerId = customerService.createCustomer(reqVO); + // 断言 + assertNotNull(customerId); + // 校验记录的属性是否正确 + CustomerDO customer = customerMapper.selectById(customerId); + assertPojoEquals(reqVO, customer); + } + + @Test + public void testUpdateCustomer_success() { + // mock 数据 + CustomerDO dbCustomer = randomPojo(CustomerDO.class); + customerMapper.insert(dbCustomer);// @Sql: 先插入出一条存在的数据 + // 准备参数 + CustomerUpdateReqVO reqVO = randomPojo(CustomerUpdateReqVO.class, o -> { + o.setId(dbCustomer.getId()); // 设置更新的 ID + }); + + // 调用 + customerService.updateCustomer(reqVO); + // 校验是否更新正确 + CustomerDO customer = customerMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, customer); + } + + @Test + public void testUpdateCustomer_notExists() { + // 准备参数 + CustomerUpdateReqVO reqVO = randomPojo(CustomerUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> customerService.updateCustomer(reqVO), CUSTOMER_NOT_EXISTS); + } + + @Test + public void testDeleteCustomer_success() { + // mock 数据 + CustomerDO dbCustomer = randomPojo(CustomerDO.class); + customerMapper.insert(dbCustomer);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbCustomer.getId(); + + // 调用 + customerService.deleteCustomer(id); + // 校验数据不存在了 + assertNull(customerMapper.selectById(id)); + } + + @Test + public void testDeleteCustomer_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> customerService.deleteCustomer(id), CUSTOMER_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetCustomerPage() { + // mock 数据 + CustomerDO dbCustomer = randomPojo(CustomerDO.class, o -> { // 等会查询到 + o.setCustomerName(null); + o.setCustomerType(null); + o.setUnifiedSettlement(null); + o.setCustomerNature(null); + o.setCooperationMode(null); + o.setLinebusinessId(null); + o.setStatus(null); + o.setBelongingPeople(null); + o.setCreateTime(null); + o.setUpdateTime(null); + }); + customerMapper.insert(dbCustomer); + // 测试 customerName 不匹配 + customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setCustomerName(null))); + // 测试 customerType 不匹配 + customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setCustomerType(null))); + // 测试 unifiedSettlement 不匹配 + customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setUnifiedSettlement(null))); + // 测试 customerNature 不匹配 + customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setCustomerNature(null))); + // 测试 cooperationMode 不匹配 + customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setCooperationMode(null))); + // 测试 linebusinessId 不匹配 + customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setLinebusinessId(null))); + // 测试 status 不匹配 + customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setStatus(null))); + // 测试 belongingPeople 不匹配 + customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setBelongingPeople(null))); + // 测试 createTime 不匹配 + customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setCreateTime(null))); + // 测试 updateTime 不匹配 + customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setUpdateTime(null))); + // 准备参数 + CustomerPageReqVO reqVO = new CustomerPageReqVO(); + reqVO.setCustomerName(null); + reqVO.setCustomerType(null); + reqVO.setUnifiedSettlement(null); + reqVO.setCustomerNature(null); + reqVO.setCooperationMode(null); + reqVO.setLinebusinessId(null); + reqVO.setStatus(null); + reqVO.setBelongingPeople(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setUpdateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + PageResult pageResult = customerService.getCustomerPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbCustomer, pageResult.getList().get(0)); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetCustomerList() { + // mock 数据 + CustomerDO dbCustomer = randomPojo(CustomerDO.class, o -> { // 等会查询到 + o.setCustomerName(null); + o.setCustomerType(null); + o.setUnifiedSettlement(null); + o.setCustomerNature(null); + o.setCooperationMode(null); + o.setLinebusinessId(null); + o.setStatus(null); + o.setBelongingPeople(null); + o.setCreateTime(null); + o.setUpdateTime(null); + }); + customerMapper.insert(dbCustomer); + // 测试 customerName 不匹配 + customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setCustomerName(null))); + // 测试 customerType 不匹配 + customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setCustomerType(null))); + // 测试 unifiedSettlement 不匹配 + customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setUnifiedSettlement(null))); + // 测试 customerNature 不匹配 + customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setCustomerNature(null))); + // 测试 cooperationMode 不匹配 + customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setCooperationMode(null))); + // 测试 linebusinessId 不匹配 + customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setLinebusinessId(null))); + // 测试 status 不匹配 + customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setStatus(null))); + // 测试 belongingPeople 不匹配 + customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setBelongingPeople(null))); + // 测试 createTime 不匹配 + customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setCreateTime(null))); + // 测试 updateTime 不匹配 + customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setUpdateTime(null))); + // 准备参数 + CustomerExportReqVO reqVO = new CustomerExportReqVO(); + reqVO.setCustomerName(null); + reqVO.setCustomerType(null); + reqVO.setUnifiedSettlement(null); + reqVO.setCustomerNature(null); + reqVO.setCooperationMode(null); + reqVO.setLinebusinessId(null); + reqVO.setStatus(null); + reqVO.setBelongingPeople(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setUpdateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + List list = customerService.getCustomerList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbCustomer, list.get(0)); + } + +} diff --git a/yunxi-ui-admin/src/api/xxjj/customer.js b/yunxi-ui-admin/src/api/xxjj/customer.js new file mode 100644 index 0000000..45f2499 --- /dev/null +++ b/yunxi-ui-admin/src/api/xxjj/customer.js @@ -0,0 +1,54 @@ +import request from '@/utils/request' + +// 创建客户信息 +export function createCustomer(data) { + return request({ + url: '/xxjj/customer/create', + method: 'post', + data: data + }) +} + +// 更新客户信息 +export function updateCustomer(data) { + return request({ + url: '/xxjj/customer/update', + method: 'put', + data: data + }) +} + +// 删除客户信息 +export function deleteCustomer(id) { + return request({ + url: '/xxjj/customer/delete?id=' + id, + method: 'delete' + }) +} + +// 获得客户信息 +export function getCustomer(id) { + return request({ + url: '/xxjj/customer/get?id=' + id, + method: 'get' + }) +} + +// 获得客户信息分页 +export function getCustomerPage(query) { + return request({ + url: '/xxjj/customer/page', + method: 'get', + params: query + }) +} + +// 导出客户信息 Excel +export function exportCustomerExcel(query) { + return request({ + url: '/xxjj/customer/export-excel', + method: 'get', + params: query, + responseType: 'blob' + }) +}