diff --git a/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java b/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java index 47b9e1dba..573bca6e1 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java @@ -40,6 +40,8 @@ public class CommonConstants { public static final int MAX_EXPORT_SIZE = 10000; + public static final int MAX_EXPORT_SIZE_PRO = 100000; + public static final int INT_MAX_VALUE = 2147483647; /** * 跟进任务通知缓存时间 1小时 diff --git a/coolstore-partner-common/src/main/java/com/cool/store/constants/RedisConstant.java b/coolstore-partner-common/src/main/java/com/cool/store/constants/RedisConstant.java index d087525f2..0f4de7c91 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/constants/RedisConstant.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/constants/RedisConstant.java @@ -341,4 +341,14 @@ public class RedisConstant { * 十二分导入锁 */ public static final String TP_PENALTY_APPLY_IMPORT_LOCK = "tp_penalty_apply_import_lock"; + + /** + * 拜访记录导出锁 + */ + public static final String VISIT_RECORD_EXPORT_LOCK = "visit_record_export_lock"; + + /** + * 全部铺位导出锁 + */ + public static final String POINT_EXPORT_LOCK = "point_export_lock"; } diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java index 7f605c6a7..90a7a1587 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java @@ -271,6 +271,7 @@ public enum ErrorCodeEnum { BANK_EXIST(151007,"当前银行已存在,请直接选择!",null), EXPORT_LIMIT_5000(151008,"导出数据不能超过5000条,请增加筛选条件,减少导出数量",null), + EXPORT_LIMIT_100000(151009, "导出数据超过10w条,请增加筛选条件,减少导出数量", null), REGION_INTERSECTION_IS_NULL(151011,"所选所属大区/分公司,不在所选集团下",null), CHECK_PAYER_ERROR(151012,"缴费人必须是签约人,请重新填写!",null), STORE_INFO_INSUFFICIENT(151013,"门店信息不全,无法前往猎聘注册门店!",null), @@ -379,6 +380,7 @@ public enum ErrorCodeEnum { VISIT_RECORD_INVALID(1820003, "拜访记录已失效", null), VISIT_RECORD_NOT_YOUR_OWN(1820004, "非拜访人,无法操作", null), VISIT_RECORD_COMPLETE(1820005, "已完成拜访", null), + EXPORT_TASK_LIMIT(1830006, "导出任务数量达上限,请稍后再试", null), CITY_PLANNING_EXISTS(1820001, "同年份同季度同省市已存在规划,不能重复添加", null), ; diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/FileTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/FileTypeEnum.java index a9ff32cd4..091f7a2cf 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/FileTypeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/FileTypeEnum.java @@ -29,6 +29,8 @@ public enum FileTypeEnum { PRE_FRY_QUALIFICATION_APPLY_EXPORT("preFryQualificationApplyExport", "预炸品资质申请导出"), TP_PENALTY_IMPORT("tpPenaltyImport", "十二分惩处申请单导入"), TP_PENALTY_ERROR_EXPORT("tpPenaltyErrorExport", "十二分惩处申请单导入错误列表"), + VISIT_RECORD_EXPORT("visitRecordExport", "拜访记录列表"), + POINT_EXPORT("pointExport", "铺位管理列表"), ; private String fileType; private String desc; diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/point/PointStatusEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/point/PointStatusEnum.java index b7b95031e..ea622fff3 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/point/PointStatusEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/point/PointStatusEnum.java @@ -33,4 +33,13 @@ public enum PointStatusEnum { public String getDesc() { return desc; } + + public static String getDescByCode(Integer code) { + for (PointStatusEnum value : PointStatusEnum.values()) { + if (value.getCode().equals(code)) { + return value.getDesc(); + } + } + return null; + } } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/PointFinancialDataDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/PointFinancialDataDAO.java index 784116db0..1558f1cd0 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/PointFinancialDataDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/PointFinancialDataDAO.java @@ -1,11 +1,17 @@ package com.cool.store.dao; +import cn.hutool.core.collection.CollStreamUtil; import com.cool.store.entity.PointFinancialDataDO; import com.cool.store.mapper.PointFinancialDataMapper; import io.lettuce.core.dynamic.annotation.Param; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Repository; +import tk.mybatis.mapper.entity.Example; import javax.annotation.Resource; +import java.util.Collections; +import java.util.List; +import java.util.Map; import java.util.Objects; /** @@ -44,6 +50,14 @@ public class PointFinancialDataDAO { return pointFinancialDataDOMapper.selectByPointId(pointId); } - + public Map getMapByPointIds(List pointIds) { + if (CollectionUtils.isEmpty(pointIds)) { + return Collections.emptyMap(); + } + Example example = new Example(PointFinancialDataDO.class); + example.createCriteria().andIn("pointId", pointIds); + List list = pointFinancialDataDOMapper.selectByExample(example); + return CollStreamUtil.toMap(list, PointFinancialDataDO::getPointId, v -> v); + } } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/PointInfoDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/PointInfoDAO.java index c7c398d84..26d8024c3 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/PointInfoDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/PointInfoDAO.java @@ -129,6 +129,10 @@ public class PointInfoDAO { return pointInfoMapper.getTeamPointPage(eid,request); } + public Long getTeamPointCount(String eid, AllPointPageRequest request) { + return pointInfoMapper.getTeamPointCount(eid, request); + } + public List getAllPointList(String eid, PointMapRequest request) { return pointInfoMapper.getAllPointList(eid,request); } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/visit/VisitRecordDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/visit/VisitRecordDAO.java index f8f0ff9f7..f2741c12c 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/visit/VisitRecordDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/visit/VisitRecordDAO.java @@ -108,6 +108,15 @@ public class VisitRecordDAO { return visitRecordMapper.getVisitRecordList(request); } + /** + * 拜访记录数量 + * @param request 拜访记录查询Request + * @return 数量 + */ + public Long getVisitRecordCount(VisitRecordQueryRequest request) { + return visitRecordMapper.getVisitRecordCount(request); + } + /** * 根据线索id查询已完成拜访数量 * @param lineId 线索id diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/PointInfoMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/PointInfoMapper.java index b7a850377..2559501b5 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/PointInfoMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/PointInfoMapper.java @@ -70,6 +70,13 @@ public interface PointInfoMapper extends Mapper { */ Page getTeamPointPage(@Param("eid")String eid,@Param("request") AllPointPageRequest request); + /** + * 获取团队铺位数量 + * @param request + * @return + */ + Long getTeamPointCount(@Param("eid")String eid, @Param("request") AllPointPageRequest request); + /** * 获取所有的铺位 地图 * @param eid diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/visit/VisitRecordMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/visit/VisitRecordMapper.java index f63426cfb..380a9be23 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/visit/VisitRecordMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/visit/VisitRecordMapper.java @@ -29,6 +29,11 @@ public interface VisitRecordMapper extends Mapper { */ List getVisitRecordList(@Param("request") VisitRecordQueryRequest request); + /** + * 拜访记录数量 + */ + Long getVisitRecordCount(@Param("request") VisitRecordQueryRequest request); + /** * 查询拜访加盟商线索id * @param regionIds 加盟商所属大区id diff --git a/coolstore-partner-dao/src/main/resources/mapper/PointInfoMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/PointInfoMapper.xml index 85c629cc7..3ed3c1e95 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/PointInfoMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/PointInfoMapper.xml @@ -238,6 +238,50 @@ order by a.id desc + + SELECT a.line_id, a.visit_num, b.username name, b.mobile @@ -66,40 +99,20 @@ FROM zxjp_visit_record a INNER JOIN xfsg_line_info b ON a.line_id = b.id AND b.deleted = 0 - - and a.user_id = #{request.visitUserId} - - - AND a.line_id = #{request.lineId} - - - AND (b.mobile LIKE CONCAT('%', #{request.keyword}, '%') OR b.username LIKE CONCAT('%', #{request.keyword}, '%')) - - - AND a.visit_no LIKE CONCAT('%', #{request.visitNo}, '%') - - - AND a.visit_date >= #{request.visitStartDate} - - - AND a.visit_date <= #{request.visitEndDate} - - - AND a.status = #{request.status} - - - AND a.user_id = #{request.userId} - - - AND a.desire = #{request.desire} - - - AND b.invest_region_id = #{request.investRegionId} - + ORDER BY a.create_time DESC + + \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/point/PointExportVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/point/PointExportVO.java new file mode 100644 index 000000000..a8ecb9ebd --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/point/PointExportVO.java @@ -0,0 +1,259 @@ +package com.cool.store.vo.point; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + *

+ * 铺位导出VO + *

+ * + * @author wangff + * @since 2026/2/10 + */ +@Data +public class PointExportVO { + @ApiModelProperty("店铺id") + @ExcelIgnore + private Long pointId; + + @ApiModelProperty("铺位名称") + @ExcelProperty(value = "铺位名称", order = 2) + @ColumnWidth(30) + private String pointName; + + @ApiModelProperty("铺位编号") + @ExcelProperty(value = "铺位编号", order = 1) + @ColumnWidth(30) + private String pointCode; + + @ApiModelProperty("所属站区") + @ExcelProperty(value = "所属大区", order = 5) + @ColumnWidth(30) + private String regionNodeName; + + @ExcelProperty(value = "铺位状态", order = 6) + @ColumnWidth(30) + private String pointStatusName; + + @ApiModelProperty("拓展专员") + @ExcelProperty(value = "选址人员", order = 4) + @ColumnWidth(30) + private String developmentManagerUsername; + + @ApiModelProperty("铺位地址") + @ExcelProperty(value = "铺位地址", order = 3) + @ColumnWidth(30) + private String address; + + @ApiModelProperty("创建时间") + @ExcelProperty(value = "创建时间", order = 11) + @ColumnWidth(30) + private Date createTime; + + @ApiModelProperty("更新时间") + @ExcelProperty(value = "最近更新时间", order = 10) + @ColumnWidth(30) + private Date updateTime; + + @ApiModelProperty("成功开店") + @ExcelProperty(value = "成功开店", order = 7) + @ColumnWidth(30) + private String openShopName; + + @ApiModelProperty("所属机会点编码") + @ExcelProperty(value = "所属机会点编码", order = 8) + @ColumnWidth(30) + private String opportunityPointCode; + @ApiModelProperty("所属机会点名称") + @ExcelProperty(value = "所属机会点", order = 9) + @ColumnWidth(30) + private String opportunityPointName; + + @ApiModelProperty("设备费") + @ExcelProperty(value = "设备费", order = 12) + @ColumnWidth(20) + private BigDecimal equipmentCost; + + @ApiModelProperty("装修费") + @ExcelProperty(value = "装修费", order = 13) + @ColumnWidth(20) + private BigDecimal decorationCost; + + @ApiModelProperty("加盟费") + @ExcelProperty(value = "加盟费", order = 14) + @ColumnWidth(20) + private BigDecimal franchiseFee; + + @ApiModelProperty("管理费") + @ExcelProperty(value = "管理费", order = 15) + @ColumnWidth(20) + private BigDecimal managementFee; + + @ApiModelProperty("设计费") + @ExcelProperty(value = "设计费", order = 16) + @ColumnWidth(20) + private BigDecimal designFee; + + @ApiModelProperty("首批进货成本") + @ExcelProperty(value = "首批进货成本", order = 17) + @ColumnWidth(20) + private BigDecimal firstInventoryCost; + + @ApiModelProperty("押金") + @ExcelProperty(value = "押金", order = 18) + @ColumnWidth(20) + private BigDecimal deposit; + + @ApiModelProperty("初始投资额") + @ExcelProperty(value = "初始投资额合计", order = 19) + @ColumnWidth(20) + private BigDecimal initialInvestment; + + @ApiModelProperty("日均订单量") + @ExcelProperty(value = "日均订单量", order = 20) + @ColumnWidth(20) + private Integer avgDailyOrders; + + @ApiModelProperty("日均单价") + @ExcelProperty(value = "日均单价", order = 21) + @ColumnWidth(20) + private BigDecimal avgOrderPrice; + + @ApiModelProperty("每年运营天数") + @ExcelProperty(value = "每年运营天数", order = 22) + @ColumnWidth(20) + private Integer operatingDaysPerYear; + + @ApiModelProperty("每日销售额") + @ExcelProperty(value = "每日销售额", order = 23) + @ColumnWidth(20) + private BigDecimal dailySales; + + @ApiModelProperty("全年GMV") + @ExcelProperty(value = "全年GMV", order = 24) + @ColumnWidth(20) + private BigDecimal annualGmv; + + @ApiModelProperty("每月销售额") + @ExcelProperty(value = "每月销售额", order = 25) + @ColumnWidth(20) + private BigDecimal monthlySales; + + @ApiModelProperty("门店产品毛利率") + @ExcelProperty(value = "门店产品毛利率(%)", order = 26) + @ColumnWidth(20) + private BigDecimal grossMarginRate; + + @ApiModelProperty("正新货品年收入") + @ExcelProperty(value = "正新货品年收入", order = 27) + @ColumnWidth(20) + private BigDecimal annualIncome; + + @ApiModelProperty("材料成本") + @ExcelProperty(value = "材料成本(元/年)", order = 28) + @ColumnWidth(20) + private BigDecimal materialCostAnnual; + + @ApiModelProperty("材料成本") + @ExcelProperty(value = "材料成本(元/月)", order = 29) + @ColumnWidth(20) + private BigDecimal materialCostMonthly; + + @ApiModelProperty("材料成本占收入") + @ExcelProperty(value = "材料成本占收入%", order = 30) + @ColumnWidth(20) + private BigDecimal materialCostRate; + + @ApiModelProperty("人员数量") + @ExcelProperty(value = "人员数量", order = 31) + @ColumnWidth(20) + private Integer staffCount; + + @ApiModelProperty("平均工资") + @ExcelProperty(value = "平均工资", order = 32) + @ColumnWidth(20) + private BigDecimal avgSalary; + + @ApiModelProperty("员工成本") + @ExcelProperty(value = "员工成本(元/年)", order = 33) + @ColumnWidth(20) + private BigDecimal staffCostAnnual; + + @ApiModelProperty("员工成本占收入") + @ExcelProperty(value = "员工成本占收入%", order = 34) + @ColumnWidth(20) + private BigDecimal staffCostRate; + + @ApiModelProperty("租金成本(元/年)") + @ExcelProperty(value = "租金成本(元/年)", order = 35) + @ColumnWidth(20) + private BigDecimal rentCostAnnual; + + @ApiModelProperty("租金成本占收入%") + @ExcelProperty(value = "租金成本占收入%", order = 36) + @ColumnWidth(20) + private BigDecimal rentCostRate; + + @ApiModelProperty("外卖占总营业额") + @ExcelProperty(value = "外卖占总营业额%", order = 37) + @ColumnWidth(20) + private BigDecimal takeawayRate; + + @ApiModelProperty("外卖抽点比例") + @ExcelProperty(value = "外卖抽点比例(%)", order = 38) + @ColumnWidth(20) + private BigDecimal platformCommissionRate; + + @ApiModelProperty("外卖抽点") + @ExcelProperty(value = "外卖抽点", order = 39) + @ColumnWidth(20) + private BigDecimal platformCommission; + + @ApiModelProperty("水电开支") + @ExcelProperty(value = "水电开支", order = 40) + @ColumnWidth(20) + private BigDecimal utilityCost; + + @ApiModelProperty("水电开支占收入") + @ExcelProperty(value = "水电开支占收入%", order = 41) + @ColumnWidth(20) + private BigDecimal utilityCostRate; + + @ApiModelProperty("其他") + @ExcelProperty(value = "其他(含配送费用)", order = 42) + @ColumnWidth(20) + private BigDecimal otherCost; + + @ApiModelProperty("其他占收入") + @ExcelProperty(value = "其他占收入%", order = 43) + @ColumnWidth(20) + private BigDecimal otherCostRate; + + @ApiModelProperty("门店经营利润") + @ExcelProperty(value = "门店经营利润", order = 44) + @ColumnWidth(20) + private BigDecimal operatingProfit; + + @ApiModelProperty("门店经营利润率") + @ExcelProperty(value = "门店经营利润率(%)", order = 45) + @ColumnWidth(20) + private BigDecimal operatingProfitRate; + + @ApiModelProperty("回报期 - 年") + @ExcelProperty(value = "回报期(年)", order = 46) + @ColumnWidth(20) + private BigDecimal paybackPeriodYears; + + @ApiModelProperty("回报期 - 月") + @ExcelProperty(value = "回报期(月)", order = 47) + @ColumnWidth(20) + private BigDecimal paybackPeriodMonths; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/point/PointPageVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/point/PointPageVO.java index e340ee3a0..5400ece71 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/point/PointPageVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/point/PointPageVO.java @@ -1,7 +1,7 @@ package com.cool.store.vo.point; +import com.alibaba.excel.annotation.ExcelProperty; import com.cool.store.dto.PCPointListDTO; -import com.cool.store.entity.PointInfoDO; import com.cool.store.enums.point.PointStatusEnum; import com.google.common.collect.Lists; import io.swagger.annotations.ApiModelProperty; @@ -34,6 +34,9 @@ public class PointPageVO { @ApiModelProperty("铺位状态 1.采集中、2.已评估、3.待审核、5.已审核、6.已签约、7.已失效") private Integer pointStatus; + @ExcelProperty(value = "铺位状态", order = 6) + private String pointStatusName; + @ApiModelProperty("铺位得分") private Integer pointScore; @@ -68,6 +71,9 @@ public class PointPageVO { @ApiModelProperty("所属机会点名称") private String opportunityPointName; + public String getPointStatusName() { + return PointStatusEnum.getDescByCode(this.pointStatus); + } public static List convertVO(List pointList, Map usernameMap, Map regionNameMap) { if(CollectionUtils.isEmpty(pointList)){ diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/visit/VisitRecordListVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/visit/VisitRecordListVO.java index 144836e48..823878e8d 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/visit/VisitRecordListVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/visit/VisitRecordListVO.java @@ -1,6 +1,15 @@ package com.cool.store.vo.visit; +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.CellData; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.property.ExcelContentProperty; import com.cool.store.annotation.DictField; +import com.cool.store.constants.CommonConstants; import com.cool.store.enums.visit.VisitStatusEnum; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -18,79 +27,161 @@ import java.util.Date; @Data public class VisitRecordListVO { @ApiModelProperty("id") + @ExcelIgnore private Long id; @ApiModelProperty(value = "线索id", hidden = true) + @ExcelIgnore private Long lineId; @ApiModelProperty("加盟商姓名") + @ExcelProperty(value = "加盟商姓名", order = 1) + @ColumnWidth(30) private String name; @ApiModelProperty("加盟商手机号") + @ExcelProperty(value = "加盟商手机号", order = 2) + @ColumnWidth(30) private String mobile; @ApiModelProperty("拜访编号") + @ExcelProperty(value = "拜访编号", order = 7) + @ColumnWidth(30) private String visitNo; @ApiModelProperty("拜访日期") + @ExcelProperty(value = "拜访日期", order = 8) + @ColumnWidth(30) private Date visitDate; @ApiModelProperty("签到地址") + @ExcelProperty(value = "拜访地址", order = 9) + @ColumnWidth(30) private String signInAddress; @ApiModelProperty("开新店意愿") + @ExcelIgnore private String desire; @ApiModelProperty("开新店意愿名称") @DictField + @ExcelProperty(value = "开新店意愿", order = 10) + @ColumnWidth(30) private String desireName; @ApiModelProperty("意向开店城市") + @ExcelIgnore private String desireCity; @ApiModelProperty("意向开店城市名称") + @ExcelProperty(value = "意向开店城市", order = 11) + @ColumnWidth(30) private String desireCityName; @ApiModelProperty("具体区域") + @ExcelIgnore private String desireDistrict; @ApiModelProperty("具体区域名称") + @ExcelProperty(value = "具体区域", order = 15) + @ColumnWidth(30) private String desireDistrictName; @ApiModelProperty("是否对应现有铺位") + @ExcelIgnore private Integer existingShopPoint; + @ApiModelProperty("是否对应现有铺位") + @ExcelProperty(value = "是否对应现有铺位", order = 16) + @ColumnWidth(30) + private String existingShopPointConvert; + @ApiModelProperty("加盟商合影图片列表") + @ExcelProperty(value = "加盟商合影", order = 18) + @ColumnWidth(30) private String photos; @ApiModelProperty("拜访状态") + @ExcelIgnore private Integer status; @ApiModelProperty("拜访状态名称") + @ExcelProperty(value = "状态", order = 17) + @ColumnWidth(30) private String statusName; @ApiModelProperty("新老加盟商,0新 1老") + @ExcelIgnore private Integer isVeteran; + @ApiModelProperty("新老加盟商") + @ExcelProperty(value = "新老加盟商", order = 5) + @ColumnWidth(30) + private String isVeteranConvert; + @ApiModelProperty("拜访人userId") + @ExcelIgnore private String visitUserId; @ApiModelProperty("拜访人") + @ExcelProperty(value = "拜访人", order = 6) + @ColumnWidth(30) private String visitUserName; @ApiModelProperty("招商所属大区ID") + @ExcelIgnore private Long investRegionId; @ApiModelProperty("招商所属大区名称") + @ExcelProperty(value = "招商所属大区", order = 3) + @ColumnWidth(30) private String investRegionName; @ApiModelProperty("招商经理") + @ExcelIgnore public String investmentManager; - + @ApiModelProperty("招商经理名称") + @ExcelProperty(value = "招商经理", order = 4) + @ColumnWidth(30) private String investmentManagerName; public String getStatusName() { return VisitStatusEnum.getDescByStatus(status); } + + public String getExistingShopPointConvert() { + return CommonConstants.INDEX_ONE.equals(existingShopPoint) ? "是" : "否"; + } + + public String getIsVeteranConvert() { + return CommonConstants.INDEX_ONE.equals(isVeteran) ? "老" : "新"; + } + + public static class VeteranConverter implements Converter { + + @Override + public Class supportJavaTypeKey() { + return Integer.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + @Override + public Integer convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception { + String value = cellData.getStringValue(); + return "新".equals(value) ? 0 : 1; + } + + @Override + public CellData convertToExcelData(Integer isVeteran, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception { + if (isVeteran == null) { + return new CellData<>(""); + } + return new CellData<>(CommonConstants.INDEX_ZERO.equals(isVeteran) ? "新" : "老"); + } + } } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/ExportRealizeService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/ExportRealizeService.java index 28a816fb2..9056042ac 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/ExportRealizeService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/ExportRealizeService.java @@ -5,7 +5,9 @@ import com.cool.store.dto.pre.fry.ApplyManagementDTO; import com.cool.store.entity.ImportTaskDO; import com.cool.store.entity.LineInfoDO; import com.cool.store.entity.PointInfoDO; +import com.cool.store.request.AllPointPageRequest; import com.cool.store.request.FranchiseReportRequest; +import com.cool.store.request.visit.VisitRecordQueryRequest; import com.cool.store.response.BranchShopResponse; import com.cool.store.response.FranchiseReportResponse; import com.cool.store.response.ShopReportResponse; @@ -33,4 +35,11 @@ public interface ExportRealizeService { void exportZxjpOpenShopReportPage(List list, ImportTaskDO importTaskDO, FranchiseReportRequest request); void exportPreFryQualificationApply(List list, ImportTaskDO importTaskDO); + + /** + * 拜访记录导出 + */ + void exportVisitRecord(VisitRecordQueryRequest request, ImportTaskDO importTaskDO); + + void exportPoint(AllPointPageRequest request, ImportTaskDO importTaskDO); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/ExportService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/ExportService.java index 296baf6cc..069c6fd10 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/ExportService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/ExportService.java @@ -5,6 +5,7 @@ import com.cool.store.context.LoginUserInfo; import com.cool.store.dto.pre.fry.ApplyManagementQueryDTO; import com.cool.store.enums.FileTypeEnum; import com.cool.store.request.*; +import com.cool.store.request.visit.VisitRecordQueryRequest; /** * @Author: WangShuo @@ -44,4 +45,19 @@ public interface ExportService { */ Long exportPreFryQualificationApply(ApplyManagementQueryDTO request, LoginUserInfo user); + /** + * 拜访记录导出 + * @param request 拜访记录查询Request + * @param user 当前用户 + * @return 记录总数 + */ + Long exportVisitRecord(VisitRecordQueryRequest request, LoginUserInfo user); + + /** + * 全部铺位导出 + * @param request 查询Request + * @param user 当前用户 + * @return 记录总数 + */ + Long pointExport(AllPointPageRequest request, LoginUserInfo user); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/PointService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/PointService.java index cff37e185..122797c1f 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/PointService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/PointService.java @@ -169,6 +169,13 @@ public interface PointService { */ PageInfo getTeamPointPage(AllPointPageRequest request); + /** + * 获取团队铺位数量 + * @param request + * @return + */ + Long getTeamPointCount(AllPointPageRequest request); + /** * 地图功能 查询所有的铺位 * @param request diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ExportRealizeServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ExportRealizeServiceImpl.java index fb3adeeca..1812c9266 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ExportRealizeServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ExportRealizeServiceImpl.java @@ -1,13 +1,10 @@ package com.cool.store.service.impl; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.cool.store.constants.CommonConstants; +import cn.hutool.core.collection.CollStreamUtil; +import com.cool.store.constants.RedisConstant; import com.cool.store.dao.*; import com.cool.store.dto.*; -import com.cool.store.dto.Preparation.PreparationDTO; -import com.cool.store.dto.Preparation.ScheduleDTO; import com.cool.store.dto.pre.fry.ApplyManagementDTO; import com.cool.store.entity.*; @@ -15,26 +12,27 @@ import com.cool.store.enums.*; import com.cool.store.enums.point.*; import com.cool.store.exception.ServiceException; import com.cool.store.mapper.*; +import com.cool.store.request.AllPointPageRequest; import com.cool.store.request.FranchiseReportRequest; -import com.cool.store.request.InitiatingRequest; +import com.cool.store.request.visit.VisitRecordQueryRequest; import com.cool.store.response.BranchShopResponse; import com.cool.store.response.FranchiseReportResponse; import com.cool.store.response.ShopReportResponse; import com.cool.store.service.*; +import com.cool.store.service.visit.VisitRecordService; +import com.cool.store.utils.BeanUtil; import com.cool.store.utils.JSONUtils; import com.cool.store.utils.RedisUtilPool; -import com.cool.store.utils.StringUtil; import com.cool.store.utils.easyExcel.EasyExcelUtil; import com.cool.store.utils.poi.DateUtils; import com.cool.store.utils.poi.StringUtils; -import com.fasterxml.jackson.core.JsonProcessingException; +import com.cool.store.vo.point.PointExportVO; +import com.cool.store.vo.point.PointPageVO; +import com.cool.store.vo.visit.VisitRecordListVO; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import io.swagger.annotations.ApiModelProperty; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; @@ -45,10 +43,6 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; -import java.math.BigInteger; -import java.text.MessageFormat; -import java.text.ParseException; -import java.time.temporal.ChronoUnit; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -117,6 +111,12 @@ public class ExportRealizeServiceImpl implements ExportRealizeService { @Resource private InvoicingDAO invoicingDAO; + @Resource + private VisitRecordService visitRecordService; + @Resource + private PointService pointService; + @Resource + private PointFinancialDataDAO pointFinancialDataDAO; @Override @Async @@ -733,6 +733,59 @@ public class ExportRealizeServiceImpl implements ExportRealizeService { } } + @Override + @Async("generalThreadPool") + public void exportVisitRecord(VisitRecordQueryRequest request, ImportTaskDO importTaskDO) { + String url = ""; + try { + url = easyExcelUtil.exportExcelInBatches(VisitRecordListVO.class, + (pageNum, pageSize) -> { + request.setPageNum(pageNum); + request.setPageSize(pageSize); + return visitRecordService.recordList(request).getList(); + }, + FileTypeEnum.VISIT_RECORD_EXPORT.getDesc(), + FileTypeEnum.VISIT_RECORD_EXPORT.getDesc()); + importTaskDO.setStatus(ImportStatusEnum.success.getCode()); + } catch (Exception e) { + log.error("拜访记录导出失败", e); + importTaskDO.setStatus(ImportStatusEnum.fail.getCode()); + } finally { + importTaskDO.setFileUrl(url); + importTaskMapper.update(eid, importTaskDO); + redisUtilPool.delKey(RedisConstant.VISIT_RECORD_EXPORT_LOCK); + } + } + + @Override + @Async("generalThreadPool") + public void exportPoint(AllPointPageRequest request, ImportTaskDO importTaskDO) { + String url = ""; + try { + url = easyExcelUtil.exportExcelInBatches(PointExportVO.class, + (pageNum, pageSize) -> { + request.setPageNum(pageNum); + request.setPageSize(pageSize); + List list = pointService.getTeamPointPage(request).getList(); + List pointIds = CollStreamUtil.toList(list, PointPageVO::getPointId); + Map pointMap = pointFinancialDataDAO.getMapByPointIds(pointIds); + List result = BeanUtil.toList(list, PointExportVO.class); + result.forEach(v -> BeanUtil.copyPropertiesIgnoreId(pointMap.get(v.getPointId()), v)); + return result; + }, + FileTypeEnum.POINT_EXPORT.getDesc(), + FileTypeEnum.POINT_EXPORT.getDesc()); + importTaskDO.setStatus(ImportStatusEnum.success.getCode()); + } catch (Exception e) { + log.error("拜访记录导出失败", e); + importTaskDO.setStatus(ImportStatusEnum.fail.getCode()); + } finally { + importTaskDO.setFileUrl(url); + importTaskMapper.update(eid, importTaskDO); + redisUtilPool.delKey(RedisConstant.POINT_EXPORT_LOCK); + } + } + private String toString(Object o) { if (o == null) { return ""; diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ExportServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ExportServiceImpl.java index fa1c89cc3..e21712b7f 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ExportServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ExportServiceImpl.java @@ -2,34 +2,31 @@ package com.cool.store.service.impl; import com.cool.store.constants.CommonConstants; -import com.cool.store.context.CurrentUserHolder; +import com.cool.store.constants.RedisConstant; import com.cool.store.context.LoginUserInfo; import com.cool.store.dao.HyOpenAreaInfoDAO; import com.cool.store.dao.LineInfoDAO; import com.cool.store.dao.PreFryQualificationApplyDAO; import com.cool.store.dao.ShopInfoDAO; -import com.cool.store.dto.Preparation.PreparationDTO; -import com.cool.store.dto.Preparation.ScheduleDTO; +import com.cool.store.dao.visit.VisitRecordDAO; import com.cool.store.dto.pre.fry.ApplyManagementDTO; import com.cool.store.dto.pre.fry.ApplyManagementQueryDTO; import com.cool.store.entity.*; import com.cool.store.enums.ErrorCodeEnum; import com.cool.store.enums.FileTypeEnum; import com.cool.store.enums.ImportStatusEnum; -import com.cool.store.enums.point.PointStatusEnum; import com.cool.store.exception.ServiceException; import com.cool.store.mapper.ImportTaskMapper; import com.cool.store.mapper.PointInfoMapper; import com.cool.store.request.*; +import com.cool.store.request.visit.VisitRecordQueryRequest; import com.cool.store.response.BranchShopResponse; import com.cool.store.response.FranchiseReportResponse; import com.cool.store.response.ShopReportResponse; import com.cool.store.service.*; +import com.cool.store.utils.RedisUtilPool; import com.cool.store.utils.easyExcel.EasyExcelUtil; import com.cool.store.utils.poi.DateUtils; -import com.cool.store.utils.poi.StringUtils; -import com.cool.store.vo.Preparation.PreparationScheduleVO; -import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import org.apache.commons.collections4.CollectionUtils; import org.slf4j.Logger; @@ -40,7 +37,6 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.*; -import java.util.stream.Collectors; /** * @Author: WangShuo @@ -80,6 +76,12 @@ public class ExportServiceImpl implements ExportService { private FranchiseReportService franchiseReportService; @Resource private PreFryQualificationApplyDAO preFryQualificationApplyDAO; + @Resource + private VisitRecordDAO visitRecordDAO; + @Resource + private RedisUtilPool redisUtilPool; + @Resource + private PointService pointService; @@ -210,5 +212,60 @@ public class ExportServiceImpl implements ExportService { return (long) list.size(); } + @Override + public Long exportVisitRecord(VisitRecordQueryRequest request, LoginUserInfo user) { + Long count = visitRecordDAO.getVisitRecordCount(request); + if (count.intValue() > CommonConstants.MAX_EXPORT_SIZE_PRO) { + throw new ServiceException(ErrorCodeEnum.EXPORT_LIMIT_100000); + } + if (Long.valueOf(0).equals(count)) { + log.error("导出数据为空"); + return 0L; + } + boolean lock = redisUtilPool.setNxExpire(RedisConstant.VISIT_RECORD_EXPORT_LOCK, RedisConstant.VISIT_RECORD_EXPORT_LOCK, 30 * 60 * 1000); + if (!lock) { + throw new ServiceException(ErrorCodeEnum.EXPORT_TASK_LIMIT); + } + ImportTaskDO importTaskDO = new ImportTaskDO(); + importTaskDO.setStatus(ImportStatusEnum.Ongoing.getCode()); + importTaskDO.setFileName(FileTypeEnum.VISIT_RECORD_EXPORT.getDesc() + DateUtils.parseDateToStr(DateUtils.SPECIAL_DATE_START_1, new Date())); + importTaskDO.setIsImport(Boolean.FALSE); + importTaskDO.setFileType(FileTypeEnum.VISIT_RECORD_EXPORT.getFileType()); + importTaskDO.setCreateUserId(user.getUserId()); + importTaskDO.setCreateTime(new Date().getTime()); + importTaskDO.setCreateName(user.getName()); + importTaskMapper.insert(eid, importTaskDO); + exportRealizeService.exportVisitRecord(request, importTaskDO); + return count; + } + + @Override + public Long pointExport(AllPointPageRequest request, LoginUserInfo user) { + request.setCurUserId(user.getUserId()); + Long count = pointService.getTeamPointCount(request); + if (count.intValue() > CommonConstants.MAX_EXPORT_SIZE_PRO) { + throw new ServiceException(ErrorCodeEnum.EXPORT_LIMIT_100000); + } + if (Long.valueOf(0).equals(count)) { + log.error("导出数据为空"); + return 0L; + } + boolean lock = redisUtilPool.setNxExpire(RedisConstant.POINT_EXPORT_LOCK, RedisConstant.POINT_EXPORT_LOCK, 30 * 60 * 1000); + if (!lock) { + throw new ServiceException(ErrorCodeEnum.EXPORT_TASK_LIMIT); + } + ImportTaskDO importTaskDO = new ImportTaskDO(); + importTaskDO.setStatus(ImportStatusEnum.Ongoing.getCode()); + importTaskDO.setFileName(FileTypeEnum.POINT_EXPORT.getDesc() + DateUtils.parseDateToStr(DateUtils.SPECIAL_DATE_START_1, new Date())); + importTaskDO.setIsImport(Boolean.FALSE); + importTaskDO.setFileType(FileTypeEnum.POINT_EXPORT.getFileType()); + importTaskDO.setCreateUserId(user.getUserId()); + importTaskDO.setCreateTime(new Date().getTime()); + importTaskDO.setCreateName(user.getName()); + importTaskMapper.insert(eid, importTaskDO); + exportRealizeService.exportPoint(request, importTaskDO); + return count; + } + } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PointServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PointServiceImpl.java index 5df6c31f6..be701187d 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PointServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PointServiceImpl.java @@ -710,6 +710,21 @@ public class PointServiceImpl implements PointService { return resultPage; } + @Override + public Long getTeamPointCount(AllPointPageRequest request) { + if (!sysRoleService.checkIsAdmin(request.getCurUserId())) { + request.setAuthRegionIds(userAuthMappingService.getAuthRegionIdAndSubRegionIdByUserId(request.getCurUserId())); + } + if (CollectionUtils.isNotEmpty(request.getRegionIds())) { + if (request.getRegionIds().contains(CommonConstants.ROOT_DEPT_ID_STR)) { + request.setRegionIds(null); + } else { + request.setRegionIds(regionService.getSubRegionIdsByRegionIds(request.getRegionIds())); + } + } + return pointInfoDAO.getTeamPointCount(enterpriseId, request); + } + @Override public List getAllPointList(PointMapRequest request) { if (!sysRoleService.checkIsAdmin(request.getCurrentUserId())) { diff --git a/coolstore-partner-service/src/main/java/com/cool/store/utils/easyExcel/BatchDataProvider.java b/coolstore-partner-service/src/main/java/com/cool/store/utils/easyExcel/BatchDataProvider.java new file mode 100644 index 000000000..053d19a69 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/utils/easyExcel/BatchDataProvider.java @@ -0,0 +1,23 @@ +package com.cool.store.utils.easyExcel; + +import java.util.List; + +/** + *

+ * 批量数据提供接口 + *

+ * + * @author wangff + * @since 2026/2/7 + */ +@FunctionalInterface +public interface BatchDataProvider { + + /** + * 获取下一批次数据 + * @param pageNo 当前页码(从1开始) + * @param pageSize 每页大小 + * @return 数据列表,返回空列表或 null 表示结束 + */ + List nextBatch(int pageNo, int pageSize); +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/utils/easyExcel/EasyExcelUtil.java b/coolstore-partner-service/src/main/java/com/cool/store/utils/easyExcel/EasyExcelUtil.java index 6b89e2740..881f2d921 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/utils/easyExcel/EasyExcelUtil.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/utils/easyExcel/EasyExcelUtil.java @@ -2,8 +2,12 @@ package com.cool.store.utils.easyExcel; import cn.hutool.core.date.DateUtil; import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.util.CollectionUtils; +import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.excel.write.style.row.SimpleRowHeightStyleStrategy; +import com.cool.store.constants.CommonConstants; import com.cool.store.handler.CenterAlignHandler; import com.cool.store.handler.ImplProgressReportSheetWriteHandler; import com.cool.store.mapper.ImportTaskMapper; @@ -21,6 +25,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.util.List; +import java.util.Objects; import java.util.Set; @Slf4j @@ -98,5 +103,57 @@ public class EasyExcelUtil { String time = DateUtil.format(new Date(), "yyMM"); return "eid" + "/" + eid + "/" + time + "/"; } + + /** + * 分批次导出并上传 OSS + * + * @param head 数据模型类 + * @param provider 数据提供者回调 + * @param sheetName Sheet名称 + * @param fileName 文件名称 + * @return OSS URL + */ + public String exportExcelInBatches(Class head, BatchDataProvider provider, String sheetName, String fileName) throws Exception { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + InputStream is = null; + ExcelWriter excelWriter; + try { + excelWriter = EasyExcel.write(outputStream, head) + .autoCloseStream(false) // 手动控制流 + .registerWriteHandler(new SimpleRowHeightStyleStrategy((short) 25, (short) 25)) + .build(); + + WriteSheet writeSheet = EasyExcel.writerSheet(sheetName).build(); + + int pageNum = 1, pageSize = CommonConstants.BATCH_SIZE; + boolean hasNext = true; + while (hasNext) { + List data = provider.nextBatch(pageNum, pageSize); + if (CollectionUtils.isEmpty(data)) { + break; + } + hasNext = data.size() == pageSize; + excelWriter.write(data, writeSheet); + log.info("Excel批次导出:已写入第 {} 页,本页 {} 条数据", pageNum, data.size()); + + pageNum++; + } + excelWriter.finish(); + + byte[] bytes = outputStream.toByteArray(); + is = new ByteArrayInputStream(bytes); + + if (StringUtils.isNotBlank(fileName) && fileName.contains(".")) { + fileName = fileName.substring(0, fileName.lastIndexOf(".")); + } + String file = getUploadPath(eid) + fileName + "_" + UUIDUtils.get32UUID() + EXCEL_SUFFIX; + return ossClientService.putObject(file, is, (long) bytes.length, CONTENT_TYPE); + } finally { + outputStream.close(); + if (Objects.nonNull(is)) { + is.close(); + } + } + } } diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/ExportController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/ExportController.java index 02bdb38b5..2c72f4c24 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/ExportController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/ExportController.java @@ -4,6 +4,7 @@ import com.cool.store.context.CurrentUserHolder; import com.cool.store.dto.pre.fry.ApplyManagementQueryDTO; import com.cool.store.enums.FileTypeEnum; import com.cool.store.request.*; +import com.cool.store.request.visit.VisitRecordQueryRequest; import com.cool.store.response.ResponseResult; import com.cool.store.service.ExportService; import io.swagger.annotations.Api; @@ -75,4 +76,16 @@ public class ExportController { public ResponseResult preFryQualificationApply(@RequestBody ApplyManagementQueryDTO request) { return ResponseResult.success(exportService.exportPreFryQualificationApply(request, CurrentUserHolder.getUser())); } + + @PostMapping("/visitRecordExport") + @ApiOperation("拜访记录导出") + public ResponseResult visitRecordExport(@RequestBody VisitRecordQueryRequest request) { + return ResponseResult.success(exportService.exportVisitRecord(request, CurrentUserHolder.getUser())); + } + + @PostMapping("/pointExport") + @ApiOperation("铺位导出") + public ResponseResult pointExport(@RequestBody AllPointPageRequest request) { + return ResponseResult.success(exportService.pointExport(request, CurrentUserHolder.getUser())); + } }