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