Przeglądaj źródła

机构收入导入导出

liujc 1 rok temu
rodzic
commit
dbdb090645
26 zmienionych plików z 1235 dodań i 46 usunięć
  1. 34 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/EImportType.java
  2. 109 9
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TenantAccountRecordController.java
  3. 4 0
      cooleshow-user/user-biz/pom.xml
  4. 72 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/FileImportInfo.java
  5. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantAccountRecord.java
  6. 3 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/AccountBizTypeEnum.java
  7. 178 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/execl/analysis/TenantAccountRecordImportAnalysis.java
  8. 60 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/execl/entity/TenantAccountRecordImport.java
  9. 94 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/execl/listener/TenantAccountRecordImportListener.java
  10. 27 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/FileImportInfoMapper.java
  11. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityPlanService.java
  12. 21 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/EasyExcelService.java
  13. 18 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ExcelAnalyseCoreService.java
  14. 43 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/FileImportInfoService.java
  15. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MemberPriceSettingsService.java
  16. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantAccountRecordService.java
  17. 8 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanServiceImpl.java
  18. 31 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/EasyExcelServiceImpl.java
  19. 175 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ExcelAnalyseCoreServiceImpl.java
  20. 66 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/FileImportInfoServiceImpl.java
  21. 8 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MemberPriceSettingsServiceImpl.java
  22. 18 16
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PaymentDivMemberRecordServiceImpl.java
  23. 45 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantAccountRecordServiceImpl.java
  24. 172 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/FileImportInfoWrapper.java
  25. 7 15
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAccountRecordWrapper.java
  26. 29 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/FileImportInfoMapper.xml

+ 34 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/EImportType.java

@@ -0,0 +1,34 @@
+package com.yonge.cooleshow.common.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+
+/**
+ * 活动类型 EVALUATION 评测活动
+ *
+ * @Author: liweifan
+ * @Data: 2022/4/7 15:48
+ */
+public enum EImportType implements BaseEnum<String, EImportType> {
+
+    TENANT("机构收入")
+    ;
+
+    @EnumValue
+    private String code;
+    private String msg;
+
+    EImportType(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+}

+ 109 - 9
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TenantAccountRecordController.java

@@ -1,27 +1,39 @@
 package com.yonge.cooleshow.admin.controller;
 
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.yonge.cooleshow.biz.dal.dto.excel.UserAccountRecordExport;
-import com.yonge.cooleshow.biz.dal.dto.search.UserAccountRecordSearch;
+import com.microsvc.toolkit.common.response.template.R;
+import com.microsvc.toolkit.common.tools.DownloadManager;
+import com.microsvc.toolkit.middleware.oss.OssPluginContext;
+import com.microsvc.toolkit.middleware.oss.impl.TencentOssPlugin;
+import com.yonge.cooleshow.biz.dal.entity.FileImportInfo;
+import com.yonge.cooleshow.biz.dal.enums.AccountBizTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
+import com.yonge.cooleshow.biz.dal.service.ExcelAnalyseCoreService;
 import com.yonge.cooleshow.biz.dal.service.TenantAccountRecordService;
-import com.yonge.cooleshow.biz.dal.service.UserAccountRecordService;
-import com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo;
-import com.yonge.cooleshow.biz.dal.vo.UserAccountVo;
+import com.yonge.cooleshow.biz.dal.wrapper.FileImportInfoWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantAccountRecordWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantActivationCodeWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.mybatis.support.PageUtil;
-import com.yonge.toolset.utils.easyexcel.ExcelUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.BeanUtils;
+import org.apache.commons.collections.CollectionUtils;
+import org.joda.time.DateTime;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
-import java.math.BigDecimal;
+import java.io.File;
+import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -33,6 +45,11 @@ public class TenantAccountRecordController extends BaseController {
     @Autowired
     private TenantAccountRecordService tenantAccountRecordService;
 
+    @Autowired
+    private OssPluginContext ossPluginContext;
+
+    @Autowired
+    private ExcelAnalyseCoreService excelAnalyseCoreService;
     /**
      * 查询分页
      */
@@ -55,4 +72,87 @@ public class TenantAccountRecordController extends BaseController {
         return succeed(tenantAccountRecordPageInfo);
     }
 
+
+
+    /**
+     * 导出
+     */
+    @PostMapping("/export")
+    @ApiOperation(value = "机构流水", notes = "TenantAccountRecordQuery")
+    @PreAuthorize("@pcs.hasPermissions('tenantAccountRecord/export')")
+    public HttpResponseResult<TenantActivationCodeWrapper.ExportFile> export(@RequestBody TenantAccountRecordWrapper.TenantAccountRecordQuery query) {
+        query.setRows(-1);
+        query.setInOrOut(InOrOutEnum.IN.getCode());
+
+        IPage<TenantAccountRecordWrapper.TenantAccountRecord> pages = tenantAccountRecordService.selectPage(PageUtil.getPage(query), query);
+
+        // 构建数据
+        List<TenantAccountRecordWrapper.TenantAccountRecord> records = pages.getRecords();
+
+        if (CollectionUtils.isEmpty(records)) {
+            records = new ArrayList<>();
+        }
+
+        List<TenantAccountRecordWrapper.TenantAccountRecordExport> list = JSON.parseArray(JSON.toJSONString(records), TenantAccountRecordWrapper.TenantAccountRecordExport.class);
+
+        for (TenantAccountRecordWrapper.TenantAccountRecordExport tenantAccountRecord : list) {
+            tenantAccountRecord.setBizType(AccountBizTypeEnum.valueOf(tenantAccountRecord.getBizType()).getMsg());
+            tenantAccountRecord.setSettlement(PostStatusEnum.RECORDED.getCode().equals(tenantAccountRecord.getPostStatus())?"是":"否");
+        }
+
+        return succeed(generateExportExcelFile(list,TenantAccountRecordWrapper.TenantAccountRecordExport.class,"机构收入导出","机构收入导出"));
+    }
+
+
+
+    /**
+     * 导出
+     */
+    @PostMapping("/import")
+    @ApiOperation(value = "机构流水", notes = "TenantAccountRecordQuery")
+    @PreAuthorize("@pcs.hasPermissions('tenantAccountRecord/import')")
+    public R<FileImportInfo> importFile(@RequestBody FileImportInfoWrapper.FileImport wrapper) {
+
+
+        // 读取数据
+        return R.from(excelAnalyseCoreService.analyseReadExcelData(
+                JSON.parseObject(JSON.toJSONString(wrapper), FileImportInfoWrapper.FileImportInfo.class)));
+    }
+
+    private TenantActivationCodeWrapper.ExportFile generateExportExcelFile(List<?> orderExports, Class<?> clazz, String fileName, String sheetName) {
+
+        // OSS上传文件目录
+        String uploadOssPath = MessageFormat.format("excel-download/{0}", DateTime.now().toString("yyyy-MM"));
+
+        // 文件上传下载地址
+        String uploadPath = MessageFormat.format("{0}/{1}-{2}.xlsx", uploadOssPath, fileName, DateTime.now().toString("MMddHHmmss"));
+
+        // 本地文件地址
+        String localPath = DownloadManager.getInstance().path(uploadPath);
+
+        // 模板文件保存在springboot项目的resources/static下
+        // Resource resource = new ClassPathResource("static/预报名模板导出.xlsx");
+
+        EasyExcel
+                .write(localPath, clazz)
+                //.withTemplate(resource.getStream()) // 利用模板的输出流
+                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
+                .sheet(0, sheetName)
+                .doWrite(orderExports);
+
+        // 上传本地文件到OSS服务器
+        String downloadPath = ossPluginContext.getPluginService(TencentOssPlugin.PLUGIN_NAME)
+                .uploadFile(uploadOssPath, new File(localPath));
+
+        // 删除本地缓存文件
+        DownloadManager.getInstance().deleteOnExit(localPath);
+
+        // 学生统计下载
+        return TenantActivationCodeWrapper.ExportFile
+                .builder()
+                .fileName(MessageFormat.format("{0}.xlsx", fileName))
+                .downloadPath(downloadPath)
+                .build();
+    }
+
 }

+ 4 - 0
cooleshow-user/user-biz/pom.xml

@@ -113,6 +113,10 @@
             <groupId>com.microsvc.toolkit.middleware</groupId>
             <artifactId>microsvc-middleware-oss</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.microsvc.toolkit.middleware</groupId>
+            <artifactId>microsvc-middleware-excel</artifactId>
+        </dependency>
 
     </dependencies>
 

+ 72 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/FileImportInfo.java

@@ -0,0 +1,72 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.yonge.cooleshow.common.enums.EImportType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 文件数据导入
+ * 2023-04-21 13:54:11
+ */
+@Data
+@ApiModel(" FileImportInfo-文件数据导入")
+@TableName("file_import_info")
+public class FileImportInfo implements Serializable {
+
+    @ApiModelProperty("主键ID")
+    @TableId(value = "id_")
+    private Long id;
+
+    @ApiModelProperty("数据类型") 
+	@TableField(value = "data_type_")
+    private EImportType dataType;
+
+    @ApiModelProperty("导入文件名") 
+	@TableField(value = "file_name_")
+    private String fileName;
+
+    @ApiModelProperty("导入文件地址") 
+	@TableField(value = "import_url_")
+    private String importUrl;
+
+    @ApiModelProperty("导入总行数") 
+	@TableField(value = "total_row_")
+    private Integer totalRow;
+
+    @ApiModelProperty("无效记录") 
+	@TableField(value = "invalid_row_")
+    private Integer invalidRow;
+
+    @ApiModelProperty("数据入库") 
+	@TableField(value = "insert_row_")
+    private Integer insertRow;
+
+    @ApiModelProperty("回执文件地址") 
+	@TableField(value = "resp_url_")
+    private String respUrl;
+
+    @ApiModelProperty("导入帐号") 
+	@TableField(value = "sys_acc_id_")
+    private Long sysAccId;
+
+    @ApiModelProperty("导入时间") 
+	@TableField(value = "import_time_")
+    private Date importTime;
+
+    @ApiModelProperty("导入完成时间") 
+	@TableField(value = "finish_time_")
+    private Date finishTime;
+
+    @ApiModelProperty("创建时间") 
+	@TableField(value = "created_time")
+    private Date createdTime;
+
+}

+ 4 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantAccountRecord.java

@@ -33,6 +33,10 @@ public class TenantAccountRecord implements Serializable {
 	@TableField(value = "tenant_id_")
     private Long tenantId;
 
+    @ApiModelProperty("平台支出记录ID")
+    @TableField(value = "platform_cash_account_record_id_")
+    private Long platformCashAccountRecordId;
+
     @ApiModelProperty("交易金额") 
 	@TableField(value = "trans_amount_")
     private BigDecimal transAmount;

+ 3 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/AccountBizTypeEnum.java

@@ -14,14 +14,14 @@ public enum AccountBizTypeEnum implements BaseEnum<String, AccountBizTypeEnum> {
     PRACTICE("陪练课"),
     LIVE("直播课"),
     VIDEO("视频课"),
-    MUSIC("乐谱"),
+    MUSIC("乐谱购买"),
     VIP("会员充值"),
     MALL("商品购买"),
     PIANO_ROOM("琴房充值"),
     ACTI_REGIST("活动报名"),
     WITHDRAWAL("结算"),
-    ALBUM("专辑"),
-    TENANT_ALBUM("机构专辑"),
+    ALBUM("专辑购买"),
+    TENANT_ALBUM("训练教程"),
 
     LIVE_SHARE("直播课分润"),
     VIDEO_SHARE("视频课分润"),

+ 178 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/execl/analysis/TenantAccountRecordImportAnalysis.java

@@ -0,0 +1,178 @@
+package com.yonge.cooleshow.biz.dal.execl.analysis;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.enums.CellExtraTypeEnum;
+import com.alibaba.excel.metadata.Sheet;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.microsvc.toolkit.middleware.excel.analysis.AnalysisContext;
+import com.microsvc.toolkit.middleware.excel.analysis.DataAnalysis;
+import com.microsvc.toolkit.middleware.excel.util.DownloadManager;
+import com.yonge.cooleshow.biz.dal.entity.TenantAccountRecord;
+import com.yonge.cooleshow.biz.dal.execl.entity.TenantAccountRecordImport;
+import com.yonge.cooleshow.biz.dal.execl.listener.TenantAccountRecordImportListener;
+import com.yonge.cooleshow.biz.dal.service.EasyExcelService;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.File;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+
+@Slf4j
+@Getter
+@Setter
+public class TenantAccountRecordImportAnalysis extends DataAnalysis<TenantAccountRecordImportAnalysis> {
+
+
+    private List<TenantAccountRecordImport> tenantAccountRecordImports;
+
+    // Excel解析服务
+    private EasyExcelService easyExcelService;
+
+    private final Map<String, TenantAccountRecord> recordMap = Maps.newHashMap();
+    public TenantAccountRecordImportAnalysis(AnalysisContext context) {
+        super(context);
+    }
+
+    public static TenantAccountRecordImportAnalysis build(EasyExcelService easyExcelService) {
+        TenantAccountRecordImportAnalysis analysis = new TenantAccountRecordImportAnalysis(AnalysisContext.builder().build());
+        analysis.setEasyExcelService(easyExcelService);
+        analysis.setTenantAccountRecordImports(Lists.newArrayList());
+        return analysis;
+
+    }
+
+
+    /**
+     * 读取文件数据到内存
+     *
+     * @param path 本地文件地址
+     */
+    @Override
+    public void read(String path) {
+
+        File file = new File(path);
+        List<Sheet> sheets = EasyExcel.read(file).build().getSheets();
+        if (CollectionUtils.isNotEmpty(sheets)) {
+
+            sheets.forEach(item -> {
+                // 读取数据
+                EasyExcel.read(file, TenantAccountRecordImport.class, new TenantAccountRecordImportListener(getTenantAccountRecordImports(), item.getSheetName()))
+                        .extraRead(CellExtraTypeEnum.MERGE).sheet(item.getSheetName()).doRead();
+            });
+
+        }
+
+        // 删除本地缓存文件
+        DownloadManager.getInstance().deleteOnExit(path);
+    }
+
+    /**
+     * 校验数据合法
+     *
+     * @return Map<Integer, String>
+     */
+    @Override
+    public Map<Integer, String> verify() {
+
+        // 加载校验数据参数
+        if (Objects.nonNull(getTenantAccountRecordImports())) {
+            loadVerifyParamData();
+        }
+
+        Map<Integer, String> verifyDataMap = Maps.newLinkedHashMap();
+
+        TenantAccountRecord tenantAccountRecord;
+        // 校验每条入库记录数据合法性
+        String ret = "";
+        for (TenantAccountRecordImport item : getTenantAccountRecordImports()) {
+
+            // 课件信息校验
+            tenantAccountRecord = recordMap.get(item.getId());
+            if (Objects.isNull(tenantAccountRecord)) {
+                ret += "流水记录编号无效:" + item.getId();
+            }
+
+            // 检测机构编号,金额,订单号,结算状态
+            if (StringUtils.isBlank(item.getTenantId()) || !tenantAccountRecord.getTenantId().toString().equals(item.getTenantId())) {
+                ret += "机构编号无效:" + item.getTenantId();
+            }
+
+            if (StringUtils.isBlank(item.getTransAmount()) || tenantAccountRecord.getTransAmount().compareTo(new BigDecimal(item.getTransAmount())) != 0) {
+                ret += "交易金额错误:" + item.getTransAmount();
+            }
+            if (StringUtils.isBlank(item.getOrderNo()) || !tenantAccountRecord.getOrderNo().equals(item.getOrderNo())) {
+                ret += "订单号无效:" + item.getOrderNo();
+            }
+
+            if (StringUtils.isNotEmpty(ret)) {
+                verifyDataMap.put(item.getRowIndex(), ret);
+                ret = ""; // 重置数据状态
+            }
+        }
+
+        // 数据校验记录信息
+        getContext().total(getTenantAccountRecordImports().size()).failure(verifyDataMap.size())
+                .setSuccess(getContext().getTotal() - getContext().getFailure());
+
+        return verifyDataMap;
+    }
+
+    /**
+     * 数据转换
+     */
+    @Override
+    public void convert() {
+        for (TenantAccountRecordImport tenantAccountRecordImport : getTenantAccountRecordImports()) {
+            tenantAccountRecordImport.setPostStatus("是".equals(tenantAccountRecordImport.getSettlement())?
+            PostStatusEnum.RECORDED:PostStatusEnum.FROZEN);
+        }
+
+    }
+
+    /**
+     * 加载校验数据参数
+     */
+    private void loadVerifyParamData() {
+        List<TenantAccountRecordImport> importList = getTenantAccountRecordImports();
+
+        // 记录ID集合
+        List<String> ids = importList.stream().map(TenantAccountRecordImport::getId).collect(Collectors.toList());
+
+
+        if (CollectionUtils.isNotEmpty(ids)) {
+            // 记录集合
+            {
+
+                Map<String, TenantAccountRecord> collect = easyExcelService.getRecordById(ids).stream()
+                        .collect(Collectors.toMap(x -> String.valueOf(x.getId()), Function.identity(), (o, n) -> n));
+                if (MapUtils.isNotEmpty(collect)) {
+                    recordMap.putAll(collect);
+                }
+            }
+        }
+
+    }
+
+
+    /**
+     * 数据对象
+     * @return RoomInfoAnalysis
+     */
+    @Override
+    public TenantAccountRecordImportAnalysis get() {
+        return this;
+    }
+
+}

+ 60 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/execl/entity/TenantAccountRecordImport.java

@@ -0,0 +1,60 @@
+package com.yonge.cooleshow.biz.dal.execl.entity;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class TenantAccountRecordImport {
+
+
+    @ApiModelProperty("id")
+    @ExcelProperty("流水记录编号")
+    private String id;
+
+    @ApiModelProperty("机构id")
+    @ExcelProperty("机构编号")
+    private String tenantId;
+
+    @ApiModelProperty("交易金额")
+    @ExcelProperty("交易金额")
+    private String transAmount;
+
+    @ApiModelProperty("订单号")
+    @ExcelProperty("订单号")
+    private String orderNo;
+
+
+    @ApiModelProperty("是否结算")
+    @ExcelProperty("是否完成结算")
+    private String settlement;
+
+    @ApiModelProperty(value = "入账状态 WAIT 待入账 FROZEN 冻结入账 RECORDED 已入账 CANCEL 退费 ")
+    private PostStatusEnum postStatus;
+
+    @ExcelIgnore
+    private Integer rowIndex;
+    @ExcelIgnore
+    private String sheetName;
+
+
+    public TenantAccountRecordImport rowIndex(Integer rowIndex) {
+        this.rowIndex = rowIndex;
+        return this;
+    }
+
+    public TenantAccountRecordImport sheetName(String sheetName) {
+        this.sheetName = sheetName;
+        return this;
+    }
+}

+ 94 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/execl/listener/TenantAccountRecordImportListener.java

@@ -0,0 +1,94 @@
+package com.yonge.cooleshow.biz.dal.execl.listener;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.enums.RowTypeEnum;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.alibaba.excel.metadata.CellExtra;
+import com.google.common.collect.Lists;
+import com.yonge.cooleshow.biz.dal.execl.entity.TenantAccountRecordImport;
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * 课件信息读取监听器
+ * Created by Eric.Shang on 2020/7/1.
+ */
+@Slf4j
+@Getter
+public class TenantAccountRecordImportListener extends AnalysisEventListener<TenantAccountRecordImport> {
+
+    // 课件信息
+    private final List<TenantAccountRecordImport> importList;
+    // sheet名称
+    private final String sheetName;
+    // 合并标识
+    private Boolean mergeFlag;
+
+    public TenantAccountRecordImportListener(List<TenantAccountRecordImport> examinations, String sheetName) {
+        // 单元测试数据
+        this.importList = Optional.ofNullable(examinations).orElse(Lists.newArrayList());
+        // sheet名称
+        this.sheetName = sheetName;
+    }
+
+    /**
+     * 读取每行数据触发
+     * @param  examination 数据内容
+     * @param analysisContext AnalysisContext
+     */
+    @Override
+    public void invoke(TenantAccountRecordImport examination, AnalysisContext analysisContext) {
+        // 忽略空行读取
+        //analysisContext.readWorkbookHolder().setIgnoreEmptyRow(false);
+        // 读取数据
+        getImportList().add(examination.rowIndex(getImportList().size() + 2).sheetName(getSheetName()));
+    }
+
+    /**
+     * 空行数据判定
+     * @param context AnalysisContext
+     * @return boolean
+     */
+    @Override
+    public boolean hasNext(AnalysisContext context) {
+        // 忽略空行判定
+        if (RowTypeEnum.EMPTY.equals(context.readRowHolder().getRowType())){
+            doAfterAllAnalysed(context);
+            return false;
+        }
+
+        return super.hasNext(context);
+    }
+
+    /**
+     * 数据解板读完触发
+     * @param analysisContext AnalysisContext
+     */
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+        // 这里也要保存数据,确保最后遗留的数据也存储到数据库
+    }
+
+    /**
+     * 额外信息(批注、超链接、合并单元格信息读取)
+     * @param extra CellExtra
+     * @param context AnalysisContext
+     */
+    @Override
+    public void extra(CellExtra extra, AnalysisContext context) {
+        switch (extra.getType()) {
+            case MERGE:
+                mergeFlag = false;
+                break;
+            case COMMENT:
+            case HYPERLINK:
+            default:
+                break;
+        }
+    }
+}

+ 27 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/FileImportInfoMapper.java

@@ -0,0 +1,27 @@
+package com.yonge.cooleshow.biz.dal.mapper;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+import com.yonge.cooleshow.biz.dal.entity.FileImportInfo;
+import com.yonge.cooleshow.biz.dal.wrapper.FileImportInfoWrapper;
+
+/**
+ * 文件数据导入
+ * 2023-09-19 19:47:50
+ */
+@Repository
+public interface FileImportInfoMapper extends BaseMapper<FileImportInfo> {
+
+	/**
+	 * 分页查询
+	 * @param page IPage<FileImportInfoWrapper.FileImportInfo>
+	 * @param param FileImportInfoWrapper.FileImportInfoQuery
+	 * @return List<FileImportInfoWrapper.FileImportInfo>
+	 */
+	List<FileImportInfo> selectPage(@Param("page") IPage<FileImportInfo> page, @Param("param") FileImportInfoWrapper.FileImportInfoQuery param);
+	
+}

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityPlanService.java

@@ -129,4 +129,6 @@ public interface ActivityPlanService extends IService<ActivityPlan>  {
      *
      */
     void orderCreate(UserPaymentOrderWrapper.OrderGoodsInfo orderGoodsInfo);
+
+    void orderSuccess(UserOrderDetailVo userPaymentOrder, boolean messageFlag);
 }

+ 21 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/EasyExcelService.java

@@ -0,0 +1,21 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.yonge.cooleshow.biz.dal.entity.TenantAccountRecord;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Created by Eric.Shang on 2023/4/25.
+ */
+public interface EasyExcelService {
+
+
+    /**
+     * 机构收入记录
+     *
+     * @param ids
+     * @return
+     */
+    List<TenantAccountRecord> getRecordById(List<String> ids);
+}

+ 18 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ExcelAnalyseCoreService.java

@@ -0,0 +1,18 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.yonge.cooleshow.biz.dal.entity.FileImportInfo;
+import com.yonge.cooleshow.biz.dal.wrapper.FileImportInfoWrapper;
+
+/**
+ * Created by Eric.Shang on 2023/4/26.
+ */
+public interface ExcelAnalyseCoreService {
+
+    /**
+     * 异步读取数据
+     * @param wrapper FileImportInfoWrapper.FileImportInfo
+     */
+    void asyncAnalyseReadExcelData(FileImportInfoWrapper.FileImportInfo wrapper);
+
+    FileImportInfo analyseReadExcelData(FileImportInfoWrapper.FileImportInfo wrapper);
+}

+ 43 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/FileImportInfoService.java

@@ -0,0 +1,43 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.wrapper.FileImportInfoWrapper;
+import com.yonge.cooleshow.biz.dal.entity.FileImportInfo;
+
+/**
+ * 文件数据导入
+ * 2023-09-19 19:47:50
+ */
+public interface FileImportInfoService extends IService<FileImportInfo>  {
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return FileImportInfo
+     */
+	FileImportInfo detail(Long id);
+
+    /**
+     * 分页查询
+     * @param page IPage<FileImportInfo>
+     * @param query FileImportInfoWrapper.FileImportInfoQuery
+     * @return IPage<FileImportInfo>
+     */
+    IPage<FileImportInfo> selectPage(IPage<FileImportInfo> page, FileImportInfoWrapper.FileImportInfoQuery query);
+	
+    /**
+     * 添加
+     * @param fileImportInfo FileImportInfoWrapper.FileImportInfo
+     * @return Boolean
+     */
+     Boolean add(FileImportInfoWrapper.FileImportInfo fileImportInfo);   
+
+    /**
+     * 更新
+     * @param fileImportInfo FileImportInfoWrapper.FileImportInfo
+     * @return Boolean
+     */
+     Boolean update(FileImportInfoWrapper.FileImportInfo fileImportInfo);
+     
+}

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MemberPriceSettingsService.java

@@ -102,4 +102,6 @@ public interface MemberPriceSettingsService extends IService<MemberPriceSettings
      *
      */
     void orderCreate(UserPaymentOrderWrapper.OrderGoodsInfo orderGoodsInfo);
+
+    void orderSuccess(UserOrderDetailVo userPaymentOrder, boolean messageFlag);
 }

+ 5 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantAccountRecordService.java

@@ -2,9 +2,12 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.execl.entity.TenantAccountRecordImport;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantAccountRecordWrapper;
 import com.yonge.cooleshow.biz.dal.entity.TenantAccountRecord;
 
+import java.util.List;
+
 /**
  * 机构流水表
  * 2023-07-31 13:47:30
@@ -42,4 +45,6 @@ public interface TenantAccountRecordService extends IService<TenantAccountRecord
      Boolean update(TenantAccountRecordWrapper.TenantAccountRecord tenantAccountRecord);
 
     TenantAccountRecordWrapper.TenantAccountRecordStat getStatistics(TenantAccountRecordWrapper.TenantAccountRecordQuery query);
+
+    void updatePostStatus(List<TenantAccountRecordImport> importList);
 }

+ 8 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanServiceImpl.java

@@ -684,6 +684,11 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
 
     @Override
     public void orderSuccess(UserOrderDetailVo userOrderDetailVo) {
+        orderSuccess(userOrderDetailVo,true);
+    }
+
+    @Override
+    public void orderSuccess(UserOrderDetailVo userOrderDetailVo,boolean messageFlag) {
         ActivityRegistration activityRegistration = new ActivityRegistration();
         activityRegistration.setUserId(userOrderDetailVo.getUserId());
         activityRegistration.setOrderNo(userOrderDetailVo.getOrderNo());
@@ -692,7 +697,9 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
         activityRegistration.setCreateTime(new Date());
         activityRegistrationService.save(activityRegistration);
 
-        sendMessage(userOrderDetailVo.getGoodName(), userOrderDetailVo.getUserId());
+        if (messageFlag) {
+            sendMessage(userOrderDetailVo.getGoodName(), userOrderDetailVo.getUserId());
+        }
     }
 
     @Override

+ 31 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/EasyExcelServiceImpl.java

@@ -0,0 +1,31 @@
+package com.yonge.cooleshow.biz.dal.service.impl;
+
+import com.yonge.cooleshow.biz.dal.entity.TenantAccountRecord;
+import com.yonge.cooleshow.biz.dal.service.EasyExcelService;
+import com.yonge.cooleshow.biz.dal.service.TenantAccountRecordService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * Excel解析服务类型
+ * Created by Eric.Shang on 2023/4/25.
+ */
+@Slf4j
+@Service
+public class EasyExcelServiceImpl implements EasyExcelService {
+
+    @Autowired
+    private TenantAccountRecordService tenantAccountRecordService;
+
+    @Override
+    public List<TenantAccountRecord> getRecordById(List<String> ids) {
+        return tenantAccountRecordService.lambdaQuery()
+                .in(TenantAccountRecord::getId,ids)
+                .list();
+
+    }
+}

+ 175 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ExcelAnalyseCoreServiceImpl.java

@@ -0,0 +1,175 @@
+package com.yonge.cooleshow.biz.dal.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.microsvc.toolkit.common.tools.DownloadManager;
+import com.microsvc.toolkit.common.tools.ThreadPool;
+import com.microsvc.toolkit.middleware.excel.analysis.AnalysisContext;
+import com.microsvc.toolkit.middleware.oss.OssPluginContext;
+import com.microsvc.toolkit.middleware.oss.impl.TencentOssPlugin;
+import com.yonge.cooleshow.biz.dal.entity.FileImportInfo;
+import com.yonge.cooleshow.biz.dal.execl.analysis.TenantAccountRecordImportAnalysis;
+import com.yonge.cooleshow.biz.dal.execl.entity.TenantAccountRecordImport;
+import com.yonge.cooleshow.biz.dal.service.EasyExcelService;
+import com.yonge.cooleshow.biz.dal.service.ExcelAnalyseCoreService;
+import com.yonge.cooleshow.biz.dal.service.FileImportInfoService;
+import com.yonge.cooleshow.biz.dal.service.TenantAccountRecordService;
+import com.yonge.cooleshow.biz.dal.wrapper.FileImportInfoWrapper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.joda.time.DateTime;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.File;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * Excel解析服务
+ * Created by Eric.Shang on 2023/4/26.
+ */
+@Slf4j
+@Service
+public class ExcelAnalyseCoreServiceImpl implements ExcelAnalyseCoreService {
+
+    @Autowired
+    private EasyExcelService easyExcelService;
+    @Autowired
+    private OssPluginContext ossPluginContext;
+
+    @Autowired
+    private FileImportInfoService fileImportInfoService;
+
+    @Autowired
+    private TenantAccountRecordService tenantAccountRecordService;
+
+    /**
+     * 异步读取数据
+     *
+     * @param wrapper FileImportInfoWrapper.FileImportInfo
+     */
+    @Override
+    public void asyncAnalyseReadExcelData(FileImportInfoWrapper.FileImportInfo wrapper) {
+
+        ThreadPool.getExecutor().submit(() -> {
+            try {
+
+                switch (wrapper.getDataType()) {
+                    case TENANT: // 课件导入
+                        readTenantExcelData(wrapper);
+                        break;
+                    default:
+                        break;
+                }
+
+                // 数据入库完成,更新数据记录
+                FileImportInfoWrapper.FileImportInfo importInfo = FileImportInfoWrapper.FileImportInfo
+                        .builder()
+                        .id(wrapper.getId())
+                        .finishTime(DateTime.now().toDate())
+                        .build();
+                fileImportInfoService.update(importInfo);
+
+            } catch (Exception e) {
+                log.error("asyncAnalyseReadExcelData wrapper={}", wrapper.jsonString(), e);
+            }
+        });
+    }
+
+
+    @Override
+    public FileImportInfo analyseReadExcelData(FileImportInfoWrapper.FileImportInfo wrapper) {
+        try {
+            switch (wrapper.getDataType()) {
+                case TENANT: // 课件导入
+                    readTenantExcelData(wrapper);
+                    break;
+                default:
+                    break;
+            }
+
+            // 数据入库完成,更新数据记录
+            FileImportInfoWrapper.FileImportInfo importInfo = FileImportInfoWrapper.FileImportInfo
+                    .builder()
+                    .id(wrapper.getId())
+                    .finishTime(DateTime.now().toDate())
+                    .build();
+            fileImportInfoService.update(importInfo);
+            return fileImportInfoService.getById(wrapper.getId());
+
+        } catch (Exception e) {
+            log.error("asyncAnalyseReadExcelData wrapper={}", wrapper.jsonString(), e);
+        }
+        return null;
+    }
+
+    /**
+     * 单元测验数据导入
+     * @param wrapper FileImportInfoWrapper.FileImportInfo
+     */
+    private void readTenantExcelData(FileImportInfoWrapper.FileImportInfo wrapper) {
+
+        // 解析excel文件,生成EchoInfoAnalysis对象
+        TenantAccountRecordImportAnalysis analysis = TenantAccountRecordImportAnalysis.build(easyExcelService).start(wrapper.getImportUrl()).get();
+
+        AnalysisContext context = analysis.getContext();
+        // 生成导入数据记录
+        createFileImportRecord(wrapper, context);
+
+        // 入库业务数据
+        List<TenantAccountRecordImport> collect = analysis.getTenantAccountRecordImports().stream()
+                .filter(x -> !Optional.ofNullable(x.getId()).orElse("").equals("."))
+                .collect(Collectors.toList());
+        if (context.getFailure() > 0) {
+            log.info("readExaminationExcelData collect.size={}", collect.size());
+            return;
+        }
+
+        tenantAccountRecordService.updatePostStatus(collect);
+    }
+
+    /**
+     * 生成导入数据记录
+     *
+     * @param wrapper FileImportInfoWrapper.FileImportInfo
+     * @param context AnalysisContext
+     */
+    private void createFileImportRecord(FileImportInfoWrapper.FileImportInfo wrapper, AnalysisContext context) {
+        // 上传本地文件到OSS服务器(可选)
+        {
+            String respPath = context.getRespfilePath();
+            log.info("createFileImportRecord respPath = {}", respPath);
+            if (StringUtils.isNotEmpty(respPath) && context.getFailure() > 0
+                    && FileUtils.getFile(respPath).exists()) {
+
+                // 上传本地文件到OSS服务器
+                String uploadFile = ossPluginContext.getPluginService(TencentOssPlugin.PLUGIN_NAME)
+                        .uploadFile("excel-analysis", new File(respPath));
+                if (StringUtils.isNotEmpty(uploadFile)) {
+                    context.setResp(uploadFile);
+                }
+                log.info("createFileImportRecord uploadFile={}, resp={}", uploadFile, context.getResp());
+                // 删除本地缓存文件
+                DownloadManager.getInstance().deleteOnExit(respPath);
+            }
+        }
+
+        // 生成excel数据上传,解析记录(可选)
+        {
+            wrapper.totalRow(context.getTotal())
+                    .invalidRow(context.getFailure())
+                    .insertRow(context.getSuccess())
+                    .importTime(DateTime.now().toDate())
+                    .respUrl(context.getResp())
+                    .setId(IdWorker.getId());
+
+            log.info("createFileImportRecord wrapper= {}", wrapper.jsonString());
+            // 生成入库记录
+            fileImportInfoService.add(wrapper);
+        }
+    }
+
+}

+ 66 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/FileImportInfoServiceImpl.java

@@ -0,0 +1,66 @@
+package com.yonge.cooleshow.biz.dal.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import org.springframework.beans.BeanUtils;
+import lombok.extern.slf4j.Slf4j;
+import com.yonge.cooleshow.biz.dal.entity.FileImportInfo;
+import com.yonge.cooleshow.biz.dal.wrapper.FileImportInfoWrapper;
+import com.yonge.cooleshow.biz.dal.mapper.FileImportInfoMapper;
+import com.yonge.cooleshow.biz.dal.service.FileImportInfoService;
+
+/**
+ * 文件数据导入
+ * 2023-09-19 19:47:50
+ */
+@Slf4j
+@Service
+public class FileImportInfoServiceImpl extends ServiceImpl<FileImportInfoMapper, FileImportInfo> implements FileImportInfoService {
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return FileImportInfo
+     */
+	@Override
+    public FileImportInfo detail(Long id) {
+        
+        return baseMapper.selectById(id);
+    }
+    
+    /**
+     * 分页查询
+     * @param page IPage<FileImportInfo>
+     * @param query FileImportInfoWrapper.FileImportInfoQuery
+     * @return IPage<FileImportInfo>
+     */
+    @Override
+    public IPage<FileImportInfo> selectPage(IPage<FileImportInfo> page, FileImportInfoWrapper.FileImportInfoQuery query) {
+        
+        return page.setRecords(baseMapper.selectPage(page, query));
+    }
+	
+    /**
+     * 添加
+     * @param fileImportInfo FileImportInfoWrapper.FileImportInfo
+     * @return Boolean
+     */
+    @Override
+    public Boolean add(FileImportInfoWrapper.FileImportInfo fileImportInfo) {    	
+        
+        return this.save(JSON.parseObject(fileImportInfo.jsonString(), FileImportInfo.class));
+    }
+
+    /**
+     * 更新
+     * @param fileImportInfo FileImportInfoWrapper.FileImportInfo
+     * @return Boolean
+     */
+    @Override
+    public Boolean update(FileImportInfoWrapper.FileImportInfo fileImportInfo){
+
+        return this.updateById(JSON.parseObject(fileImportInfo.jsonString(), FileImportInfo.class));       
+    }
+}

+ 8 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MemberPriceSettingsServiceImpl.java

@@ -118,15 +118,21 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
         return HttpResponseResult.succeed(orderCreateRes);
     }
 
-
     @Override
     public void orderSuccess(UserOrderDetailVo orderDetailVo) {
+        orderSuccess(orderDetailVo,true);
+    }
+
+    @Override
+    public void orderSuccess(UserOrderDetailVo orderDetailVo,boolean messageFlag) {
 
         VipCardRecord vipCardRecord = vipCardRecordService.buildVipCardRecordByOrderDetail(orderDetailVo);
 
         UserVipInfoVo userVipInfoVo = getUserVipInfoVo(vipCardRecord);
         //会员购买消息推送
-        authSend(userVipInfoVo.getUserId(), userVipInfoVo.getPhone(), DateUtil.format(vipCardRecord.getEndTime(), DateUtil.DEFAULT_PATTERN),orderDetailVo.getOrderClient());
+        if (messageFlag) {
+            authSend(userVipInfoVo.getUserId(), userVipInfoVo.getPhone(), DateUtil.format(vipCardRecord.getEndTime(), DateUtil.DEFAULT_PATTERN), orderDetailVo.getOrderClient());
+        }
     }
 
 

+ 18 - 16
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PaymentDivMemberRecordServiceImpl.java

@@ -340,11 +340,11 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
         }
 
         // 消息通知
-        CompletableFuture.runAsync(() -> {
-                    musicSheetService.sendBuyMessage(userPaymentOrder.getMerchId(), userPaymentOrder.getUserId(),
-                            userPaymentOrder.getBizId(), userPaymentOrder.getOrderClient(), userPaymentOrder.getOrderType());
-                }
-        );
+//        CompletableFuture.runAsync(() -> {
+//                    musicSheetService.sendBuyMessage(userPaymentOrder.getMerchId(), userPaymentOrder.getUserId(),
+//                            userPaymentOrder.getBizId(), userPaymentOrder.getOrderClient(), userPaymentOrder.getOrderType());
+//                }
+//        );
 
 
         // 计算分润
@@ -462,7 +462,7 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
 
         //消息推送
         try {
-            courseScheduleService.practiceSend(paymentList.get(0).getTeacherId(), userPaymentOrder.getUserId(), paymentList.size() + "", orderNo);
+//            courseScheduleService.practiceSend(paymentList.get(0).getTeacherId(), userPaymentOrder.getUserId(), paymentList.size() + "", orderNo);
         } catch (Exception e) {
             log.error("陪练课消息推送失败");
         }
@@ -587,7 +587,7 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
         }
         log.info("buyLiveCourseSuccess ok");
         //课程购买成功后进行消息推送
-        courseGroupService.buyLiveSendMessage(studentPayment, courseGroup);
+//        courseGroupService.buyLiveSendMessage(studentPayment, courseGroup);
     }
 
     @Override
@@ -665,7 +665,7 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
         saveData(userPaymentOrder, tenantdivMap, teacherMap, bizMap);
 
 
-        videoLessonPurchaseRecordService.videoSend(lessonGroup.getTeacherId(), purchaseRecord.getStudentId(), lessonGroup);
+//        videoLessonPurchaseRecordService.videoSend(lessonGroup.getTeacherId(), purchaseRecord.getStudentId(), lessonGroup);
 
         // 赠品曲目、专辑插入用户曲目购买记录表
         List<CourseRelationMusicAlbum> musicAlbums = courseRelationMusicAlbumService.lambdaQuery()
@@ -742,7 +742,7 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
         // 计算分润
         teacherAmount(userPaymentOrder, tenantdivMap, teacherMap, serviceFeeAmount);
 
-        memberPriceSettingsService.orderSuccess(userPaymentOrder);
+        memberPriceSettingsService.orderSuccess(userPaymentOrder,false);
 
         saveData(userPaymentOrder, tenantdivMap, teacherMap, bizMap);
     }
@@ -768,7 +768,7 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
         teacherAmount(userPaymentOrder, tenantdivMap, teacherMap, serviceFeeAmount);
 
 
-        activityPlanService.orderSuccess(userPaymentOrder);
+        activityPlanService.orderSuccess(userPaymentOrder,false);
 
         saveData(userPaymentOrder, tenantdivMap, teacherMap, bizMap);
     }
@@ -941,10 +941,18 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
 
             AccountBizTypeEnum bizTypeEnum = AccountBizTypeEnum.valueOf(userPaymentOrder.getGoodType().getCode());
 
+
+            // 写入平台支出表
+            PlatformCashAccountRecord platformCashAccountRecord2 = new PlatformCashAccountRecord(userPaymentOrder.getUserId(), amount,
+                    InOrOutEnum.OUT, PostStatusEnum.WAIT, AccountBizTypeEnum.valueOf(userPaymentOrder.getOrderType().name()), userPaymentOrder.getBizId(),
+                    userPaymentOrder.getOrderNo(), date);
+            platformCashAccountRecordService.save(platformCashAccountRecord2);
+
             // 写入机构流水表
             TenantAccountRecord tenantAccountRecord = TenantAccountRecord.builder()
                     .tenantId(tenantId)
                     .transAmount(amount)
+                    .platformCashAccountRecordId(platformCashAccountRecord2.getId())
                     .inOrOut(InOrOutEnum.IN.getCode())
                     .postStatus(PostStatusEnum.WAIT.getCode())
                     .bizType(bizTypeEnum.getCode())
@@ -954,12 +962,6 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
                     .build();
             tenantAccountRecordList.add(tenantAccountRecord);
 
-
-            // 写入平台支出表
-            PlatformCashAccountRecord platformCashAccountRecord2 = new PlatformCashAccountRecord(userPaymentOrder.getUserId(), amount,
-                    InOrOutEnum.OUT, PostStatusEnum.WAIT, AccountBizTypeEnum.valueOf(userPaymentOrder.getOrderType().name()), userPaymentOrder.getBizId(),
-                    userPaymentOrder.getOrderNo(), date);
-            platformCashAccountRecordService.save(platformCashAccountRecord2);
         });
         tenantAccountRecordService.saveBatch(tenantAccountRecordList);
     }

+ 45 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantAccountRecordServiceImpl.java

@@ -3,8 +3,12 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord;
 import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
+import com.yonge.cooleshow.biz.dal.execl.entity.TenantAccountRecordImport;
+import com.yonge.cooleshow.biz.dal.service.PlatformCashAccountRecordService;
 import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -14,6 +18,7 @@ import com.yonge.cooleshow.biz.dal.entity.TenantAccountRecord;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantAccountRecordWrapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantAccountRecordMapper;
 import com.yonge.cooleshow.biz.dal.service.TenantAccountRecordService;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 import java.util.Map;
@@ -30,6 +35,9 @@ public class TenantAccountRecordServiceImpl extends ServiceImpl<TenantAccountRec
     @Autowired
     private TenantInfoService tenantInfoService;
 
+    @Autowired
+    private PlatformCashAccountRecordService platformCashAccountRecordService;
+
 	/**
      * 查询详情
      * @param id 详情ID
@@ -101,4 +109,41 @@ public class TenantAccountRecordServiceImpl extends ServiceImpl<TenantAccountRec
     public TenantAccountRecordWrapper.TenantAccountRecordStat getStatistics(TenantAccountRecordWrapper.TenantAccountRecordQuery query) {
         return baseMapper.getStatistics(query);
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updatePostStatus(List<TenantAccountRecordImport> importList) {
+        if (CollectionUtils.isEmpty(importList)) {
+            return;
+        }
+        // 过滤出结算成功的
+        List<TenantAccountRecordImport> collect = importList.stream().filter(o -> o.getPostStatus().equals(PostStatusEnum.RECORDED)).collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(collect)) {
+            return;
+        }
+
+        // id 集合
+        List<String> ids = collect.stream().map(o -> o.getId()).collect(Collectors.toList());
+        List<TenantAccountRecord> list = this.lambdaQuery()
+                .in(TenantAccountRecord::getId, ids)
+                .list();
+        if (CollectionUtils.isEmpty(list)) {
+            return;
+        }
+
+        this.lambdaUpdate()
+                .in(TenantAccountRecord::getId, ids)
+                .set(TenantAccountRecord::getPostStatus,PostStatusEnum.RECORDED)
+                .update();
+
+        // 平台支出ID集合
+        List<Long> platformCashAccountRecordIds = list.stream().map(o -> o.getPlatformCashAccountRecordId()).collect(Collectors.toList());
+
+        platformCashAccountRecordService.lambdaUpdate()
+                .in(PlatformCashAccountRecord::getId,platformCashAccountRecordIds)
+                .set(PlatformCashAccountRecord::getPostStatus,PostStatusEnum.RECORDED)
+                .update();
+
+
+    }
 }

+ 172 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/FileImportInfoWrapper.java

@@ -0,0 +1,172 @@
+package com.yonge.cooleshow.biz.dal.wrapper;
+
+import com.alibaba.fastjson.JSON;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.microsvc.toolkit.common.webportal.validation.annotation.EnumValidation;
+import com.yonge.cooleshow.common.enums.EImportType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+import java.util.Optional;
+
+@Data
+public class FileImportInfoWrapper {
+
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" FileImportInfoQuery-文件数据导入")
+    public static class FileImportInfoQuery implements QueryInfo {
+
+        @ApiModelProperty("当前页")
+        private Integer page;
+
+        @ApiModelProperty("分页行数")
+        private Integer rows;
+
+        @ApiModelProperty("关键字匹配")
+        private String keyword;
+
+        public String getKeyword() {
+            return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
+        }
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static FileImportInfoQuery from(String json) {
+            return JSON.parseObject(json, FileImportInfoQuery.class);
+        }
+    }
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" FileImportInfo-文件数据导入")
+    public static class FileImportInfo {
+
+        @ApiModelProperty("教材编号")
+        private String lessonId;
+
+        @ApiModelProperty("主键ID")
+        private Long id;
+
+        @ApiModelProperty("数据类型")
+        private EImportType dataType;
+
+        @ApiModelProperty("导入文件名")
+        private String fileName;
+
+        @ApiModelProperty("导入文件地址")
+        private String importUrl;
+
+        @ApiModelProperty("导入总行数")
+        private Integer totalRow;
+
+        @ApiModelProperty("无效记录")
+        private Integer invalidRow;
+
+        @ApiModelProperty("数据入库")
+        private Integer insertRow;
+
+        @ApiModelProperty("回执文件地址")
+        private String respUrl;
+
+        @ApiModelProperty("导入帐号")
+        private Long sysAccId;
+
+        @ApiModelProperty("导入时间")
+        private Date importTime;
+
+        @ApiModelProperty("导入完成时间")
+        private Date finishTime;
+
+        @ApiModelProperty("创建时间")
+        private Date createdTime;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static FileImportInfo from(String json) {
+            return JSON.parseObject(json, FileImportInfo.class);
+        }
+
+
+        public FileImportInfo sysAccId(String sysAccId) {
+            this.sysAccId = Long.parseLong(sysAccId);
+            return this;
+        }
+
+        public FileImportInfo totalRow(Integer totalRow) {
+            this.totalRow = totalRow;
+            return this;
+        }
+
+        public FileImportInfo invalidRow(Integer invalidRow) {
+            this.invalidRow = invalidRow;
+            return this;
+        }
+
+        public FileImportInfo insertRow(Integer insertRow) {
+            this.insertRow = insertRow;
+            return this;
+        }
+
+        public FileImportInfo respUrl(String respUrl) {
+            this.respUrl = respUrl;
+            return this;
+        }
+
+        public FileImportInfo importTime(Date importTime) {
+            this.importTime = importTime;
+            return this;
+        }
+
+        public FileImportInfo finishTime(Date finishTime) {
+            this.finishTime = finishTime;
+            return this;
+        }
+    }
+
+    @Data
+    @ApiModel(" FileImport-文件数据导入")
+    public static class FileImport {
+
+
+        @EnumValidation(clazz = EImportType.class, message = "数据类型不正确")
+        @ApiModelProperty("数据类型")
+        private EImportType dataType;
+
+        @NotNull(message = "文件名不能为空")
+        @ApiModelProperty("导入文件名")
+        private String fileName;
+
+        @NotNull(message = "文件地址不能为空")
+        @ApiModelProperty("导入文件地址")
+        private String importUrl;
+
+        @ApiModelProperty("导入帐号")
+        private Long sysAccId;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static FileImportInfo from(String json) {
+            return JSON.parseObject(json, FileImportInfo.class);
+        }
+    }
+
+}

+ 7 - 15
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAccountRecordWrapper.java

@@ -4,26 +4,18 @@ import com.alibaba.excel.annotation.ExcelIgnore;
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yonge.cooleshow.biz.dal.enums.AccountBizTypeEnum;
-import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
 import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
-
-import java.math.BigDecimal;
-import java.time.LocalDateTime;
-import java.util.Date;
-import java.util.Optional;
-
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.util.Date;
 
 /**
  * 机构流水表
@@ -184,10 +176,9 @@ public class TenantAccountRecordWrapper {
         @ExcelProperty("更新时间")
         private Date updateTime;
 
-//        @ApiModelProperty("是否结算")
-//        @ExcelProperty("是否结算")
-//
-//        private String ;
+        @ApiModelProperty("是否结算")
+        @ExcelProperty("是否完成结算")
+        private String settlement;
 
         public String jsonString() {
             return JSON.toJSONString(this);
@@ -197,4 +188,5 @@ public class TenantAccountRecordWrapper {
             return JSON.parseObject(json, TenantAccountRecord.class);
         }
     }
+
 }

+ 29 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/FileImportInfoMapper.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE  mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.yonge.cooleshow.biz.dal.mapper.FileImportInfoMapper">
+
+	 
+    
+    <!-- 表字段 -->
+    <sql id="baseColumns">
+         t.id_ AS id
+        , t.data_type_ AS dataType
+        , t.file_name_ AS fileName
+        , t.import_url_ AS importUrl
+        , t.total_row_ AS totalRow
+        , t.invalid_row_ AS invalidRow
+        , t.insert_row_ AS insertRow
+        , t.resp_url_ AS respUrl
+        , t.sys_acc_id_ AS sysAccId
+        , t.import_time_ AS importTime
+        , t.finish_time_ AS finishTime
+        , t.created_time AS createdTime
+        </sql> 
+    
+    <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.entity.FileImportInfo">
+		SELECT         
+        	<include refid="baseColumns" />
+		FROM file_import_info t
+	</select>
+    
+</mapper>