diff --git a/pom.xml b/pom.xml index 90d14e3..39049cb 100644 --- a/pom.xml +++ b/pom.xml @@ -362,6 +362,11 @@ pusong-demo ${revision} + + com.pusong + pusong-business + ${revision} + diff --git a/pusong-admin/pom.xml b/pusong-admin/pom.xml index 3efb682..2b5555a 100644 --- a/pusong-admin/pom.xml +++ b/pusong-admin/pom.xml @@ -79,7 +79,11 @@ com.pusong pusong-demo - + + + com.pusong + pusong-business + com.pusong diff --git a/pusong-modules/pom.xml b/pusong-modules/pom.xml index 25eb098..253dc76 100644 --- a/pusong-modules/pom.xml +++ b/pusong-modules/pom.xml @@ -15,6 +15,7 @@ pusong-job pusong-system pusong-workflow + pusong-business pusong-modules diff --git a/pusong-modules/pusong-business/pom.xml b/pusong-modules/pusong-business/pom.xml new file mode 100644 index 0000000..fc02bf6 --- /dev/null +++ b/pusong-modules/pusong-business/pom.xml @@ -0,0 +1,108 @@ + + + + com.pusong + pusong-modules + ${revision} + + 4.0.0 + + pusong-business + + + 主要业务模块 + + + + + + + com.pusong + pusong-common-core + + + + com.pusong + pusong-common-doc + + + + + + + + com.pusong + pusong-common-redis + + + + com.pusong + pusong-common-idempotent + + + + com.pusong + pusong-common-mybatis + + + + com.pusong + pusong-common-log + + + + com.pusong + pusong-common-excel + + + + com.pusong + pusong-common-security + + + + com.pusong + pusong-common-web + + + + + + com.pusong + pusong-common-translation + + + + com.pusong + pusong-common-sensitive + + + + com.pusong + pusong-common-encrypt + + + + com.pusong + pusong-common-tenant + + + + com.pusong + pusong-common-websocket + + + + + diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/controller/PsCustomController.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/controller/PsCustomController.java new file mode 100644 index 0000000..94b6838 --- /dev/null +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/controller/PsCustomController.java @@ -0,0 +1,124 @@ +package com.pusong.business.controller; + +import java.util.List; + +import com.pusong.business.domain.bo.PsCustomCallbackBo; +import com.pusong.business.domain.bo.PsCustomPriceBo; +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import com.pusong.common.idempotent.annotation.RepeatSubmit; +import com.pusong.common.log.annotation.Log; +import com.pusong.common.web.core.BaseController; +import com.pusong.common.mybatis.core.page.PageQuery; +import com.pusong.common.core.domain.R; +import com.pusong.common.core.validate.AddGroup; +import com.pusong.common.core.validate.EditGroup; +import com.pusong.common.log.enums.BusinessType; +import com.pusong.common.excel.utils.ExcelUtil; +import com.pusong.business.domain.vo.PsCustomInfoVo; +import com.pusong.business.domain.bo.PsCustomInfoBo; +import com.pusong.business.service.IPsCustomInfoService; +import com.pusong.common.mybatis.core.page.TableDataInfo; + +/** + * 客户基本信息 + * + * @author Lion Li + * @date 2024-07-25 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/business/customInfo") +public class PsCustomController extends BaseController { + + private final IPsCustomInfoService psCustomInfoService; + /** + * 查询登陆人下所有的客户名称和id + */ + @SaCheckPermission("business:customInfo:list") + @GetMapping("/listByLoginUser") + public R> listByLoginUser() { + return R.ok(psCustomInfoService.listByLoginUser()); + } + /** + * 查询客户信息列表 + */ + @SaCheckPermission("business:customInfo:list") + @GetMapping("/list") + public TableDataInfo list(PsCustomInfoBo bo, PageQuery pageQuery) { + return psCustomInfoService.queryPageList(bo, pageQuery); + } + /** + * 新增客户基本信息 + */ + @SaCheckPermission("business:customInfo:add") + @Log(title = "新增客户基本信息", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody PsCustomInfoBo bo) { + return toAjax(psCustomInfoService.insertByBo(bo)); + } + + /** + * 修改客户基本信息 + */ + @SaCheckPermission("business:customInfo:edit") + @Log(title = "客户基本信息", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody PsCustomInfoBo bo) { + return toAjax(psCustomInfoService.updateByBo(bo)); + } + + /** + * 新增客户报价金额 + */ + @SaCheckPermission("business:customInfo:edit") + @Log(title = "新增客户报价金额", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/insertPrice") + public R insertPrice(@Validated(AddGroup.class) @RequestBody List bos) { + return toAjax(psCustomInfoService.insertPiceByBo(bos)); + } + /** + * 新增客户回访记录 + */ + @SaCheckPermission("business:customInfo:edit") + @Log(title = "新增客户回访记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/insertCallback") + public R insertCallback(@Validated(AddGroup.class) @RequestBody List bos) { + return toAjax(psCustomInfoService.insertCallbackByBo(bos)); + } + + /** + * 状态变更 + * + * @param id 主键串 + * @param type 操作类型 1移入公海 2拉黑 + */ + @SaCheckPermission("business:customInfo:edit") + @Log(title = "客户状态变更操作", businessType = BusinessType.UPDATE) + @PostMapping("/updateStatus") + public R updateStatus(@NotEmpty(message = "主键不能为空") @PathVariable Long id, + @NotEmpty(message = "操作类型不能为空") @PathVariable Integer type) { + return toAjax(psCustomInfoService.updateCustomerStatus(id, type)); + } + + /** + * 导出客户基本信息列表 + */ + @SaCheckPermission("business:customInfo:export") + @Log(title = "客户基本信息", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(PsCustomInfoBo bo, HttpServletResponse response) { + List list = psCustomInfoService.queryList(bo); + ExcelUtil.exportExcel(list, "客户基本信息", PsCustomInfoVo.class, response); + } + +} diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/controller/package-info.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/controller/package-info.java new file mode 100644 index 0000000..16807da --- /dev/null +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/controller/package-info.java @@ -0,0 +1 @@ +package com.pusong.business.controller; diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/PsCustomCallback.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/PsCustomCallback.java new file mode 100644 index 0000000..ee8e5ba --- /dev/null +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/PsCustomCallback.java @@ -0,0 +1,51 @@ +package com.pusong.business.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.pusong.common.tenant.core.TenantEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.math.BigDecimal; + +/** + * 客户基本信息对象 ps_custom_info + * + * @author Lion Li + * @date 2024-07-25 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("ps_custom_callback") +public class PsCustomCallback extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + + /** + * 客户id + */ + private Long customId; + + /** + * 回访内容 + */ + private String callbackContent; + + /** + * 2逻辑删除 0 默认有效 + */ + @TableLogic + private Integer delFlag; + + +} diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/PsCustomInfo.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/PsCustomInfo.java new file mode 100644 index 0000000..e15ebf5 --- /dev/null +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/PsCustomInfo.java @@ -0,0 +1,83 @@ +package com.pusong.business.domain; + +import com.pusong.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 客户基本信息对象 ps_custom_info + * + * @author Lion Li + * @date 2024-07-25 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("ps_custom_info") +public class PsCustomInfo extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + + /** + * 客户名称 + */ + private String customName; + + /** + * 客户电话客户电话(多个用英文逗号分割) + */ + private String customMobile; + + /** + * 客户来源 + */ + private String customSource; + + /** + * 客户联系地址 + */ + private String customAdressDetail; + + /** + * 所属客户经理 + */ + private Long customManager; + + /** + * 客户级别 + */ + private String customLevel; + + /** + * 客户状态 + */ + private String customStatus; + + /** + * 介绍人-仅支持本司内客户 + */ + private Long customIntroducer; + + /** + * 拉黑标识 1是0否 + */ + private String black; + + + /** + * 2逻辑删除 0 默认有效 + */ + @TableLogic + private Integer delFlag; + + +} diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/PsCustomPrice.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/PsCustomPrice.java new file mode 100644 index 0000000..ec85da7 --- /dev/null +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/PsCustomPrice.java @@ -0,0 +1,61 @@ +package com.pusong.business.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.pusong.common.tenant.core.TenantEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.math.BigDecimal; + +/** + * 客户基本信息对象 ps_custom_info + * + * @author Lion Li + * @date 2024-07-25 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("ps_custom_price") +public class PsCustomPrice extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + + /** + * 客户id + */ + private Long customId; + + /** + * 报价批次 + */ + private Integer priceBatch; + + /** + * 服务项目 + */ + private String serviceProject; + + /** + * 服务金额 + */ + private BigDecimal servicePrice; + + /** + * 2逻辑删除 0 默认有效 + */ + @TableLogic + private Integer delFlag; + + +} diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/bo/PsCustomCallbackBo.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/bo/PsCustomCallbackBo.java new file mode 100644 index 0000000..d15d0d7 --- /dev/null +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/bo/PsCustomCallbackBo.java @@ -0,0 +1,43 @@ +package com.pusong.business.domain.bo; + +import com.pusong.business.domain.PsCustomCallback; +import com.pusong.business.domain.PsCustomInfo; +import com.pusong.common.core.validate.AddGroup; +import com.pusong.common.mybatis.core.domain.BaseEntity; +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +/** + * 客户基本信息对象 ps_custom_info + * + * @author Lion Li + * @date 2024-07-25 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = PsCustomCallback.class, reverseConvertGenerate = false) +public class PsCustomCallbackBo extends BaseEntity { + + /** + * + */ + private Long id; + + /** + * 客户id + */ + @NotBlank(message = "客户id不能为空",groups = {AddGroup.class}) + private Long customId; + + /** + * 回访内容 + */ + @NotBlank(message = "服务项目不能为空",groups = {AddGroup.class}) + private String callbackContent; + + +} diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/bo/PsCustomInfoBo.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/bo/PsCustomInfoBo.java new file mode 100644 index 0000000..ad674a3 --- /dev/null +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/bo/PsCustomInfoBo.java @@ -0,0 +1,73 @@ +package com.pusong.business.domain.bo; + +import com.pusong.business.domain.PsCustomInfo; +import com.pusong.common.core.validate.AddGroup; +import com.pusong.common.core.validate.EditGroup; +import com.pusong.common.mybatis.core.domain.BaseEntity; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import org.hibernate.validator.constraints.Length; + +/** + * 客户基本信息业务对象 ps_custom_info + * + * @author Lion Li + * @date 2024-07-25 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = PsCustomInfo.class, reverseConvertGenerate = false) +public class PsCustomInfoBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 客户名称 + */ + @NotBlank(message = "客户名称不能为空",groups = { EditGroup.class, AddGroup.class }) + @Length(max = 50) + private String customName; + /** + * 客户电话客户电话(多个用英文逗号分割) + */ + @NotBlank(message = "客户电话客户电话",groups = { EditGroup.class, AddGroup.class }) + @Length(max = 500) + private String customMobile; + /** + * 客户来源 + */ + @NotBlank(message = "客户来源不能为空") + private String customSource; + + + /** + * 所属销售经理 + */ + @NotNull(message = "所属客户经理名称不能为空") + private String customManagerName; + + /** + * 客户级别 + */ + @NotBlank(message = "客户级别不能为空") + private String customLevel; + + + /** + * 介绍人-仅支持本司内客户 + */ + @NotNull(message = "介绍人姓名") + private String customIntroducerName; + + + + + + +} diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/bo/PsCustomPriceBo.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/bo/PsCustomPriceBo.java new file mode 100644 index 0000000..62389a3 --- /dev/null +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/bo/PsCustomPriceBo.java @@ -0,0 +1,56 @@ +package com.pusong.business.domain.bo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.pusong.business.domain.PsCustomInfo; +import com.pusong.common.core.validate.AddGroup; +import com.pusong.common.core.validate.EditGroup; +import com.pusong.common.mybatis.core.domain.BaseEntity; +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 客户报价信息对象 ps_custom_Price + * + * @author Lion Li + * @date 2024-07-25 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = PsCustomInfo.class, reverseConvertGenerate = false) +public class PsCustomPriceBo extends BaseEntity { + + /** + * + */ + private Long id; + /** + * 客户id + */ + @NotBlank(message = "客户id不能为空",groups = {AddGroup.class}) + private Long customId; + + /** + * 报价批次 + */ + private Integer priceBatch; + + /** + * 服务项目 + */ + @NotBlank(message = "服务项目不能为空",groups = {AddGroup.class}) + private String serviceProject; + + /** + * 服务金额 + */ + @NotBlank(message = "服务项目报价不能为空",groups = {AddGroup.class}) + private BigDecimal servicePrice; + + +} diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/bo/package-info.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/bo/package-info.java new file mode 100644 index 0000000..e48338e --- /dev/null +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/bo/package-info.java @@ -0,0 +1 @@ +package com.pusong.business.domain.bo; diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/package-info.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/package-info.java new file mode 100644 index 0000000..614efdb --- /dev/null +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/package-info.java @@ -0,0 +1 @@ +package com.pusong.demo.domain; diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/PsCustomCallbackVo.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/PsCustomCallbackVo.java new file mode 100644 index 0000000..c51f2b4 --- /dev/null +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/PsCustomCallbackVo.java @@ -0,0 +1,51 @@ +package com.pusong.business.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.pusong.business.domain.PsCustomPrice; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 客户基本信息对象 ps_custom_info + * + * @author Lion Li + * @date 2024-07-25 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = PsCustomPrice.class) +public class PsCustomCallbackVo implements Serializable { + + @Serial + private static final long serialVersionUID = 2L; + + /** + * + */ + private Long id; + + + /** + * 客户id + */ + private Long customId; + + /** + * 回访内容 + */ + private String callbackContent; + + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm") + private Date createTime; + + +} diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/PsCustomInfoVo.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/PsCustomInfoVo.java new file mode 100644 index 0000000..f5a4e1f --- /dev/null +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/PsCustomInfoVo.java @@ -0,0 +1,138 @@ +package com.pusong.business.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.pusong.business.domain.PsCustomInfo; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.pusong.common.excel.annotation.ExcelDictFormat; +import com.pusong.common.excel.convert.ExcelDictConvert; +import com.pusong.common.translation.annotation.Translation; +import com.pusong.common.translation.constant.TransConstant; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + + +/** + * 客户基本信息视图对象 ps_custom_info + * + * @author Lion Li + * @date 2024-07-25 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = PsCustomInfo.class) +public class PsCustomInfoVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + private Long id; + + /** + * 客户名称 + */ + @ExcelProperty(value = "客户名称") + private String customName; + + /** + * 客户电话客户电话(多个用英文逗号分割) + */ + @ExcelProperty(value = "客户电话(多个用英文逗号分割)") + private String customMobile; + + /** + * 客户来源 + */ + @ExcelProperty(value = "客户来源", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "custom_source") + private String customSource; + + /** + * 客户联系地址 + */ + @ExcelProperty(value = "客户联系地址") + private String customAdressDetail; + + /** + * 所属客户经理 + */ + @ExcelProperty(value = "所属客户经理id") + private String customManager; + /** + * 所属客户经理 + */ + @ExcelProperty(value = "所属客户经理姓名") + private String customManagerName; + + /** + * 客户级别 + */ + @ExcelProperty(value = "客户级别", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "custom_level") + private String customLevel; + + /** + * 客户状态 + */ + @ExcelProperty(value = "客户状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "customer_status") + private String customStatus; + + /** + * 介绍人-仅支持本司内客户 + */ + @ExcelProperty(value = "介绍人-仅支持本司内客户") + private Long customIntroducer; + + /** + * 介绍人姓名-仅支持本司内客户 + */ + @ExcelProperty(value = "介绍人姓名-仅支持本司内客户") + private String customIntroducerName; + + /** + * 拉黑标识 + */ + @ExcelProperty(value = "拉黑标识") + private String black; + + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm") + private Date createTime; + + /** + * 修改时间 + */ + @ExcelProperty(value = "修改时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm") + private Date updateTime; + + /** + * 总报价金额 + */ + @ExcelProperty(value = "总报价金额") + private BigDecimal price; + + /** + * 报价金额DTO + */ + private List psCustomPriceVo; + + /** + * 回访记录DTO + */ + private List psCustomCallbackVo; +} diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/PsCustomPriceVo.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/PsCustomPriceVo.java new file mode 100644 index 0000000..10deba3 --- /dev/null +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/PsCustomPriceVo.java @@ -0,0 +1,61 @@ +package com.pusong.business.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.pusong.business.domain.PsCustomInfo; +import com.pusong.business.domain.PsCustomPrice; +import com.pusong.common.tenant.core.TenantEntity; +import com.pusong.common.translation.annotation.Translation; +import com.pusong.common.translation.constant.TransConstant; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 客户基本信息对象 ps_custom_info + * + * @author Lion Li + * @date 2024-07-25 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = PsCustomPrice.class) +public class PsCustomPriceVo implements Serializable { + + @Serial + private static final long serialVersionUID = 2L; + + /** + * + */ + private Long id; + + /** + * + */ + private Long customId; + /** + * 报价批次 + */ + private Integer priceBatch; + + /** + * 服务项目 + */ + @Translation(type = TransConstant.DICT_TYPE_TO_LABEL,other = "service_project") + private String serviceProject; + + /** + * 服务金额 + */ + private BigDecimal servicePrice; + + +} diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/enums/CustomerStatusEnum.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/enums/CustomerStatusEnum.java new file mode 100644 index 0000000..afafca7 --- /dev/null +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/enums/CustomerStatusEnum.java @@ -0,0 +1,14 @@ +package com.pusong.business.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum CustomerStatusEnum { + + INIT("1","初始化"), + PUBLIC("2","进入公海"); + private String code; + private String text; +} diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/listener/package-info.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/listener/package-info.java new file mode 100644 index 0000000..fd763ae --- /dev/null +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/listener/package-info.java @@ -0,0 +1 @@ +package com.pusong.business.listener; diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/mapper/PsCustomCallbackMapper.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/mapper/PsCustomCallbackMapper.java new file mode 100644 index 0000000..4ed4144 --- /dev/null +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/mapper/PsCustomCallbackMapper.java @@ -0,0 +1,20 @@ +package com.pusong.business.mapper; + + +import com.pusong.business.domain.PsCustomCallback; +import com.pusong.business.domain.PsCustomPrice; +import com.pusong.business.domain.vo.PsCustomCallbackVo; +import com.pusong.business.domain.vo.PsCustomPriceVo; +import com.pusong.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 客户基本信息Mapper接口 + * + * @author Lion Li + * @date 2024-07-25 + */ +public interface PsCustomCallbackMapper extends BaseMapperPlus { + + + +} diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/mapper/PsCustomInfoMapper.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/mapper/PsCustomInfoMapper.java new file mode 100644 index 0000000..1284d0f --- /dev/null +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/mapper/PsCustomInfoMapper.java @@ -0,0 +1,49 @@ +package com.pusong.business.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pusong.business.domain.PsCustomInfo; +import com.pusong.business.domain.vo.PsCustomInfoVo; +import com.pusong.common.mybatis.annotation.DataColumn; +import com.pusong.common.mybatis.annotation.DataPermission; +import com.pusong.common.mybatis.core.mapper.BaseMapperPlus; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 客户基本信息Mapper接口 + * + * @author Lion Li + * @date 2024-07-25 + */ +public interface PsCustomInfoMapper extends BaseMapperPlus { + + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + List selectList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + @DataPermission({ + @DataColumn(key = "deptName", value = "create_dept"), + @DataColumn(key = "userName", value = "create_by") + }) + Page selectPageCustomerList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + @DataPermission({ + @DataColumn(key = "deptName", value = "create_dept"), + @DataColumn(key = "userName", value = "create_by") + }) + List selectPageCustomerList( @Param(Constants.WRAPPER) Wrapper queryWrapper); +// +// @DataPermission({ +// @DataColumn(key = "deptName", value = "u.dept_id"), +// @DataColumn(key = "userName", value = "u.user_id") +// }) +// Page selectPageUserList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + +} diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/mapper/PsCustomPriceMapper.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/mapper/PsCustomPriceMapper.java new file mode 100644 index 0000000..5ea21a5 --- /dev/null +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/mapper/PsCustomPriceMapper.java @@ -0,0 +1,20 @@ +package com.pusong.business.mapper; + + +import com.pusong.business.domain.PsCustomPrice; +import com.pusong.business.domain.vo.PsCustomPriceVo; +import com.pusong.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; + +/** + * 客户基本信息Mapper接口 + * + * @author Lion Li + * @date 2024-07-25 + */ +public interface PsCustomPriceMapper extends BaseMapperPlus { + + + +} diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/mapper/package-info.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/mapper/package-info.java new file mode 100644 index 0000000..e4c2724 --- /dev/null +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/mapper/package-info.java @@ -0,0 +1 @@ +package com.pusong.demo.mapper; diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/IPsCustomInfoService.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/IPsCustomInfoService.java new file mode 100644 index 0000000..bcd56e0 --- /dev/null +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/IPsCustomInfoService.java @@ -0,0 +1,85 @@ +package com.pusong.business.service; + +import com.pusong.business.domain.PsCustomCallback; +import com.pusong.business.domain.bo.PsCustomCallbackBo; +import com.pusong.business.domain.bo.PsCustomPriceBo; +import com.pusong.business.domain.vo.PsCustomInfoVo; +import com.pusong.business.domain.bo.PsCustomInfoBo; +import com.pusong.common.mybatis.core.page.TableDataInfo; +import com.pusong.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 客户基本信息Service接口 + * + * @author Lion Li + * @date 2024-07-25 + */ +public interface IPsCustomInfoService { + + /** + * 查询登陆人下所有的客户名称和id + * @return 客户id和姓名 + */ + List listByLoginUser(); + /** + * 分页查询客户基本信息列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 客户基本信息分页列表 + */ + TableDataInfo queryPageList(PsCustomInfoBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的客户基本信息列表 + * + * @param bo 查询条件 + * @return 客户基本信息列表 + */ + List queryList(PsCustomInfoBo bo); + + /** + * 新增客户基本信息 + * + * @param bo 客户基本信息 + * @return 是否新增成功 + */ + Boolean insertByBo(PsCustomInfoBo bo); + + /** + * 修改客户基本信息 + * + * @param bo 客户基本信息 + * @return 是否修改成功 + */ + Boolean updateByBo(PsCustomInfoBo bo); + + /** + * 校验并批量删除客户基本信息信息 + * + * @param id 主键id + * @param type 操作类型 + * @return 是否删除成功 + */ + Boolean updateCustomerStatus(Long id, Integer type); + + + /** + * 新增客户报价信息 + * + * @param bos 客户报价信息 + * @return 是否新增成功 + */ + Boolean insertPiceByBo(List bos); + + /** + * 新增客户回访记录 + * + * @param bos 客户回访记录 + * @return 是否新增成功 + */ + Boolean insertCallbackByBo(List bos); +} diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/impl/PsCustomInfoServiceImpl.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/impl/PsCustomInfoServiceImpl.java new file mode 100644 index 0000000..65e75fe --- /dev/null +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/impl/PsCustomInfoServiceImpl.java @@ -0,0 +1,231 @@ +package com.pusong.business.service.impl; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.pusong.business.domain.PsCustomCallback; +import com.pusong.business.domain.PsCustomPrice; +import com.pusong.business.domain.bo.PsCustomCallbackBo; +import com.pusong.business.domain.bo.PsCustomPriceBo; +import com.pusong.business.domain.vo.PsCustomCallbackVo; +import com.pusong.business.domain.vo.PsCustomPriceVo; +import com.pusong.business.enums.CustomerStatusEnum; +import com.pusong.business.mapper.PsCustomCallbackMapper; +import com.pusong.business.mapper.PsCustomPriceMapper; +import com.pusong.common.core.utils.MapstructUtils; +import com.pusong.common.core.utils.StringUtils; +import com.pusong.common.mybatis.core.page.TableDataInfo; +import com.pusong.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.pusong.common.satoken.utils.LoginHelper; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.pusong.business.domain.bo.PsCustomInfoBo; +import com.pusong.business.domain.vo.PsCustomInfoVo; +import com.pusong.business.domain.PsCustomInfo; +import com.pusong.business.mapper.PsCustomInfoMapper; +import com.pusong.business.service.IPsCustomInfoService; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 客户基本信息Service业务层处理 + * + * @author Lion Li + * @date 2024-07-25 + */ +@RequiredArgsConstructor +@Service +public class PsCustomInfoServiceImpl implements IPsCustomInfoService { + + private final PsCustomInfoMapper baseMapper; + private final PsCustomPriceMapper priceMapper; + private final PsCustomCallbackMapper callbackMapper; + + /** + * 查询登陆人下所有的客户名称和id + * @return 客户id和姓名 + */ + @Override + public List listByLoginUser() { + //查询客户基本信息 + List list = baseMapper.selectVoList(new QueryWrapper().select("id","custom_name") + .lambda().eq(PsCustomInfo::getDelFlag, 0)); + return list; + } + + /** + * 分页查询客户基本信息列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 客户基本信息分页列表 + */ + @Override + public TableDataInfo queryPageList(PsCustomInfoBo bo, PageQuery pageQuery) { + //查询客户基本信息 + Wrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectPageCustomerList(pageQuery.build(), lqw); + if(CollectionUtils.isEmpty(result.getRecords())){ + return TableDataInfo.build(result); + } + List ids = result.getRecords().stream().map(PsCustomInfoVo::getId).collect(Collectors.toList()); + + //查询报价金额详细 + List pices = priceMapper.selectVoList(Wrappers.lambdaQuery() + .in(PsCustomPrice::getCustomId,ids).eq(PsCustomPrice::getDelFlag,0)); + Map> id_piceMap = new HashMap<>(); + if(CollectionUtils.isNotEmpty(pices)){ + //分组 + id_piceMap = pices.stream().collect((Collectors.groupingBy(PsCustomPriceVo::getCustomId))); + //排序 + id_piceMap.forEach((k,v)->{ + v = v.stream().sorted(Comparator.comparingInt(PsCustomPriceVo::getPriceBatch)).collect(Collectors.toList()); + }); + } + + //查询回访记录详细 + List callbacks = callbackMapper.selectVoList(Wrappers.lambdaQuery() + .in(PsCustomCallback::getCustomId, ids) + .eq(PsCustomCallback::getDelFlag, 0) + .orderByDesc(PsCustomCallback::getCreateTime)); + Map> id_callbackMap = new HashMap<>(); + if(CollectionUtils.isNotEmpty(callbacks)){ + //分组 + id_callbackMap = callbacks.stream().collect((Collectors.groupingBy(PsCustomCallbackVo::getCustomId))); + } + for (PsCustomInfoVo info : result.getRecords()) { + //装填回访记录vo + info.setPsCustomCallbackVo(id_callbackMap.get(info.getId())); + //装填报价金额vo + info.setPsCustomPriceVo(id_piceMap.get(info.getId())); + } + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的客户基本信息列表 + * + * @param bo 查询条件 + * @return 客户基本信息列表 + */ + @Override + public List queryList(PsCustomInfoBo bo) { + Wrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectPageCustomerList(lqw); + } + + private Wrapper buildQueryWrapper(PsCustomInfoBo bo) { + Map params = bo.getParams(); + QueryWrapper qw = Wrappers.query(); + //客户信息表条件 + qw.like( "info.del_flag", 0);//删除标志 + qw.like(StringUtils.isNotBlank(bo.getCustomName()), "info.custom_name", bo.getCustomName());//姓名 + qw.eq(StringUtils.isNotBlank(bo.getCustomSource()), "info.custom_source", bo.getCustomSource());//来源 + qw.eq(StringUtils.isNotBlank(bo.getCustomLevel()), "info.custom_level", bo.getCustomLevel());//客户级别 + qw.like(StringUtils.isNotBlank(bo.getCustomMobile()), "info.custom_mobile", bo.getCustomMobile());//客户级别 + //用户信息表条件 + qw.like(StringUtils.isNotBlank(bo.getCustomManagerName()), "use.custom_manager", bo.getCustomManagerName());//销售经理名称 + //关联客户信息表条件 + qw.eq(StringUtils.isNotBlank(bo.getCustomIntroducerName()), "psinfo.custom_introducer", bo.getCustomIntroducerName());//介绍人姓名 + qw.orderByDesc("info.create_time");//创建时间排序 + return qw; + } + + /** + * 新增客户基本信息 + * + * @param bo 客户基本信息 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(PsCustomInfoBo bo) { + PsCustomInfo add = MapstructUtils.convert(bo, PsCustomInfo.class); + validEntityBeforeSave(add); + //客户经理就是登录用户 + add.setCustomManager(LoginHelper.getUserId()); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改客户基本信息 + * + * @param bo 客户基本信息 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(PsCustomInfoBo bo) { + PsCustomInfo update = MapstructUtils.convert(bo, PsCustomInfo.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(PsCustomInfo entity){ + //TODO 校验状态 + } + + /** + * 校验并批量删除客户基本信息信息 + * + * @param id 主键id + * @param type 操作类型 + * @return 是否删除成功 + */ + @Override + public Boolean updateCustomerStatus(Long id, Integer type) { + PsCustomInfo psCustomInfo = baseMapper.selectById(id); + if(true){ + //todo 校验原数据状态是否可以更改 + } + switch (type){ + case 1://移入公海 + psCustomInfo.setCustomStatus(CustomerStatusEnum.PUBLIC.getCode()); + break; + case 2://拉黑 + psCustomInfo.setBlack("1"); + break; + } + + return baseMapper.updateById(psCustomInfo) > 0; + } + + /** + * 新增客户报价信息 + * + * @param bos 客户报价信息 + * @return 是否新增成功 + */ + @Override + public Boolean insertPiceByBo(List bos) { + List adds = MapstructUtils.convert(bos, PsCustomPrice.class); + PsCustomPrice price = priceMapper.selectById(new QueryWrapper().select("max(price_batch)") + .lambda().eq(PsCustomPrice::getDelFlag, 0).eq(PsCustomPrice::getCustomId, bos.get(0).getCustomId())); + adds.forEach(add->{ + add.setPriceBatch((price != null && price.getPriceBatch() != null) ? price.getPriceBatch() + 1 : 1); + }); + + return priceMapper.insertBatch(adds); + } + + /** + * 新增客户回访记录 + * + * @param bos 客户回访记录 + * @return 是否新增成功 + */ + @Override + public Boolean insertCallbackByBo(List bos){ + List adds = MapstructUtils.convert(bos, PsCustomCallback.class); + return callbackMapper.insertBatch(adds); + } +} diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/impl/package-info.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/impl/package-info.java new file mode 100644 index 0000000..78d9c4b --- /dev/null +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/impl/package-info.java @@ -0,0 +1 @@ +package com.pusong.demo.service.impl; diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/package-info.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/package-info.java new file mode 100644 index 0000000..af7e650 --- /dev/null +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/package-info.java @@ -0,0 +1 @@ +package com.pusong.demo.service; diff --git a/pusong-modules/pusong-business/src/main/resources/excel/单列表.xlsx b/pusong-modules/pusong-business/src/main/resources/excel/单列表.xlsx new file mode 100644 index 0000000..0f7347d Binary files /dev/null and b/pusong-modules/pusong-business/src/main/resources/excel/单列表.xlsx differ diff --git a/pusong-modules/pusong-business/src/main/resources/excel/多sheet列表.xlsx b/pusong-modules/pusong-business/src/main/resources/excel/多sheet列表.xlsx new file mode 100644 index 0000000..5277f2e Binary files /dev/null and b/pusong-modules/pusong-business/src/main/resources/excel/多sheet列表.xlsx differ diff --git a/pusong-modules/pusong-business/src/main/resources/excel/多列表.xlsx b/pusong-modules/pusong-business/src/main/resources/excel/多列表.xlsx new file mode 100644 index 0000000..c7d11dc Binary files /dev/null and b/pusong-modules/pusong-business/src/main/resources/excel/多列表.xlsx differ diff --git a/pusong-modules/pusong-business/src/main/resources/mapper/business/PsCustomCallbackMapper.xml b/pusong-modules/pusong-business/src/main/resources/mapper/business/PsCustomCallbackMapper.xml new file mode 100644 index 0000000..1025276 --- /dev/null +++ b/pusong-modules/pusong-business/src/main/resources/mapper/business/PsCustomCallbackMapper.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/pusong-modules/pusong-business/src/main/resources/mapper/business/PsCustomInfoMapper.xml b/pusong-modules/pusong-business/src/main/resources/mapper/business/PsCustomInfoMapper.xml new file mode 100644 index 0000000..4a0e3d9 --- /dev/null +++ b/pusong-modules/pusong-business/src/main/resources/mapper/business/PsCustomInfoMapper.xml @@ -0,0 +1,17 @@ + + + + + + + diff --git a/pusong-modules/pusong-business/src/main/resources/mapper/business/PsCustomPriceMapper.xml b/pusong-modules/pusong-business/src/main/resources/mapper/business/PsCustomPriceMapper.xml new file mode 100644 index 0000000..6c1b50c --- /dev/null +++ b/pusong-modules/pusong-business/src/main/resources/mapper/business/PsCustomPriceMapper.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/pusong-modules/pusong-business/src/main/resources/mapper/package-info.md b/pusong-modules/pusong-business/src/main/resources/mapper/package-info.md new file mode 100644 index 0000000..c938b1e --- /dev/null +++ b/pusong-modules/pusong-business/src/main/resources/mapper/package-info.md @@ -0,0 +1,3 @@ +java包使用 `.` 分割 resource 目录使用 `/` 分割 +
+此文件目的 防止文件夹粘连找不到 `xml` 文件 \ No newline at end of file