From 6b9a1d135a79092ab3745ade56d12a7e1c5614b3 Mon Sep 17 00:00:00 2001 From: 1073413548 <14628403+gjb0917@user.noreply.gitee.com> Date: Fri, 26 Jul 2024 17:44:59 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=8C=85=E5=90=8D=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 5 + pusong-admin/pom.xml | 6 +- pusong-modules/pom.xml | 1 + pusong-modules/pusong-business/pom.xml | 108 ++++++++ .../controller/PsCustomController.java | 124 ++++++++++ .../business/controller/package-info.java | 1 + .../business/domain/PsCustomCallback.java | 51 ++++ .../pusong/business/domain/PsCustomInfo.java | 83 +++++++ .../pusong/business/domain/PsCustomPrice.java | 61 +++++ .../domain/bo/PsCustomCallbackBo.java | 43 ++++ .../business/domain/bo/PsCustomInfoBo.java | 73 ++++++ .../business/domain/bo/PsCustomPriceBo.java | 56 +++++ .../business/domain/bo/package-info.java | 1 + .../pusong/business/domain/package-info.java | 1 + .../domain/vo/PsCustomCallbackVo.java | 51 ++++ .../business/domain/vo/PsCustomInfoVo.java | 138 +++++++++++ .../business/domain/vo/PsCustomPriceVo.java | 61 +++++ .../business/enums/CustomerStatusEnum.java | 14 ++ .../business/listener/package-info.java | 1 + .../mapper/PsCustomCallbackMapper.java | 20 ++ .../business/mapper/PsCustomInfoMapper.java | 49 ++++ .../business/mapper/PsCustomPriceMapper.java | 20 ++ .../pusong/business/mapper/package-info.java | 1 + .../service/IPsCustomInfoService.java | 85 +++++++ .../service/impl/PsCustomInfoServiceImpl.java | 231 ++++++++++++++++++ .../business/service/impl/package-info.java | 1 + .../pusong/business/service/package-info.java | 1 + .../src/main/resources/excel/单列表.xlsx | Bin 0 -> 10787 bytes .../src/main/resources/excel/多sheet列表.xlsx | Bin 0 -> 13359 bytes .../src/main/resources/excel/多列表.xlsx | Bin 0 -> 10761 bytes .../business/PsCustomCallbackMapper.xml | 8 + .../mapper/business/PsCustomInfoMapper.xml | 17 ++ .../mapper/business/PsCustomPriceMapper.xml | 8 + .../src/main/resources/mapper/package-info.md | 3 + 34 files changed, 1322 insertions(+), 1 deletion(-) create mode 100644 pusong-modules/pusong-business/pom.xml create mode 100644 pusong-modules/pusong-business/src/main/java/com/pusong/business/controller/PsCustomController.java create mode 100644 pusong-modules/pusong-business/src/main/java/com/pusong/business/controller/package-info.java create mode 100644 pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/PsCustomCallback.java create mode 100644 pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/PsCustomInfo.java create mode 100644 pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/PsCustomPrice.java create mode 100644 pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/bo/PsCustomCallbackBo.java create mode 100644 pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/bo/PsCustomInfoBo.java create mode 100644 pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/bo/PsCustomPriceBo.java create mode 100644 pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/bo/package-info.java create mode 100644 pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/package-info.java create mode 100644 pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/PsCustomCallbackVo.java create mode 100644 pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/PsCustomInfoVo.java create mode 100644 pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/PsCustomPriceVo.java create mode 100644 pusong-modules/pusong-business/src/main/java/com/pusong/business/enums/CustomerStatusEnum.java create mode 100644 pusong-modules/pusong-business/src/main/java/com/pusong/business/listener/package-info.java create mode 100644 pusong-modules/pusong-business/src/main/java/com/pusong/business/mapper/PsCustomCallbackMapper.java create mode 100644 pusong-modules/pusong-business/src/main/java/com/pusong/business/mapper/PsCustomInfoMapper.java create mode 100644 pusong-modules/pusong-business/src/main/java/com/pusong/business/mapper/PsCustomPriceMapper.java create mode 100644 pusong-modules/pusong-business/src/main/java/com/pusong/business/mapper/package-info.java create mode 100644 pusong-modules/pusong-business/src/main/java/com/pusong/business/service/IPsCustomInfoService.java create mode 100644 pusong-modules/pusong-business/src/main/java/com/pusong/business/service/impl/PsCustomInfoServiceImpl.java create mode 100644 pusong-modules/pusong-business/src/main/java/com/pusong/business/service/impl/package-info.java create mode 100644 pusong-modules/pusong-business/src/main/java/com/pusong/business/service/package-info.java create mode 100644 pusong-modules/pusong-business/src/main/resources/excel/单列表.xlsx create mode 100644 pusong-modules/pusong-business/src/main/resources/excel/多sheet列表.xlsx create mode 100644 pusong-modules/pusong-business/src/main/resources/excel/多列表.xlsx create mode 100644 pusong-modules/pusong-business/src/main/resources/mapper/business/PsCustomCallbackMapper.xml create mode 100644 pusong-modules/pusong-business/src/main/resources/mapper/business/PsCustomInfoMapper.xml create mode 100644 pusong-modules/pusong-business/src/main/resources/mapper/business/PsCustomPriceMapper.xml create mode 100644 pusong-modules/pusong-business/src/main/resources/mapper/package-info.md 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 0000000000000000000000000000000000000000..0f7347d652c06ae29eca9fa6cd1055ec6ae6c6e3 GIT binary patch literal 10787 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 GzyAY;y@`_m literal 0 HcmV?d00001 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