中间计价有效无效明细++
This commit is contained in:
parent
ae68380eb7
commit
29961247e0
@ -0,0 +1,133 @@
|
||||
package org.dromara.report.controller;
|
||||
|
||||
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.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.report.domain.vo.MarketingValidInvalidVo;
|
||||
import org.dromara.report.domain.bo.MarketingValidInvalidBo;
|
||||
import org.dromara.report.service.IMarketingValidInvalidService;
|
||||
import org.dromara.report.domain.vo.MarketingValidInvalidImportVo;
|
||||
import org.dromara.report.listener.MarketingValidInvalidImportListener;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
|
||||
/**
|
||||
* 员工中间业务有效/无效明细
|
||||
*
|
||||
* @author zzzj
|
||||
* @date 2025-08-29
|
||||
*/
|
||||
@Validated
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/report/validInvalid")
|
||||
public class MarketingValidInvalidController extends BaseController {
|
||||
|
||||
private final IMarketingValidInvalidService marketingValidInvalidService;
|
||||
|
||||
/**
|
||||
* 查询员工中间业务有效/无效明细列表
|
||||
*/
|
||||
@SaCheckPermission("report:validInvalid:list")
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo<MarketingValidInvalidVo> list(MarketingValidInvalidBo bo, PageQuery pageQuery) {
|
||||
return marketingValidInvalidService.queryPageList(bo, pageQuery);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出员工中间业务有效/无效明细列表
|
||||
*/
|
||||
@SaCheckPermission("report:validInvalid:export")
|
||||
@Log(title = "员工中间业务有效/无效明细", businessType = BusinessType.EXPORT)
|
||||
@PostMapping("/export")
|
||||
public void export(MarketingValidInvalidBo bo, HttpServletResponse response) {
|
||||
List<MarketingValidInvalidVo> list = marketingValidInvalidService.queryList(bo);
|
||||
ExcelUtil.exportExcel(list, "员工中间业务有效/无效明细", MarketingValidInvalidVo.class, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取导入模板
|
||||
*/
|
||||
@PostMapping("/importTemplate")
|
||||
public void importTemplate(HttpServletResponse response) {
|
||||
ExcelUtil.exportExcel(new ArrayList<>(), "员工中间业务有效/无效明细", MarketingValidInvalidImportVo.class, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导入数据
|
||||
*
|
||||
* @param file 导入文件
|
||||
* @param updateSupport 是否更新已存在数据
|
||||
*/
|
||||
@Log(title = "员工中间业务有效/无效明细", businessType = BusinessType.IMPORT)
|
||||
@SaCheckPermission("report:validInvalid:import")
|
||||
@PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
||||
public R<Void> importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception {
|
||||
ExcelResult<MarketingValidInvalidImportVo> result = ExcelUtil.importExcel(file.getInputStream(), MarketingValidInvalidImportVo.class, new MarketingValidInvalidImportListener(updateSupport));
|
||||
return R.ok(result.getAnalysis());
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取员工中间业务有效/无效明细详细信息
|
||||
*
|
||||
* @param id 主键
|
||||
*/
|
||||
@SaCheckPermission("report:validInvalid:query")
|
||||
@GetMapping("/{id}")
|
||||
public R<MarketingValidInvalidVo> getInfo(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long id) {
|
||||
return R.ok(marketingValidInvalidService.queryById(id));
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增员工中间业务有效/无效明细
|
||||
*/
|
||||
@SaCheckPermission("report:validInvalid:add")
|
||||
@Log(title = "员工中间业务有效/无效明细", businessType = BusinessType.INSERT)
|
||||
@RepeatSubmit()
|
||||
@PostMapping()
|
||||
public R<Void> add(@Validated(AddGroup.class) @RequestBody MarketingValidInvalidBo bo) {
|
||||
return toAjax(marketingValidInvalidService.insertByBo(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改员工中间业务有效/无效明细
|
||||
*/
|
||||
@SaCheckPermission("report:validInvalid:edit")
|
||||
@Log(title = "员工中间业务有效/无效明细", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit()
|
||||
@PutMapping()
|
||||
public R<Void> edit(@Validated(EditGroup.class) @RequestBody MarketingValidInvalidBo bo) {
|
||||
return toAjax(marketingValidInvalidService.updateByBo(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除员工中间业务有效/无效明细
|
||||
*
|
||||
* @param ids 主键串
|
||||
*/
|
||||
@SaCheckPermission("report:validInvalid:remove")
|
||||
@Log(title = "员工中间业务有效/无效明细", businessType = BusinessType.DELETE)
|
||||
@DeleteMapping("/{ids}")
|
||||
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||
@PathVariable Long[] ids) {
|
||||
return toAjax(marketingValidInvalidService.deleteWithValidByIds(List.of(ids), true));
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,96 @@
|
||||
package org.dromara.report.domain;
|
||||
|
||||
import org.dromara.common.tenant.core.TenantEntity;
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.io.Serial;
|
||||
|
||||
/**
|
||||
* 员工中间业务有效/无效明细对象 marketing_valid_invalid
|
||||
*
|
||||
* @author zzzj
|
||||
* @date 2025-08-29
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@TableName("marketing_valid_invalid")
|
||||
public class MarketingValidInvalid extends TenantEntity {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 主键
|
||||
*/
|
||||
@TableId(value = "id")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 支行名称
|
||||
*/
|
||||
private String branchName;
|
||||
|
||||
/**
|
||||
* 员工姓名
|
||||
*/
|
||||
private String employeeName;
|
||||
|
||||
/**
|
||||
* 营销编号
|
||||
*/
|
||||
private String marketingCode;
|
||||
|
||||
/**
|
||||
* 客户姓名
|
||||
*/
|
||||
private String customerName;
|
||||
|
||||
/**
|
||||
* 客户身份证号
|
||||
*/
|
||||
private String customerId;
|
||||
|
||||
/**
|
||||
* 无效的中间业务计价项目
|
||||
*/
|
||||
private String invalidBusiness;
|
||||
|
||||
/**
|
||||
* 有效的中间业务计价项目
|
||||
*/
|
||||
private String validBusiness;
|
||||
|
||||
/**
|
||||
* 有效无效标识
|
||||
*/
|
||||
private String checkFlag;
|
||||
|
||||
/**
|
||||
* 记录月份
|
||||
*/
|
||||
private String recordMonth;
|
||||
|
||||
/**
|
||||
* 冗余1
|
||||
*/
|
||||
private String fill1;
|
||||
|
||||
/**
|
||||
* 冗余2
|
||||
*/
|
||||
private String fill2;
|
||||
|
||||
/**
|
||||
* 冗余3
|
||||
*/
|
||||
private String fill3;
|
||||
|
||||
/**
|
||||
* 冗余4
|
||||
*/
|
||||
private String fill4;
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,99 @@
|
||||
package org.dromara.report.domain.bo;
|
||||
|
||||
import org.dromara.report.domain.MarketingValidInvalid;
|
||||
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.*;
|
||||
|
||||
/**
|
||||
* 员工中间业务有效/无效明细业务对象 marketing_valid_invalid
|
||||
*
|
||||
* @author zzzj
|
||||
* @date 2025-08-29
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@AutoMapper(target = MarketingValidInvalid.class, reverseConvertGenerate = false)
|
||||
public class MarketingValidInvalidBo extends BaseEntity {
|
||||
|
||||
/**
|
||||
* 主键
|
||||
*/
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 支行名称
|
||||
*/
|
||||
@NotBlank(message = "支行名称不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private String branchName;
|
||||
|
||||
/**
|
||||
* 员工姓名
|
||||
*/
|
||||
@NotBlank(message = "员工姓名不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private String employeeName;
|
||||
|
||||
/**
|
||||
* 营销编号
|
||||
*/
|
||||
@NotBlank(message = "营销编号不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private String marketingCode;
|
||||
|
||||
/**
|
||||
* 客户姓名
|
||||
*/
|
||||
private String customerName;
|
||||
|
||||
/**
|
||||
* 客户身份证号
|
||||
*/
|
||||
private String customerId;
|
||||
|
||||
/**
|
||||
* 无效的中间业务计价项目
|
||||
*/
|
||||
private String invalidBusiness;
|
||||
|
||||
/**
|
||||
* 有效的中间业务计价项目
|
||||
*/
|
||||
private String validBusiness;
|
||||
|
||||
/**
|
||||
* 有效无效标识
|
||||
*/
|
||||
@NotBlank(message = "有效无效标识不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private String checkFlag;
|
||||
|
||||
/**
|
||||
* 记录月份
|
||||
*/
|
||||
@NotBlank(message = "记录月份不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private String recordMonth;
|
||||
|
||||
/**
|
||||
* 冗余1
|
||||
*/
|
||||
private String fill1;
|
||||
|
||||
/**
|
||||
* 冗余2
|
||||
*/
|
||||
private String fill2;
|
||||
|
||||
/**
|
||||
* 冗余3
|
||||
*/
|
||||
private String fill3;
|
||||
|
||||
/**
|
||||
* 冗余4
|
||||
*/
|
||||
private String fill4;
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,116 @@
|
||||
package org.dromara.report.domain.vo;
|
||||
|
||||
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 java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 员工中间业务有效/无效明细视图对象 marketing_valid_invalid
|
||||
*
|
||||
* 自行按照业务需要修改模板列
|
||||
*
|
||||
* @author zzzj
|
||||
* @date 2025-08-29
|
||||
*/
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
// @Accessors(chain = true) // 导入不允许使用 会找不到set方法
|
||||
public class MarketingValidInvalidImportVo implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 主键
|
||||
*/
|
||||
@ExcelProperty(value = "主键")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 支行名称
|
||||
*/
|
||||
@ExcelProperty(value = "支行名称")
|
||||
private String branchName;
|
||||
|
||||
/**
|
||||
* 员工姓名
|
||||
*/
|
||||
@ExcelProperty(value = "员工姓名")
|
||||
private String employeeName;
|
||||
|
||||
/**
|
||||
* 营销编号
|
||||
*/
|
||||
@ExcelProperty(value = "营销编号")
|
||||
private String marketingCode;
|
||||
|
||||
/**
|
||||
* 客户姓名
|
||||
*/
|
||||
@ExcelProperty(value = "客户姓名")
|
||||
private String customerName;
|
||||
|
||||
/**
|
||||
* 客户身份证号
|
||||
*/
|
||||
@ExcelProperty(value = "客户身份证号")
|
||||
private String customerId;
|
||||
|
||||
/**
|
||||
* 无效的中间业务计价项目
|
||||
*/
|
||||
@ExcelProperty(value = "无效的中间业务计价项目")
|
||||
private String invalidBusiness;
|
||||
|
||||
/**
|
||||
* 有效的中间业务计价项目
|
||||
*/
|
||||
@ExcelProperty(value = "有效的中间业务计价项目")
|
||||
private String validBusiness;
|
||||
|
||||
/**
|
||||
* 有效无效标识
|
||||
*/
|
||||
@ExcelProperty(value = "有效无效标识")
|
||||
private String checkFlag;
|
||||
|
||||
/**
|
||||
* 记录月份
|
||||
*/
|
||||
@ExcelProperty(value = "记录月份")
|
||||
private String recordMonth;
|
||||
|
||||
/**
|
||||
* 冗余1
|
||||
*/
|
||||
@ExcelProperty(value = "冗余1")
|
||||
private String fill1;
|
||||
|
||||
/**
|
||||
* 冗余2
|
||||
*/
|
||||
@ExcelProperty(value = "冗余2")
|
||||
private String fill2;
|
||||
|
||||
/**
|
||||
* 冗余3
|
||||
*/
|
||||
@ExcelProperty(value = "冗余3")
|
||||
private String fill3;
|
||||
|
||||
/**
|
||||
* 冗余4
|
||||
*/
|
||||
@ExcelProperty(value = "冗余4")
|
||||
private String fill4;
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,116 @@
|
||||
package org.dromara.report.domain.vo;
|
||||
|
||||
import org.dromara.report.domain.MarketingValidInvalid;
|
||||
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;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 员工中间业务有效/无效明细视图对象 marketing_valid_invalid
|
||||
*
|
||||
* @author zzzj
|
||||
* @date 2025-08-29
|
||||
*/
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
@AutoMapper(target = MarketingValidInvalid.class)
|
||||
public class MarketingValidInvalidVo implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 主键
|
||||
*/
|
||||
@ExcelProperty(value = "主键")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 支行名称
|
||||
*/
|
||||
@ExcelProperty(value = "支行名称")
|
||||
private String branchName;
|
||||
|
||||
/**
|
||||
* 员工姓名
|
||||
*/
|
||||
@ExcelProperty(value = "员工姓名")
|
||||
private String employeeName;
|
||||
|
||||
/**
|
||||
* 营销编号
|
||||
*/
|
||||
@ExcelProperty(value = "营销编号")
|
||||
private String marketingCode;
|
||||
|
||||
/**
|
||||
* 客户姓名
|
||||
*/
|
||||
@ExcelProperty(value = "客户姓名")
|
||||
private String customerName;
|
||||
|
||||
/**
|
||||
* 客户身份证号
|
||||
*/
|
||||
@ExcelProperty(value = "客户身份证号")
|
||||
private String customerId;
|
||||
|
||||
/**
|
||||
* 无效的中间业务计价项目
|
||||
*/
|
||||
@ExcelProperty(value = "无效的中间业务计价项目")
|
||||
private String invalidBusiness;
|
||||
|
||||
/**
|
||||
* 有效的中间业务计价项目
|
||||
*/
|
||||
@ExcelProperty(value = "有效的中间业务计价项目")
|
||||
private String validBusiness;
|
||||
|
||||
/**
|
||||
* 有效无效标识
|
||||
*/
|
||||
@ExcelProperty(value = "有效无效标识")
|
||||
private String checkFlag;
|
||||
|
||||
/**
|
||||
* 记录月份
|
||||
*/
|
||||
@ExcelProperty(value = "记录月份")
|
||||
private String recordMonth;
|
||||
|
||||
/**
|
||||
* 冗余1
|
||||
*/
|
||||
@ExcelProperty(value = "冗余1")
|
||||
private String fill1;
|
||||
|
||||
/**
|
||||
* 冗余2
|
||||
*/
|
||||
@ExcelProperty(value = "冗余2")
|
||||
private String fill2;
|
||||
|
||||
/**
|
||||
* 冗余3
|
||||
*/
|
||||
@ExcelProperty(value = "冗余3")
|
||||
private String fill3;
|
||||
|
||||
/**
|
||||
* 冗余4
|
||||
*/
|
||||
@ExcelProperty(value = "冗余4")
|
||||
private String fill4;
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,140 @@
|
||||
package org.dromara.report.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.report.domain.MarketingValidInvalid;
|
||||
import org.dromara.report.domain.bo.MarketingValidInvalidBo;
|
||||
import org.dromara.report.domain.vo.MarketingValidInvalidImportVo;
|
||||
import org.dromara.report.service.IMarketingValidInvalidService;
|
||||
import cn.hutool.core.lang.Pair;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Collection;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 自定义导入
|
||||
*
|
||||
* @author Lion Li
|
||||
*/
|
||||
@Slf4j
|
||||
public class MarketingValidInvalidImportListener extends AnalysisEventListener<MarketingValidInvalidImportVo> implements ExcelListener<MarketingValidInvalidImportVo> {
|
||||
|
||||
private final IMarketingValidInvalidService marketingValidInvalidService;
|
||||
private final Boolean isUpdateSupport;
|
||||
private final Long operUserId;
|
||||
private int countN = 1;
|
||||
|
||||
// 存储所有解析成功的对象
|
||||
private final Collection<MarketingValidInvalid> successList = new ArrayList<>();
|
||||
|
||||
//TODO 考虑展示数据还是行数,暂定行数
|
||||
// 存储所有解析失败的对象及错误信息
|
||||
//private final Collection<Pair<MarketingValidInvalidImportVo, String>> failureList = new ArrayList<>();
|
||||
private final Collection<Pair<Integer, String>> failureList = new ArrayList<>();
|
||||
|
||||
public MarketingValidInvalidImportListener(Boolean isUpdateSupport) {
|
||||
this.marketingValidInvalidService = SpringUtils.getBean(IMarketingValidInvalidService.class);
|
||||
this.isUpdateSupport = isUpdateSupport;
|
||||
this.operUserId = LoginHelper.getUserId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void invoke(MarketingValidInvalidImportVo marketingValidInvalidImportVo, AnalysisContext context) {
|
||||
try {
|
||||
countN++;
|
||||
|
||||
//TODO 自行实现验重逻辑
|
||||
//MarketingValidInvalidVo marketingValidInvalidVo1 = this.marketingValidInvalidService.queryById(marketingValidInvalidVo.getDataId());
|
||||
|
||||
// 1. 基本数据验证
|
||||
ValidatorUtils.validate(marketingValidInvalidImportVo);
|
||||
|
||||
// 2. 转换为业务对象
|
||||
MarketingValidInvalid marketingValidInvalid = BeanUtil.toBean(marketingValidInvalidImportVo, MarketingValidInvalid.class);
|
||||
|
||||
// 3. 添加到成功列表(稍后批量处理)
|
||||
successList.add(marketingValidInvalid);
|
||||
|
||||
} 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<MarketingValidInvalidImportVo> 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 {
|
||||
// 执行事务性批量导入
|
||||
marketingValidInvalidService.batchInsertOrUpdate(successList, isUpdateSupport);
|
||||
return createSuccessResult();
|
||||
} catch (Exception e) {
|
||||
// 事务回滚,整体导入失败
|
||||
log.error("批量导入失败", e);
|
||||
throw new ServiceException("导入失败: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private ExcelResult<MarketingValidInvalidImportVo> createSuccessResult() {
|
||||
return new ExcelResult<>() {
|
||||
@Override
|
||||
public String getAnalysis() {
|
||||
return "成功导入 " + successList.size() + " 条数据";
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<MarketingValidInvalidImportVo> getList() {
|
||||
return successList.stream()
|
||||
.map(bo -> BeanUtil.toBean(bo, MarketingValidInvalidImportVo.class))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getErrorList() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,41 @@
|
||||
package org.dromara.report.mapper;
|
||||
|
||||
import org.dromara.report.domain.MarketingValidInvalid;
|
||||
import org.dromara.report.domain.vo.MarketingValidInvalidVo;
|
||||
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;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* 员工中间业务有效/无效明细Mapper接口
|
||||
*
|
||||
* @author zzzj
|
||||
* @date 2025-08-29
|
||||
*/
|
||||
public interface MarketingValidInvalidMapper extends BaseMapperPlus<MarketingValidInvalid, MarketingValidInvalidVo> {
|
||||
|
||||
@DataPermission({
|
||||
@DataColumn(key = "deptName", value = "create_dept"),
|
||||
@DataColumn(key = "userName", value = "create_by")
|
||||
})
|
||||
default Page<MarketingValidInvalidVo> selectPageMarketingValidInvalidList(Page<MarketingValidInvalid> page, Wrapper<MarketingValidInvalid> queryWrapper) {
|
||||
return this.selectVoPage(page, queryWrapper);
|
||||
}
|
||||
|
||||
|
||||
//@DataPermission({
|
||||
// @DataColumn(key = "deptName", value = "create_dept"),
|
||||
// @DataColumn(key = "userName", value = "create_by")
|
||||
//})
|
||||
// List<SysUserExportVo> selectMarketingValidInvalidExportList(@Param(Constants.WRAPPER) Wrapper<MarketingValidInvalid> queryWrapper);
|
||||
|
||||
// 批量插入
|
||||
void batchInsert(@Param("list") Collection<MarketingValidInvalid> list);
|
||||
|
||||
}
|
||||
@ -0,0 +1,75 @@
|
||||
package org.dromara.report.service;
|
||||
|
||||
import org.dromara.report.domain.MarketingValidInvalid;
|
||||
import org.dromara.report.domain.vo.MarketingValidInvalidVo;
|
||||
import org.dromara.report.domain.bo.MarketingValidInvalidBo;
|
||||
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.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 员工中间业务有效/无效明细Service接口
|
||||
*
|
||||
* @author zzzj
|
||||
* @date 2025-08-29
|
||||
*/
|
||||
public interface IMarketingValidInvalidService {
|
||||
|
||||
//事务性批量处理
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
void batchInsertOrUpdate(Collection<MarketingValidInvalid> list, Boolean isUpdateSupport);
|
||||
|
||||
/**
|
||||
* 查询员工中间业务有效/无效明细
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 员工中间业务有效/无效明细
|
||||
*/
|
||||
MarketingValidInvalidVo queryById(Long id);
|
||||
|
||||
/**
|
||||
* 分页查询员工中间业务有效/无效明细列表
|
||||
*
|
||||
* @param bo 查询条件
|
||||
* @param pageQuery 分页参数
|
||||
* @return 员工中间业务有效/无效明细分页列表
|
||||
*/
|
||||
TableDataInfo<MarketingValidInvalidVo> queryPageList(MarketingValidInvalidBo bo, PageQuery pageQuery);
|
||||
|
||||
/**
|
||||
* 查询符合条件的员工中间业务有效/无效明细列表
|
||||
*
|
||||
* @param bo 查询条件
|
||||
* @return 员工中间业务有效/无效明细列表
|
||||
*/
|
||||
List<MarketingValidInvalidVo> queryList(MarketingValidInvalidBo bo);
|
||||
|
||||
/**
|
||||
* 新增员工中间业务有效/无效明细
|
||||
*
|
||||
* @param bo 员工中间业务有效/无效明细
|
||||
* @return 是否新增成功
|
||||
*/
|
||||
Boolean insertByBo(MarketingValidInvalidBo bo);
|
||||
|
||||
/**
|
||||
* 修改员工中间业务有效/无效明细
|
||||
*
|
||||
* @param bo 员工中间业务有效/无效明细
|
||||
* @return 是否修改成功
|
||||
*/
|
||||
Boolean updateByBo(MarketingValidInvalidBo bo);
|
||||
|
||||
/**
|
||||
* 校验并批量删除员工中间业务有效/无效明细信息
|
||||
*
|
||||
* @param ids 待删除的主键集合
|
||||
* @param isValid 是否进行有效性校验
|
||||
* @return 是否删除成功
|
||||
*/
|
||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||
}
|
||||
@ -0,0 +1,198 @@
|
||||
package org.dromara.report.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.report.domain.bo.MarketingValidInvalidBo;
|
||||
import org.dromara.report.domain.vo.MarketingValidInvalidVo;
|
||||
import org.dromara.report.domain.MarketingValidInvalid;
|
||||
import org.dromara.report.mapper.MarketingValidInvalidMapper;
|
||||
import org.dromara.report.service.IMarketingValidInvalidService;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* 员工中间业务有效/无效明细Service业务层处理
|
||||
*
|
||||
* @author zzzj
|
||||
* @date 2025-08-29
|
||||
*/
|
||||
@Slf4j
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class MarketingValidInvalidServiceImpl implements IMarketingValidInvalidService {
|
||||
|
||||
private final MarketingValidInvalidMapper baseMapper;
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void batchInsertOrUpdate(Collection<MarketingValidInvalid> list, Boolean isUpdateSupport) {
|
||||
if (CollUtil.isEmpty(list)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 业务校验(可选),参照demo
|
||||
//validateBusinessRules(list);
|
||||
|
||||
// 2. 批量插入/更新
|
||||
if (isUpdateSupport) {
|
||||
baseMapper.insertOrUpdateBatch(list);
|
||||
} else {
|
||||
//baseMapper.insertBatch(list);
|
||||
|
||||
/**
|
||||
* 多笔写入方式有循环写入、开启数据库batch模式、sql拼接后多笔入库以及mapper foreach多笔写入模式
|
||||
* 经对比验证,foreach方式效率最高
|
||||
*
|
||||
* **/
|
||||
|
||||
//由于mybatis的批量方法为伪批量,以下优化为真批量
|
||||
//SqlHelper与service的注解事务管理冲突,所以此处自行写分批
|
||||
int batchSize = 1000;//每批1000条
|
||||
List<MarketingValidInvalid> batchList = new ArrayList<>(batchSize);
|
||||
for (MarketingValidInvalid item : list) {
|
||||
batchList.add(item);
|
||||
if (batchList.size() == batchSize) {
|
||||
baseMapper.batchInsert(batchList);
|
||||
batchList.clear();
|
||||
}
|
||||
}
|
||||
|
||||
// 处理最后一批不满batchSize的数据
|
||||
if (!batchList.isEmpty()) {
|
||||
baseMapper.batchInsert(batchList);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 示例:业务重复检查
|
||||
/*private void validateBusinessRules(Collection<MarketingValidInvalidBo> list) {
|
||||
Set<String> uniqueKeys = new HashSet<>();
|
||||
for (MarketingValidInvalidBo bo : list) {
|
||||
String key = bo.getCustAcctNo();
|
||||
if (uniqueKeys.contains(key)) {
|
||||
throw new ServiceException("重复的客户账号: " + key);
|
||||
}
|
||||
uniqueKeys.add(key);
|
||||
}
|
||||
} */
|
||||
|
||||
/**
|
||||
* 查询员工中间业务有效/无效明细
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 员工中间业务有效/无效明细
|
||||
*/
|
||||
@Override
|
||||
public MarketingValidInvalidVo queryById(Long id){
|
||||
return baseMapper.selectVoById(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询员工中间业务有效/无效明细列表
|
||||
*
|
||||
* @param bo 查询条件
|
||||
* @param pageQuery 分页参数
|
||||
* @return 员工中间业务有效/无效明细分页列表
|
||||
*/
|
||||
@Override
|
||||
public TableDataInfo<MarketingValidInvalidVo> queryPageList(MarketingValidInvalidBo bo, PageQuery pageQuery) {
|
||||
LambdaQueryWrapper<MarketingValidInvalid> lqw = buildQueryWrapper(bo);
|
||||
Page<MarketingValidInvalidVo> result = baseMapper.selectPageMarketingValidInvalidList(pageQuery.build(), lqw);
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询符合条件的员工中间业务有效/无效明细列表
|
||||
*
|
||||
* @param bo 查询条件
|
||||
* @return 员工中间业务有效/无效明细列表
|
||||
*/
|
||||
@Override
|
||||
public List<MarketingValidInvalidVo> queryList(MarketingValidInvalidBo bo) {
|
||||
LambdaQueryWrapper<MarketingValidInvalid> lqw = buildQueryWrapper(bo);
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
|
||||
private LambdaQueryWrapper<MarketingValidInvalid> buildQueryWrapper(MarketingValidInvalidBo bo) {
|
||||
Map<String, Object> params = bo.getParams();
|
||||
LambdaQueryWrapper<MarketingValidInvalid> lqw = Wrappers.lambdaQuery();
|
||||
lqw.orderByAsc(MarketingValidInvalid::getId);
|
||||
lqw.like(StringUtils.isNotBlank(bo.getBranchName()), MarketingValidInvalid::getBranchName, bo.getBranchName());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getEmployeeName()), MarketingValidInvalid::getEmployeeName, bo.getEmployeeName());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getMarketingCode()), MarketingValidInvalid::getMarketingCode, bo.getMarketingCode());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getCustomerName()), MarketingValidInvalid::getCustomerName, bo.getCustomerName());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getCustomerId()), MarketingValidInvalid::getCustomerId, bo.getCustomerId());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getInvalidBusiness()), MarketingValidInvalid::getInvalidBusiness, bo.getInvalidBusiness());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getValidBusiness()), MarketingValidInvalid::getValidBusiness, bo.getValidBusiness());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getCheckFlag()), MarketingValidInvalid::getCheckFlag, bo.getCheckFlag());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getRecordMonth()), MarketingValidInvalid::getRecordMonth, bo.getRecordMonth());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getFill1()), MarketingValidInvalid::getFill1, bo.getFill1());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getFill2()), MarketingValidInvalid::getFill2, bo.getFill2());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getFill3()), MarketingValidInvalid::getFill3, bo.getFill3());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getFill4()), MarketingValidInvalid::getFill4, bo.getFill4());
|
||||
return lqw;
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增员工中间业务有效/无效明细
|
||||
*
|
||||
* @param bo 员工中间业务有效/无效明细
|
||||
* @return 是否新增成功
|
||||
*/
|
||||
@Override
|
||||
public Boolean insertByBo(MarketingValidInvalidBo bo) {
|
||||
MarketingValidInvalid add = MapstructUtils.convert(bo, MarketingValidInvalid.class);
|
||||
validEntityBeforeSave(add);
|
||||
boolean flag = baseMapper.insert(add) > 0;
|
||||
if (flag) {
|
||||
bo.setId(add.getId());
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改员工中间业务有效/无效明细
|
||||
*
|
||||
* @param bo 员工中间业务有效/无效明细
|
||||
* @return 是否修改成功
|
||||
*/
|
||||
@Override
|
||||
public Boolean updateByBo(MarketingValidInvalidBo bo) {
|
||||
MarketingValidInvalid update = MapstructUtils.convert(bo, MarketingValidInvalid.class);
|
||||
validEntityBeforeSave(update);
|
||||
return baseMapper.updateById(update) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存前的数据校验
|
||||
*/
|
||||
private void validEntityBeforeSave(MarketingValidInvalid entity){
|
||||
//TODO 做一些数据校验,如唯一约束
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验并批量删除员工中间业务有效/无效明细信息
|
||||
*
|
||||
* @param ids 待删除的主键集合
|
||||
* @param isValid 是否进行有效性校验
|
||||
* @return 是否删除成功
|
||||
*/
|
||||
@Override
|
||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||
if(isValid){
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
}
|
||||
return baseMapper.deleteByIds(ids) > 0;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,58 @@
|
||||
<?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.report.mapper.MarketingValidInvalidMapper">
|
||||
|
||||
<!--mysql写法,达梦兼容-->
|
||||
<insert id="batchInsert">
|
||||
INSERT INTO marketing_valid_invalid
|
||||
(
|
||||
id,
|
||||
branch_name,
|
||||
employee_name,
|
||||
marketing_code,
|
||||
customer_name,
|
||||
customer_id,
|
||||
invalid_business,
|
||||
valid_business,
|
||||
check_flag,
|
||||
record_month,
|
||||
fill1,
|
||||
fill2,
|
||||
fill3,
|
||||
fill4,
|
||||
tenant_id,
|
||||
create_dept,
|
||||
create_by,
|
||||
create_time,
|
||||
update_by,
|
||||
update_time
|
||||
)
|
||||
VALUES
|
||||
<foreach collection="list" item="item" separator=",">
|
||||
(
|
||||
#{item.id},
|
||||
#{item.branchName},
|
||||
#{item.employeeName},
|
||||
#{item.marketingCode},
|
||||
#{item.customerName},
|
||||
#{item.customerId},
|
||||
#{item.invalidBusiness},
|
||||
#{item.validBusiness},
|
||||
#{item.checkFlag},
|
||||
#{item.recordMonth},
|
||||
#{item.fill1},
|
||||
#{item.fill2},
|
||||
#{item.fill3},
|
||||
#{item.fill4},
|
||||
#{item.tenantId},
|
||||
#{item.createDept},
|
||||
#{item.createBy},
|
||||
#{item.createTime},
|
||||
#{item.updateBy},
|
||||
#{item.updateTime}
|
||||
)
|
||||
</foreach>
|
||||
</insert>
|
||||
</mapper>
|
||||
Loading…
Reference in New Issue
Block a user