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 0fbd97842..737b900d9 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 @@ -375,6 +375,11 @@ public class RedisConstant { */ public static final String MY_POINT_EXPORT_LOCK = "my_point_export_lock"; + /** + * 十二分制积分流水导出锁 + */ + public static final String TP_SCORE_JOURNAL_EXPORT_LOCK = "tp_score_journal_export_lock"; + /** * 钱包分账公司配置-招商分部 */ 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 187d80b46..6c8f82353 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 @@ -34,6 +34,7 @@ public enum FileTypeEnum { POINT_EXPORT("pointExport", "铺位管理列表"), MY_POINT_EXPORT("myPointExport", "我的铺位管理列表"), ORDER_DEVICE_DETAIL_EXPORT("orderDeviceDetailExport", "订单设备明细导出"), + TP_SCORE_JOURNAL_EXPORT("tpScoreJournalExport", "十二分制积分流水导出"), ; private String fileType; private String desc; diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpScoreJournalDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpScoreJournalDAO.java index 0d2951956..395a05d89 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpScoreJournalDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpScoreJournalDAO.java @@ -35,6 +35,20 @@ public class TpScoreJournalDAO { * 列表查询 */ public List getList(TpScoreJournalQueryRequest request) { + Example example = buildExample(request); + example.setOrderByClause("create_time DESC"); + return tpScoreJournalMapper.selectByExample(example); + } + + /** + * 统计数量 + */ + public Long count(TpScoreJournalQueryRequest request) { + Example example = buildExample(request); + return (long) tpScoreJournalMapper.selectCountByExample(example); + } + + private Example buildExample(TpScoreJournalQueryRequest request) { Example example = new Example(TpScoreJournalDO.class); Example.Criteria criteria = example.createCriteria(); if (StringUtils.isNotBlank(request.getStoreNameOrNum())) { @@ -61,7 +75,6 @@ public class TpScoreJournalDAO { if (StringUtils.isNotBlank(request.getApplyNo())) { criteria.andLike("applyNo", "%" + request.getApplyNo() + "%"); } - example.setOrderByClause("create_time DESC"); - return tpScoreJournalMapper.selectByExample(example); + return example; } } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/tp/TpScoreJournalExportDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/tp/TpScoreJournalExportDTO.java new file mode 100644 index 000000000..45b3620c5 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/tp/TpScoreJournalExportDTO.java @@ -0,0 +1,94 @@ +package com.cool.store.dto.tp; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.cool.store.annotation.DictField; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + *

+ * 十二分制-积分流水导出DTO + *

+ * + * @author wangff + * @since 2025/11/10 + */ +@Data +public class TpScoreJournalExportDTO { + + @ExcelProperty(value = "流水号", order = 1) + @ColumnWidth(30) + private String journalNo; + + @ExcelProperty(value = "门店编码", order = 2) + @ColumnWidth(20) + private String storeNum; + + @ExcelProperty(value = "门店名称", order = 3) + @ColumnWidth(30) + private String storeName; + + @ExcelProperty(value = "加盟品牌", order = 4) + @ColumnWidth(15) + private String joinBrandName; + + @ExcelProperty(value = "加盟模式", order = 5) + @ColumnWidth(15) + private String joinModelName; + + @ExcelProperty(value = "门店类型", order = 6) + @ColumnWidth(15) + private String storeTypeName; + + @ExcelProperty(value = "发生分值", order = 7) + @ColumnWidth(15) + private String occurScore; + + @ExcelProperty(value = "发生日期", order = 8) + @ColumnWidth(20) + private String occurDate; + + @ExcelProperty(value = "发生前分值", order = 9) + @ColumnWidth(15) + private BigDecimal occurBeforeScore; + + @ExcelProperty(value = "发生后分值", order = 10) + @ColumnWidth(15) + private BigDecimal occurAfterScore; + + @ExcelProperty(value = "单据类型", order = 11) + @ColumnWidth(20) + private String applyTypeName; + + @ExcelProperty(value = "来源单号", order = 12) + @ColumnWidth(30) + private String applyNo; + + @ExcelIgnore + private String projectCategory; + + @ExcelProperty(value = "项目大类", order = 13) + @ColumnWidth(20) + @DictField + private String projectCategoryName; + + @ExcelIgnore + private String projectName; + + @ExcelProperty(value = "项目名称", order = 14) + @ColumnWidth(30) + @DictField + private String projectNameName; + + @ExcelProperty(value = "规则编码", order = 15) + @ColumnWidth(20) + private String ruleNo; + + @ExcelProperty(value = "规则项目描述", order = 16) + @ColumnWidth(30) + private String remark; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpScoreJournalDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpScoreJournalDO.java index 6baf44a98..8371a92c1 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpScoreJournalDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpScoreJournalDO.java @@ -132,6 +132,11 @@ public class TpScoreJournalDO { @Column(name = "rule_no") private String ruleNo; + /** + * 规则项目描述 + */ + private String remark; + /** * 创建时间 */ @@ -144,7 +149,7 @@ public class TpScoreJournalDO { @Column(name = "update_time") private Date updateTime; - public TpScoreJournalDO(StoreDO storeDO, TpApplyFormDO formDO, String occurScore, BigDecimal occurBeforeScore, BigDecimal occurAfterScore) { + public TpScoreJournalDO(StoreDO storeDO, TpApplyFormDO formDO, String occurScore, BigDecimal occurBeforeScore, BigDecimal occurAfterScore, String ruleRemark) { this.journalNo = TpHelper.generateScoreJournalNo(); this.storeId = storeDO.getStoreId(); this.storeNum = storeDO.getStoreNum(); @@ -162,5 +167,6 @@ public class TpScoreJournalDO { this.projectName = formDO.getProjectName(); this.ruleId = formDO.getRuleId(); this.ruleNo = formDO.getRuleNo(); + this.remark = ruleRemark; } } \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpScoreJournalVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpScoreJournalVO.java index f221f0e13..68786c0b5 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpScoreJournalVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpScoreJournalVO.java @@ -4,6 +4,7 @@ import com.cool.store.enums.JoinModeEnum; import com.cool.store.enums.StoreTypeEnum; import com.cool.store.enums.master.BrandTypeEnum; import com.cool.store.enums.tp.TpFormTypeEnum; +import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -81,6 +82,9 @@ public class TpScoreJournalVO { @ApiModelProperty("创建时间") private Date createTime; + @JsonIgnore + private String remark; + public String getJoinBrandName() { return BrandTypeEnum.getDescByCode(this.joinBrand); } 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 8a4c04d29..02809a11e 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,6 +5,7 @@ import com.cool.store.entity.ImportTaskDO; import com.cool.store.request.AllPointPageRequest; import com.cool.store.request.FranchiseReportRequest; import com.cool.store.request.order.PCStoreOrderQueryRequest; +import com.cool.store.request.tp.TpScoreJournalQueryRequest; import com.cool.store.request.visit.VisitRecordQueryRequest; import com.cool.store.request.PointPageRequest; import com.cool.store.request.visit.VisitRecordQueryRequest; @@ -52,4 +53,11 @@ public interface ExportRealizeService { * @param importTaskDO 导出任务 */ void exportOrderDeviceDetail(Long orderId, ImportTaskDO importTaskDO); + + /** + * 十二分制积分流水导出 + * @param request 查询Request + * @param importTaskDO 导出任务 + */ + void exportTpScoreJournal(TpScoreJournalQueryRequest 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 8bc73b8c5..df4f3d4f2 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 @@ -6,6 +6,7 @@ import com.cool.store.dto.pre.fry.ApplyManagementQueryDTO; import com.cool.store.enums.FileTypeEnum; import com.cool.store.request.*; import com.cool.store.request.order.PCStoreOrderQueryRequest; +import com.cool.store.request.tp.TpScoreJournalQueryRequest; import com.cool.store.request.visit.VisitRecordQueryRequest; import com.cool.store.request.visit.VisitRecordQueryRequest; @@ -85,4 +86,12 @@ public interface ExportService { * @return 记录总数 */ Long exportOrderDeviceDetail(Long orderId, LoginUserInfo user); + + /** + * 十二分制积分流水导出 + * @param request 查询Request + * @param user 当前用户 + * @return 记录总数 + */ + Long exportTpScoreJournal(TpScoreJournalQueryRequest request, LoginUserInfo user); } 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 4f30d538d..1d5aee613 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,11 +1,12 @@ package com.cool.store.service.impl; import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.date.DateUtil; import com.cool.store.constants.RedisConstant; import com.cool.store.dao.*; import com.cool.store.dto.*; - +import com.cool.store.dto.tp.TpScoreJournalExportDTO; import com.cool.store.dto.pre.fry.ApplyManagementDTO; import com.cool.store.entity.*; import com.cool.store.enums.*; @@ -15,6 +16,7 @@ import com.cool.store.mapper.*; import com.cool.store.request.AllPointPageRequest; import com.cool.store.request.FranchiseReportRequest; import com.cool.store.request.order.PCStoreOrderQueryRequest; +import com.cool.store.request.tp.TpScoreJournalQueryRequest; import com.cool.store.request.visit.VisitRecordQueryRequest; import com.cool.store.request.PointPageRequest; import com.cool.store.request.visit.VisitRecordQueryRequest; @@ -22,8 +24,10 @@ 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.dict.impl.DictService; import com.cool.store.service.order.MiniStoreOrderService; import com.cool.store.service.order.impl.MiniStoreOrderServiceImpl; +import com.cool.store.service.tp.TpScoreJournalService; import com.cool.store.service.visit.VisitRecordService; import com.cool.store.service.visit.VisitRecordService; import com.cool.store.utils.BeanUtil; @@ -36,6 +40,7 @@ import com.cool.store.utils.poi.StringUtils; import com.cool.store.vo.order.OrderDeviceDetailExportVO; import com.cool.store.vo.order.OrderDeviceDetailVO; import com.cool.store.vo.order.PCStoreOrderListVO; +import com.cool.store.vo.tp.TpScoreJournalVO; import com.cool.store.vo.visit.VisitRecordListVO; import com.cool.store.vo.point.PointExportVO; import com.cool.store.vo.point.PointPageVO; @@ -130,6 +135,10 @@ public class ExportRealizeServiceImpl implements ExportRealizeService { private PointService pointService; @Resource private PointFinancialDataDAO pointFinancialDataDAO; + @Resource + private TpScoreJournalService tpScoreJournalService; + @Resource + private DictService dictService; @Override @Async @@ -904,5 +913,36 @@ public class ExportRealizeServiceImpl implements ExportRealizeService { throw new RuntimeException(e); } } + + @Override + @Async("generalThreadPool") + public void exportTpScoreJournal(TpScoreJournalQueryRequest request, ImportTaskDO importTaskDO) { + String url = ""; + try { + url = easyExcelUtil.exportExcelInBatches(TpScoreJournalExportDTO.class, + (pageNum, pageSize) -> { + request.setPageNum(pageNum); + request.setPageSize(pageSize); + List list = tpScoreJournalService.getPage(request).getList(); + List result = CollStreamUtil.toList(list, v -> { + TpScoreJournalExportDTO dto = BeanUtil.toBean(v, TpScoreJournalExportDTO.class); + dto.setOccurDate(DateUtil.format(v.getOccurDate(), "yyyy-MM-dd")); + return dto; + }); + dictService.fillDictField(result); + return result; + }, + FileTypeEnum.TP_SCORE_JOURNAL_EXPORT.getDesc(), + FileTypeEnum.TP_SCORE_JOURNAL_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.TP_SCORE_JOURNAL_EXPORT_LOCK); + } + } } 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 d6eaf9378..fece23a8f 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 @@ -24,12 +24,14 @@ import com.cool.store.mapper.ImportTaskMapper; import com.cool.store.mapper.PointInfoMapper; import com.cool.store.request.*; import com.cool.store.request.order.PCStoreOrderQueryRequest; +import com.cool.store.request.tp.TpScoreJournalQueryRequest; import com.cool.store.request.visit.VisitRecordQueryRequest; 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.tp.TpScoreJournalService; import com.cool.store.utils.RedisUtilPool; import com.cool.store.utils.easyExcel.EasyExcelUtil; import com.cool.store.utils.poi.DateUtils; @@ -89,6 +91,8 @@ public class ExportServiceImpl implements ExportService { private RedisUtilPool redisUtilPool; @Resource private PointService pointService; + @Resource + private TpScoreJournalService tpScoreJournalService; @@ -349,5 +353,32 @@ public class ExportServiceImpl implements ExportService { return 1L; } + @Override + public Long exportTpScoreJournal(TpScoreJournalQueryRequest request, LoginUserInfo user) { + Long count = tpScoreJournalService.count(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.TP_SCORE_JOURNAL_EXPORT_LOCK, RedisConstant.TP_SCORE_JOURNAL_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.TP_SCORE_JOURNAL_EXPORT.getDesc() + DateUtils.parseDateToStr(DateUtils.SPECIAL_DATE_START_1, new Date())); + importTaskDO.setIsImport(Boolean.FALSE); + importTaskDO.setFileType(FileTypeEnum.TP_SCORE_JOURNAL_EXPORT.getFileType()); + importTaskDO.setCreateUserId(user.getUserId()); + importTaskDO.setCreateTime(new Date().getTime()); + importTaskDO.setCreateName(user.getName()); + importTaskMapper.insert(eid, importTaskDO); + exportRealizeService.exportTpScoreJournal(request, importTaskDO); + return count; + } + } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdHuoMaServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdHuoMaServiceImpl.java index 602e91bc7..4bfa8a04a 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdHuoMaServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdHuoMaServiceImpl.java @@ -90,7 +90,14 @@ public class ThirdHuoMaServiceImpl implements HuoMaService { @Override public Boolean accountClose(AccountCloseRequest requestBody) { String apiUrl = url + "/dzgV1/shop/setShopEnableSwitch"; - executeApiCall(apiUrl, requestBody, List.class); + try { + executeApiCall(apiUrl, requestBody, List.class); + } catch (ServiceException e) { + if (e.getMessage().equals("第三方服务异常->系统未找到对应的店铺编码")) { + return true; + } + throw e; + } return true; } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/TpScoreJournalService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/TpScoreJournalService.java index fa6a600a1..4ebe64738 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/TpScoreJournalService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/TpScoreJournalService.java @@ -20,4 +20,11 @@ public interface TpScoreJournalService { * @return 积分流水VO列表 */ PageInfo getPage(TpScoreJournalQueryRequest request); + + /** + * 统计数量 + * @param request 积分流水查询Request + * @return 数量 + */ + Long count(TpScoreJournalQueryRequest request); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java index add392b69..cab2dff14 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java @@ -552,8 +552,9 @@ public class TpApplyServiceImpl implements TpApplyService { if (Objects.isNull(storeDO)) { throw new ServiceException(ErrorCodeEnum.STORE_NOT_FIND); } + TpRuleDO tpRuleDO = tpRuleDAO.getById(formDO.getRuleId()); // 添加积分流水 - tpScoreJournalDAO.insertSelective(new TpScoreJournalDO(storeDO, formDO, occurScore, occurBeforeScore, occurAfterScore)); + tpScoreJournalDAO.insertSelective(new TpScoreJournalDO(storeDO, formDO, occurScore, occurBeforeScore, occurAfterScore, tpRuleDO.getRemark())); } } } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpScoreJournalServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpScoreJournalServiceImpl.java index 0ec1b156f..15f7aa9a9 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpScoreJournalServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpScoreJournalServiceImpl.java @@ -33,4 +33,9 @@ public class TpScoreJournalServiceImpl implements TpScoreJournalService { PageInfo page = new PageInfo<>(list); return BeanUtil.toPage(page, TpScoreJournalVO.class); } + + @Override + public Long count(TpScoreJournalQueryRequest request) { + return tpScoreJournalDAO.count(request); + } } 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 1b1b07481..c4df78aec 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 @@ -5,6 +5,7 @@ import com.cool.store.dto.pre.fry.ApplyManagementQueryDTO; import com.cool.store.enums.FileTypeEnum; import com.cool.store.request.*; import com.cool.store.request.order.PCStoreOrderQueryRequest; +import com.cool.store.request.tp.TpScoreJournalQueryRequest; import com.cool.store.request.visit.VisitRecordQueryRequest; import com.cool.store.response.ResponseResult; import com.cool.store.service.ExportService; @@ -101,4 +102,10 @@ public class ExportController { public ResponseResult myPointExport(@RequestBody PointPageRequest request) { return ResponseResult.success(exportService.myPointExport(request, CurrentUserHolder.getUser())); } + + @PostMapping("/tpScoreJournalExport") + @ApiOperation("十二分制积分流水导出") + public ResponseResult tpScoreJournalExport(@RequestBody TpScoreJournalQueryRequest request) { + return ResponseResult.success(exportService.exportTpScoreJournal(request, CurrentUserHolder.getUser())); + } }