导入清单:取暖费 后端++
This commit is contained in:
parent
f5339d6237
commit
dd220a3417
@ -0,0 +1,149 @@
|
|||||||
|
package org.dromara.mps.controller;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
import jakarta.validation.constraints.*;
|
||||||
|
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
import org.dromara.common.excel.core.ExcelResult;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||||
|
import org.dromara.common.log.annotation.Log;
|
||||||
|
import org.dromara.common.web.core.BaseController;
|
||||||
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
|
import org.dromara.common.core.domain.R;
|
||||||
|
import org.dromara.common.core.validate.AddGroup;
|
||||||
|
import org.dromara.common.core.validate.EditGroup;
|
||||||
|
import org.dromara.common.log.enums.BusinessType;
|
||||||
|
import org.dromara.common.excel.utils.ExcelUtil;
|
||||||
|
import org.dromara.mps.domain.vo.MpsImportHeatVo;
|
||||||
|
import org.dromara.mps.domain.bo.MpsImportHeatBo;
|
||||||
|
import org.dromara.mps.service.IMpsImportHeatService;
|
||||||
|
import org.dromara.mps.domain.vo.MpsImportHeatImportVo;
|
||||||
|
import org.dromara.mps.listener.MpsImportHeatImportListener;
|
||||||
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导入取暖费信息
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-08-15
|
||||||
|
*/
|
||||||
|
@Validated
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/mps/importHeat")
|
||||||
|
public class MpsImportHeatController extends BaseController {
|
||||||
|
|
||||||
|
private final IMpsImportHeatService mpsImportHeatService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询取暖费信息列表
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("mps:importHeat:list")
|
||||||
|
@GetMapping("/list")
|
||||||
|
public TableDataInfo<MpsImportHeatVo> list(MpsImportHeatBo bo, PageQuery pageQuery) {
|
||||||
|
return mpsImportHeatService.queryPageList(bo, pageQuery);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出导入取暖费信息列表
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("mps:importHeat:export")
|
||||||
|
@Log(title = "导入取暖费信息", businessType = BusinessType.EXPORT)
|
||||||
|
@PostMapping("/export")
|
||||||
|
public void export(MpsImportHeatBo bo, HttpServletResponse response) {
|
||||||
|
List<MpsImportHeatVo> list = mpsImportHeatService.queryList(bo);
|
||||||
|
ExcelUtil.exportExcel(list, "导入取暖费信息", MpsImportHeatVo.class, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取导入模板
|
||||||
|
*/
|
||||||
|
@PostMapping("/importTemplate")
|
||||||
|
public void importTemplate(HttpServletResponse response) {
|
||||||
|
ExcelUtil.exportExcel(new ArrayList<>(), "导入取暖费信息", MpsImportHeatImportVo.class, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导入数据
|
||||||
|
*
|
||||||
|
* @param file 导入文件
|
||||||
|
* @param updateSupport 是否更新已存在数据
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Log(title = "导入取暖费信息", businessType = BusinessType.IMPORT)
|
||||||
|
@SaCheckPermission("mps:importHeat:import")
|
||||||
|
@PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
||||||
|
public R<Void> importData(@RequestPart("file") MultipartFile file,
|
||||||
|
boolean updateSupport,
|
||||||
|
@RequestParam @DateTimeFormat(pattern = "yyyy-MM") Date importMonth) throws Exception {
|
||||||
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
calendar.setTime(importMonth);
|
||||||
|
calendar.set(Calendar.HOUR_OF_DAY, 0);
|
||||||
|
calendar.set(Calendar.MINUTE, 0);
|
||||||
|
calendar.set(Calendar.SECOND, 0);
|
||||||
|
calendar.set(Calendar.MILLISECOND, 0);
|
||||||
|
//把导入月份的旧数据删除
|
||||||
|
mpsImportHeatService.deleteDataByMonth(calendar.getTime());
|
||||||
|
|
||||||
|
ExcelResult<MpsImportHeatImportVo> result = ExcelUtil.importExcel(file.getInputStream(), MpsImportHeatImportVo.class, new MpsImportHeatImportListener(updateSupport, calendar.getTime()));
|
||||||
|
return R.ok(result.getAnalysis());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取取暖费信息详细信息
|
||||||
|
*
|
||||||
|
* @param id 主键
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("mps:importHeat:query")
|
||||||
|
@GetMapping("/{id}")
|
||||||
|
public R<MpsImportHeatVo> getInfo(@NotNull(message = "主键不能为空")
|
||||||
|
@PathVariable BigDecimal id) {
|
||||||
|
return R.ok(mpsImportHeatService.queryById(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增取暖费信息
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("mps:importHeat:add")
|
||||||
|
@Log(title = "导入取暖费信息", businessType = BusinessType.INSERT)
|
||||||
|
@RepeatSubmit()
|
||||||
|
@PostMapping()
|
||||||
|
public R<Void> add(@Validated(AddGroup.class) @RequestBody MpsImportHeatBo bo) {
|
||||||
|
return toAjax(mpsImportHeatService.insertByBo(bo));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改取暖费信息
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("mps:importHeat:edit")
|
||||||
|
@Log(title = "导入取暖费信息", businessType = BusinessType.UPDATE)
|
||||||
|
@RepeatSubmit()
|
||||||
|
@PutMapping()
|
||||||
|
public R<Void> edit(@Validated(EditGroup.class) @RequestBody MpsImportHeatBo bo) {
|
||||||
|
return toAjax(mpsImportHeatService.updateByBo(bo));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除导入取暖费信息
|
||||||
|
*
|
||||||
|
* @param ids 主键串
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("mps:importHeat:remove")
|
||||||
|
@Log(title = "导入取暖费信息", businessType = BusinessType.DELETE)
|
||||||
|
@DeleteMapping("/{ids}")
|
||||||
|
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||||
|
@PathVariable BigDecimal[] ids) {
|
||||||
|
return toAjax(mpsImportHeatService.deleteWithValidByIds(List.of(ids), true));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,79 @@
|
|||||||
|
package org.dromara.mps.domain;
|
||||||
|
|
||||||
|
import org.dromara.common.tenant.core.TenantEntity;
|
||||||
|
import com.baomidou.mybatisplus.annotation.*;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.Date;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导入取暖费信息对象 mps_import_heat
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-08-15
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@TableName("mps_import_heat")
|
||||||
|
public class MpsImportHeat extends TenantEntity {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主键
|
||||||
|
*/
|
||||||
|
@TableId(value = "id")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户编码
|
||||||
|
*/
|
||||||
|
private String userCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户地址
|
||||||
|
*/
|
||||||
|
private String userAddress;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 费用类别
|
||||||
|
*/
|
||||||
|
private String feeType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 缴费金额
|
||||||
|
*/
|
||||||
|
private BigDecimal paymentAmount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 加热器金额
|
||||||
|
*/
|
||||||
|
private BigDecimal heaterAmount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 缴费日期
|
||||||
|
*/
|
||||||
|
private Date paymentDate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流水号
|
||||||
|
*/
|
||||||
|
private String transactionId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 订单状态
|
||||||
|
*/
|
||||||
|
private String orderStatus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计价月份
|
||||||
|
*/
|
||||||
|
private Date importTime;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,80 @@
|
|||||||
|
package org.dromara.mps.domain.bo;
|
||||||
|
|
||||||
|
import org.dromara.mps.domain.MpsImportHeat;
|
||||||
|
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||||
|
import org.dromara.common.core.validate.AddGroup;
|
||||||
|
import org.dromara.common.core.validate.EditGroup;
|
||||||
|
import io.github.linpeilie.annotations.AutoMapper;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import jakarta.validation.constraints.*;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.Date;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导入取暖费信息业务对象 mps_import_heat
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-08-15
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@AutoMapper(target = MpsImportHeat.class, reverseConvertGenerate = false)
|
||||||
|
public class MpsImportHeatBo extends BaseEntity {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主键
|
||||||
|
*/
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户编码
|
||||||
|
*/
|
||||||
|
@NotBlank(message = "用户编码不能为空", groups = { AddGroup.class })
|
||||||
|
private String userCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户地址
|
||||||
|
*/
|
||||||
|
private String userAddress;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 费用类别
|
||||||
|
*/
|
||||||
|
private String feeType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 缴费金额
|
||||||
|
*/
|
||||||
|
private BigDecimal paymentAmount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 加热器金额
|
||||||
|
*/
|
||||||
|
private BigDecimal heaterAmount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 缴费日期
|
||||||
|
*/
|
||||||
|
private Date paymentDate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流水号
|
||||||
|
*/
|
||||||
|
private String transactionId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 订单状态
|
||||||
|
*/
|
||||||
|
private String orderStatus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计价月份
|
||||||
|
*/
|
||||||
|
@NotNull(message = "计价月份不能为空", groups = { AddGroup.class })
|
||||||
|
private Date importTime;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,98 @@
|
|||||||
|
package org.dromara.mps.domain.vo;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.Date;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
|
||||||
|
import cn.idev.excel.annotation.ExcelProperty;
|
||||||
|
import org.dromara.common.excel.annotation.ExcelDictFormat;
|
||||||
|
import org.dromara.common.excel.convert.ExcelDictConvert;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导入取暖费信息视图对象 mps_import_heat
|
||||||
|
*
|
||||||
|
* 自行按照业务需要修改模板列
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-08-15
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
// @Accessors(chain = true) // 导入不允许使用 会找不到set方法
|
||||||
|
public class MpsImportHeatImportVo implements Serializable {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主键
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "主键")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户编码
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "用户编码")
|
||||||
|
private String userCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户地址
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "用户地址")
|
||||||
|
private String userAddress;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 费用类别
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "费用类别")
|
||||||
|
private String feeType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 缴费金额
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "缴费金额")
|
||||||
|
private BigDecimal paymentAmount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 加热器金额
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "加热器金额")
|
||||||
|
private BigDecimal heaterAmount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 缴费日期
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "缴费日期")
|
||||||
|
private Date paymentDate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流水号
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "流水号")
|
||||||
|
private String transactionId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 订单状态
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "订单状态")
|
||||||
|
private String orderStatus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计价月份
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "计价月份")
|
||||||
|
@DateTimeFormat(pattern = "yyyy-MM")
|
||||||
|
private Date importTime;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,95 @@
|
|||||||
|
package org.dromara.mps.domain.vo;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.Date;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
import org.dromara.mps.domain.MpsImportHeat;
|
||||||
|
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
|
||||||
|
import cn.idev.excel.annotation.ExcelProperty;
|
||||||
|
import org.dromara.common.excel.annotation.ExcelDictFormat;
|
||||||
|
import org.dromara.common.excel.convert.ExcelDictConvert;
|
||||||
|
import io.github.linpeilie.annotations.AutoMapper;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导入取暖费信息视图对象 mps_import_heat
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-08-15
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ExcelIgnoreUnannotated
|
||||||
|
@AutoMapper(target = MpsImportHeat.class)
|
||||||
|
public class MpsImportHeatVo implements Serializable {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主键
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "主键")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户编码
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "用户编码")
|
||||||
|
private String userCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户地址
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "用户地址")
|
||||||
|
private String userAddress;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 费用类别
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "费用类别")
|
||||||
|
private String feeType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 缴费金额
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "缴费金额")
|
||||||
|
private BigDecimal paymentAmount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 加热器金额
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "加热器金额")
|
||||||
|
private BigDecimal heaterAmount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 缴费日期
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "缴费日期")
|
||||||
|
private Date paymentDate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流水号
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "流水号")
|
||||||
|
private String transactionId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 订单状态
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "订单状态")
|
||||||
|
private String orderStatus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计价月份
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "计价月份")
|
||||||
|
private Date importTime;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,140 @@
|
|||||||
|
package org.dromara.mps.listener;
|
||||||
|
|
||||||
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
|
import cn.hutool.http.HtmlUtil;
|
||||||
|
import cn.idev.excel.context.AnalysisContext;
|
||||||
|
import cn.idev.excel.event.AnalysisEventListener;
|
||||||
|
import jakarta.validation.ConstraintViolation;
|
||||||
|
import jakarta.validation.ConstraintViolationException;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.dromara.common.core.exception.ServiceException;
|
||||||
|
import org.dromara.common.core.utils.SpringUtils;
|
||||||
|
import org.dromara.common.core.utils.StreamUtils;
|
||||||
|
import org.dromara.common.core.utils.ValidatorUtils;
|
||||||
|
import org.dromara.common.excel.core.ExcelListener;
|
||||||
|
import org.dromara.common.excel.core.ExcelResult;
|
||||||
|
import org.dromara.common.satoken.utils.LoginHelper;
|
||||||
|
import org.dromara.mps.domain.MpsImportHeat;
|
||||||
|
import org.dromara.mps.domain.bo.MpsImportHeatBo;
|
||||||
|
import org.dromara.mps.domain.vo.MpsImportHeatImportVo;
|
||||||
|
import org.dromara.mps.service.IMpsImportHeatService;
|
||||||
|
import cn.hutool.core.lang.Pair;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义导入
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
public class MpsImportHeatImportListener extends AnalysisEventListener<MpsImportHeatImportVo> implements ExcelListener<MpsImportHeatImportVo> {
|
||||||
|
|
||||||
|
private final IMpsImportHeatService mpsImportHeatService;
|
||||||
|
private final Boolean isUpdateSupport;
|
||||||
|
private final Long operUserId;
|
||||||
|
private int countN = 1;
|
||||||
|
private final Date importMonth;
|
||||||
|
// 存储所有解析成功的对象
|
||||||
|
private final Collection<MpsImportHeat> successList = new ArrayList<>();
|
||||||
|
|
||||||
|
//TODO 考虑展示数据还是行数,暂定行数
|
||||||
|
// 存储所有解析失败的对象及错误信息
|
||||||
|
//private final Collection<Pair<MpsImportHeatImportVo, String>> failureList = new ArrayList<>();
|
||||||
|
private final Collection<Pair<Integer, String>> failureList = new ArrayList<>();
|
||||||
|
|
||||||
|
public MpsImportHeatImportListener(Boolean isUpdateSupport, Date importMonth) {
|
||||||
|
this.mpsImportHeatService = SpringUtils.getBean(IMpsImportHeatService.class);
|
||||||
|
this.isUpdateSupport = isUpdateSupport;
|
||||||
|
this.operUserId = LoginHelper.getUserId();
|
||||||
|
this.importMonth = importMonth;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void invoke(MpsImportHeatImportVo mpsImportHeatImportVo, AnalysisContext context) {
|
||||||
|
try {
|
||||||
|
countN++;
|
||||||
|
|
||||||
|
//TODO 自行实现验重逻辑
|
||||||
|
//MpsImportHeatVo mpsImportHeatVo1 = this.mpsImportHeatService.queryById(mpsImportHeatVo.getDataId());
|
||||||
|
|
||||||
|
// 1. 基本数据验证
|
||||||
|
ValidatorUtils.validate(mpsImportHeatImportVo);
|
||||||
|
|
||||||
|
// 2. 转换为业务对象
|
||||||
|
MpsImportHeat mpsImportHeat = BeanUtil.toBean(mpsImportHeatImportVo, MpsImportHeat.class);
|
||||||
|
|
||||||
|
mpsImportHeat.setImportTime(this.importMonth);
|
||||||
|
// 3. 添加到成功列表(稍后批量处理)
|
||||||
|
successList.add(mpsImportHeat);
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
// 捕获并记录所有验证错误
|
||||||
|
String errorMsg = e.getMessage();
|
||||||
|
if (e instanceof ConstraintViolationException cvException) {
|
||||||
|
errorMsg = StreamUtils.join(cvException.getConstraintViolations(),
|
||||||
|
ConstraintViolation::getMessage, ", ");
|
||||||
|
}
|
||||||
|
failureList.add(Pair.of(countN, errorMsg));
|
||||||
|
log.error("数据验证失败: {}", errorMsg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void doAfterAllAnalysed(AnalysisContext context) {
|
||||||
|
// 所有数据解析完成后执行批量操作
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ExcelResult<MpsImportHeatImportVo> getExcelResult() {
|
||||||
|
// 存在验证错误则直接返回错误
|
||||||
|
if (!failureList.isEmpty()) {
|
||||||
|
StringBuilder errorMsg = new StringBuilder("数据验证失败,共 ")
|
||||||
|
.append(failureList.size())
|
||||||
|
.append(" 条错误:<br/>");
|
||||||
|
failureList.forEach(pair ->
|
||||||
|
//errorMsg.append("\n行数据: ")
|
||||||
|
errorMsg.append("行数[")
|
||||||
|
.append(pair.getKey())
|
||||||
|
.append("],")
|
||||||
|
.append("错误:")
|
||||||
|
.append(pair.getValue())
|
||||||
|
.append("<br/>"));
|
||||||
|
throw new ServiceException(errorMsg.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 执行事务性批量导入
|
||||||
|
mpsImportHeatService.batchInsertOrUpdate(successList, isUpdateSupport);
|
||||||
|
return createSuccessResult();
|
||||||
|
} catch (Exception e) {
|
||||||
|
// 事务回滚,整体导入失败
|
||||||
|
log.error("批量导入失败", e);
|
||||||
|
throw new ServiceException("导入失败: " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ExcelResult<MpsImportHeatImportVo> createSuccessResult() {
|
||||||
|
return new ExcelResult<>() {
|
||||||
|
@Override
|
||||||
|
public String getAnalysis() {
|
||||||
|
return "成功导入 " + successList.size() + " 条数据";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<MpsImportHeatImportVo> getList() {
|
||||||
|
return successList.stream()
|
||||||
|
.map(bo -> BeanUtil.toBean(bo, MpsImportHeatImportVo.class))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getErrorList() {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,36 @@
|
|||||||
|
package org.dromara.mps.mapper;
|
||||||
|
|
||||||
|
import org.dromara.mps.domain.MpsImportHeat;
|
||||||
|
import org.dromara.mps.domain.vo.MpsImportHeatVo;
|
||||||
|
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.Constants;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
import org.dromara.common.mybatis.annotation.DataColumn;
|
||||||
|
import org.dromara.common.mybatis.annotation.DataPermission;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导入取暖费信息Mapper接口
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-08-15
|
||||||
|
*/
|
||||||
|
public interface MpsImportHeatMapper extends BaseMapperPlus<MpsImportHeat, MpsImportHeatVo> {
|
||||||
|
|
||||||
|
@DataPermission({
|
||||||
|
@DataColumn(key = "deptName", value = "create_dept"),
|
||||||
|
@DataColumn(key = "userName", value = "create_by")
|
||||||
|
})
|
||||||
|
default Page<MpsImportHeatVo> selectPageMpsImportHeatList(Page<MpsImportHeat> page, Wrapper<MpsImportHeat> queryWrapper) {
|
||||||
|
return this.selectVoPage(page, queryWrapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//@DataPermission({
|
||||||
|
// @DataColumn(key = "deptName", value = "create_dept"),
|
||||||
|
// @DataColumn(key = "userName", value = "create_by")
|
||||||
|
//})
|
||||||
|
// List<SysUserExportVo> selectMpsImportHeatExportList(@Param(Constants.WRAPPER) Wrapper<MpsImportHeat> queryWrapper);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,79 @@
|
|||||||
|
package org.dromara.mps.service;
|
||||||
|
|
||||||
|
import org.dromara.mps.domain.MpsImportHeat;
|
||||||
|
import org.dromara.mps.domain.vo.MpsImportHeatVo;
|
||||||
|
import org.dromara.mps.domain.bo.MpsImportHeatBo;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导入取暖费信息Service接口
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-08-15
|
||||||
|
*/
|
||||||
|
public interface IMpsImportHeatService {
|
||||||
|
|
||||||
|
//事务性批量处理
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
void batchInsertOrUpdate(Collection<MpsImportHeat> list, Boolean isUpdateSupport);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询导入取暖费信息
|
||||||
|
*
|
||||||
|
* @param id 主键
|
||||||
|
* @return 导入取暖费信息
|
||||||
|
*/
|
||||||
|
MpsImportHeatVo queryById(BigDecimal id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分页查询导入取暖费信息列表
|
||||||
|
*
|
||||||
|
* @param bo 查询条件
|
||||||
|
* @param pageQuery 分页参数
|
||||||
|
* @return 导入取暖费信息分页列表
|
||||||
|
*/
|
||||||
|
TableDataInfo<MpsImportHeatVo> queryPageList(MpsImportHeatBo bo, PageQuery pageQuery);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询符合条件的导入取暖费信息列表
|
||||||
|
*
|
||||||
|
* @param bo 查询条件
|
||||||
|
* @return 导入取暖费信息列表
|
||||||
|
*/
|
||||||
|
List<MpsImportHeatVo> queryList(MpsImportHeatBo bo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增导入取暖费信息
|
||||||
|
*
|
||||||
|
* @param bo 导入取暖费信息
|
||||||
|
* @return 是否新增成功
|
||||||
|
*/
|
||||||
|
Boolean insertByBo(MpsImportHeatBo bo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改导入取暖费信息
|
||||||
|
*
|
||||||
|
* @param bo 导入取暖费信息
|
||||||
|
* @return 是否修改成功
|
||||||
|
*/
|
||||||
|
Boolean updateByBo(MpsImportHeatBo bo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校验并批量删除导入取暖费信息信息
|
||||||
|
*
|
||||||
|
* @param ids 待删除的主键集合
|
||||||
|
* @param isValid 是否进行有效性校验
|
||||||
|
* @return 是否删除成功
|
||||||
|
*/
|
||||||
|
Boolean deleteWithValidByIds(Collection<BigDecimal> ids, Boolean isValid);
|
||||||
|
|
||||||
|
Boolean deleteDataByMonth(Date importMonth);
|
||||||
|
}
|
@ -0,0 +1,179 @@
|
|||||||
|
package org.dromara.mps.service.impl;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import org.dromara.common.core.utils.MapstructUtils;
|
||||||
|
import org.dromara.common.core.utils.StringUtils;
|
||||||
|
import org.dromara.common.core.exception.ServiceException;
|
||||||
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.dromara.mps.domain.bo.MpsImportHeatBo;
|
||||||
|
import org.dromara.mps.domain.vo.MpsImportHeatVo;
|
||||||
|
import org.dromara.mps.domain.MpsImportHeat;
|
||||||
|
import org.dromara.mps.mapper.MpsImportHeatMapper;
|
||||||
|
import org.dromara.mps.service.IMpsImportHeatService;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导入取暖费信息Service业务层处理
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-08-15
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@Service
|
||||||
|
public class MpsImportHeatServiceImpl implements IMpsImportHeatService {
|
||||||
|
|
||||||
|
private final MpsImportHeatMapper baseMapper;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public void batchInsertOrUpdate(Collection<MpsImportHeat> list, Boolean isUpdateSupport) {
|
||||||
|
if (CollUtil.isEmpty(list)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 业务校验(可选),参照demo
|
||||||
|
//validateBusinessRules(list);
|
||||||
|
|
||||||
|
// 2. 批量插入/更新
|
||||||
|
if (isUpdateSupport) {
|
||||||
|
baseMapper.insertOrUpdateBatch(list);
|
||||||
|
} else {
|
||||||
|
baseMapper.insertBatch(list);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 示例:业务重复检查
|
||||||
|
/*private void validateBusinessRules(Collection<MpsImportHeatBo> list) {
|
||||||
|
Set<String> uniqueKeys = new HashSet<>();
|
||||||
|
for (MpsImportHeatBo bo : list) {
|
||||||
|
String key = bo.getCustAcctNo();
|
||||||
|
if (uniqueKeys.contains(key)) {
|
||||||
|
throw new ServiceException("重复的客户账号: " + key);
|
||||||
|
}
|
||||||
|
uniqueKeys.add(key);
|
||||||
|
}
|
||||||
|
} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询导入取暖费信息
|
||||||
|
*
|
||||||
|
* @param id 主键
|
||||||
|
* @return 导入取暖费信息
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public MpsImportHeatVo queryById(BigDecimal id){
|
||||||
|
return baseMapper.selectVoById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分页查询导入取暖费信息列表
|
||||||
|
*
|
||||||
|
* @param bo 查询条件
|
||||||
|
* @param pageQuery 分页参数
|
||||||
|
* @return 导入取暖费信息分页列表
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public TableDataInfo<MpsImportHeatVo> queryPageList(MpsImportHeatBo bo, PageQuery pageQuery) {
|
||||||
|
LambdaQueryWrapper<MpsImportHeat> lqw = buildQueryWrapper(bo);
|
||||||
|
Page<MpsImportHeatVo> result = baseMapper.selectPageMpsImportHeatList(pageQuery.build(), lqw);
|
||||||
|
return TableDataInfo.build(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询符合条件的导入取暖费信息列表
|
||||||
|
*
|
||||||
|
* @param bo 查询条件
|
||||||
|
* @return 导入取暖费信息列表
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<MpsImportHeatVo> queryList(MpsImportHeatBo bo) {
|
||||||
|
LambdaQueryWrapper<MpsImportHeat> lqw = buildQueryWrapper(bo);
|
||||||
|
return baseMapper.selectVoList(lqw);
|
||||||
|
}
|
||||||
|
|
||||||
|
private LambdaQueryWrapper<MpsImportHeat> buildQueryWrapper(MpsImportHeatBo bo) {
|
||||||
|
Map<String, Object> params = bo.getParams();
|
||||||
|
LambdaQueryWrapper<MpsImportHeat> lqw = Wrappers.lambdaQuery();
|
||||||
|
lqw.orderByAsc(MpsImportHeat::getId);
|
||||||
|
lqw.eq(StringUtils.isNotBlank(bo.getUserCode()), MpsImportHeat::getUserCode, bo.getUserCode());
|
||||||
|
lqw.eq(StringUtils.isNotBlank(bo.getUserAddress()), MpsImportHeat::getUserAddress, bo.getUserAddress());
|
||||||
|
lqw.eq(StringUtils.isNotBlank(bo.getFeeType()), MpsImportHeat::getFeeType, bo.getFeeType());
|
||||||
|
lqw.eq(bo.getPaymentAmount() != null, MpsImportHeat::getPaymentAmount, bo.getPaymentAmount());
|
||||||
|
lqw.eq(bo.getHeaterAmount() != null, MpsImportHeat::getHeaterAmount, bo.getHeaterAmount());
|
||||||
|
lqw.eq(bo.getPaymentDate() != null, MpsImportHeat::getPaymentDate, bo.getPaymentDate());
|
||||||
|
lqw.eq(StringUtils.isNotBlank(bo.getTransactionId()), MpsImportHeat::getTransactionId, bo.getTransactionId());
|
||||||
|
lqw.eq(StringUtils.isNotBlank(bo.getOrderStatus()), MpsImportHeat::getOrderStatus, bo.getOrderStatus());
|
||||||
|
lqw.eq(bo.getImportTime() != null, MpsImportHeat::getImportTime, bo.getImportTime());
|
||||||
|
return lqw;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增导入取暖费信息
|
||||||
|
*
|
||||||
|
* @param bo 导入取暖费信息
|
||||||
|
* @return 是否新增成功
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Boolean insertByBo(MpsImportHeatBo bo) {
|
||||||
|
MpsImportHeat add = MapstructUtils.convert(bo, MpsImportHeat.class);
|
||||||
|
validEntityBeforeSave(add);
|
||||||
|
boolean flag = baseMapper.insert(add) > 0;
|
||||||
|
if (flag) {
|
||||||
|
bo.setId(add.getId());
|
||||||
|
}
|
||||||
|
return flag;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改导入取暖费信息
|
||||||
|
*
|
||||||
|
* @param bo 导入取暖费信息
|
||||||
|
* @return 是否修改成功
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Boolean updateByBo(MpsImportHeatBo bo) {
|
||||||
|
MpsImportHeat update = MapstructUtils.convert(bo, MpsImportHeat.class);
|
||||||
|
validEntityBeforeSave(update);
|
||||||
|
return baseMapper.updateById(update) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存前的数据校验
|
||||||
|
*/
|
||||||
|
private void validEntityBeforeSave(MpsImportHeat entity){
|
||||||
|
//TODO 做一些数据校验,如唯一约束
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校验并批量删除导入取暖费信息信息
|
||||||
|
*
|
||||||
|
* @param ids 待删除的主键集合
|
||||||
|
* @param isValid 是否进行有效性校验
|
||||||
|
* @return 是否删除成功
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Boolean deleteWithValidByIds(Collection<BigDecimal> ids, Boolean isValid) {
|
||||||
|
if(isValid){
|
||||||
|
//TODO 做一些业务上的校验,判断是否需要校验
|
||||||
|
}
|
||||||
|
return baseMapper.deleteByIds(ids) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean deleteDataByMonth(Date importMonth) {
|
||||||
|
|
||||||
|
return baseMapper.delete(new LambdaQueryWrapper<MpsImportHeat>().eq(MpsImportHeat::getImportTime, importMonth))>0;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
<?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="org.dromara.mps.mapper.MpsImportHeatMapper">
|
||||||
|
|
||||||
|
</mapper>
|
Loading…
Reference in New Issue
Block a user