Commit e2f5885b authored by fangxinjiang's avatar fangxinjiang

户截止日期配置开发-fxj

parent ca736415
/*
* Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the yifu4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: lengleng (wangiegie@gmail.com)
*/
package com.yifu.cloud.plus.v1.yifu.social.entity;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.ExcelAttribute;
import com.yifu.cloud.plus.v1.yifu.common.mybatis.base.BaseEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotBlank;
/**
* 户截止日配置表
*
* @author fxj
* @date 2025-12-11 14:19:54
*/
@Data
@TableName("t_house_hold_limit")
@EqualsAndHashCode(callSuper = true)
@Schema(description = "户截止日配置表")
public class THouseHoldLimit extends BaseEntity {
/**
* 主键
*/
@TableId(type = IdType.ASSIGN_ID)
@ExcelProperty("主键")
@Schema(description = "主键")
private String id;
/**
* 户名
*/
@ExcelAttribute(name = "户名", maxLength = 50)
@Length(max = 50, message = "户名不能超过50个字符")
@ExcelProperty("户名")
@Schema(description = "户名")
private String name;
/**
* 户类型:0社保 1公积金
*/
@ExcelAttribute(name = "户类型:0社保 1公积金", isNotEmpty = true, errorInfo = "户类型:0社保 1公积金不能为空", maxLength = 255)
@NotBlank(message = "户类型:0社保 1公积金不能为空")
@Length(max = 255, message = "户类型:0社保 1公积金不能超过255个字符")
@ExcelProperty("户类型:0社保 1公积金")
@Schema(description = "户类型:0社保 1公积金")
private String type;
/**
* 缴纳地-省
*/
@ExcelAttribute(name = "缴纳地-省", maxLength = 10)
@Length(max = 10, message = "缴纳地-省不能超过10个字符")
@ExcelProperty("缴纳地-省")
@Schema(description = "缴纳地-省")
private String province;
/**
* 缴纳地-市
*/
@ExcelAttribute(name = "缴纳地-市", maxLength = 10)
@Length(max = 10, message = "缴纳地-市不能超过10个字符")
@ExcelProperty("缴纳地-市")
@Schema(description = "缴纳地-市")
private String city;
/**
* 缴纳地-县
*/
@ExcelAttribute(name = "缴纳地-县", maxLength = 10)
@Length(max = 10, message = "缴纳地-县不能超过10个字符")
@ExcelProperty("缴纳地-县")
@Schema(description = "缴纳地-县")
private String town;
/**
* 户ID
*/
@ExcelAttribute(name = "户ID", maxLength = 32)
@Length(max = 32, message = "户ID不能超过32个字符")
@ExcelProperty("户ID")
@Schema(description = "户ID")
private String houseHoldId;
/**
* 派增截止(日)
*/
@ExcelAttribute(name = "派增截止(日)", isNotEmpty = true, errorInfo = "派增截止(日)不能为空", maxLength = 2)
@NotBlank(message = "派增截止(日)不能为空")
@Length(max = 2, message = "派增截止(日)不能超过2个字符")
@ExcelProperty("派增截止(日)")
@Schema(description = "派增截止(日)")
private String deadLineDay;
/**
* 派增办理规则:0当月办当月生效 1 当月办次月生效
*/
@ExcelAttribute(name = "派增办理规则:0当月办当月生效 1 当月办次月生效", isNotEmpty = true, errorInfo = "派增办理规则:0当月办当月生效 1 当月办次月生效不能为空", maxLength = 2)
@NotBlank(message = "派增办理规则:0当月办当月生效 1 当月办次月生效不能为空")
@Length(max = 2, message = "派增办理规则:0当月办当月生效 1 当月办次月生效不能超过2个字符")
@ExcelProperty("派增办理规则:0当月办当月生效 1 当月办次月生效")
@Schema(description = "派增办理规则:0当月办当月生效 1 当月办次月生效")
private String addHandleRule;
}
/*
* Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the yifu4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: lengleng (wangiegie@gmail.com)
*/
package com.yifu.cloud.plus.v1.yifu.social.vo;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.HeadFontStyle;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.ExcelAttribute;
import com.yifu.cloud.plus.v1.yifu.common.mybatis.base.BaseEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 户截止日配置表
*
* @author fxj
* @date 2025-12-11 14:19:54
*/
@Data
@Schema(description = "户截止日配置表")
public class THouseHoldLimitExportVo implements Serializable {
/**
* 户名
*/
@ExcelAttribute(name = "户名")
@HeadFontStyle(fontHeightInPoints = 11)
@ColumnWidth(10)
@ExcelProperty("户名")
@Schema(description = "户名")
private String name;
/**
* 户类型:0社保 1公积金
*/
@ExcelAttribute(name = "户类型", isDataId = true,readConverterExp = "0=社保,1=公积金")
@HeadFontStyle(fontHeightInPoints = 11)
@ColumnWidth(10)
@ExcelProperty("户类型")
@Schema(description = "户类型")
private String type;
/**
* 缴纳地
*/
@ExcelAttribute(name = "缴纳地")
@HeadFontStyle(fontHeightInPoints = 11)
@ColumnWidth(10)
@ExcelProperty("缴纳地")
@Schema(description = "缴纳地")
private String province;
/**
* 派增截止(日)
*/
@ExcelAttribute(name = "派增截止(日)")
@HeadFontStyle(fontHeightInPoints = 11)
@ColumnWidth(15)
@ExcelProperty("派增截止(日)")
@Schema(description = "派增截止(日)")
private String deadLineDay;
/**
* 派增办理规则:0当月办当月生效 1 当月办次月生效
*/
@ExcelAttribute(name = "派增办理规则", isDataId = true,readConverterExp = "0=当月办当月生效,1=当月办次月生效")
@ExcelProperty("派增办理规则")
@HeadFontStyle(fontHeightInPoints = 11)
@ColumnWidth(15)
@Schema(description = "派增办理规则")
private String addHandleRule;
/**
* 创建者-姓名
*/
@Schema(description = "配置人")
@HeadFontStyle(fontHeightInPoints = 11)
@ColumnWidth(10)
@ExcelProperty("配置人")
private String createName;
/**
* 更新时间
*/
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
@HeadFontStyle(fontHeightInPoints = 11)
@ColumnWidth(20)
@ExcelProperty("最后一次更新时间")
@Schema(description = "最后一次更新时间")
private LocalDateTime updateTime;
}
/*
* Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the yifu4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: lengleng (wangiegie@gmail.com)
*/
package com.yifu.cloud.plus.v1.yifu.social.vo;
import com.yifu.cloud.plus.v1.yifu.social.entity.THouseHoldLimit;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 户截止日配置表
*
* @author fxj
* @date 2025-12-11 14:19:54
*/
@Data
public class THouseHoldLimitSearchVo extends THouseHoldLimit {
/**
* 多选导出或删除等操作
*/
@Schema(description = "选中ID,多个逗号分割")
private String ids;
/**
* 更新时间区间 [开始时间,结束时间]
*/
@Schema(description = "更新时间起")
private LocalDateTime updateTimeStart;
/**
* 创建时间区间 [开始时间,结束时间]
*/
@Schema(description = "更新时间止")
private LocalDateTime updateTimeEnd;
/**
* @Author fxj
* 查询数据起
**/
@Schema(description = "查询limit 开始")
private int limitStart;
/**
* @Author fxj
* 查询数据止
**/
@Schema(description = "查询limit 数据条数")
private int limitEnd;
}
/*
* Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the yifu4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: lengleng (wangiegie@gmail.com)
*/
package com.yifu.cloud.plus.v1.yifu.social.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.ExcelAttribute;
import com.yifu.cloud.plus.v1.yifu.common.core.vo.RowIndex;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
/**
* 户截止日配置表
*
* @author fxj
* @date 2025-12-11 14:19:54
*/
@Data
public class THouseHoldLimitVo extends RowIndex implements Serializable {
/**
* 户名
*/
@ExcelAttribute(name = "户名",isNotEmpty = true, maxLength = 50)
@Schema(description = "户名")
@ExcelProperty("户名")
private String name;
/**
* 户类型:0社保 1公积金
*/
@ExcelAttribute(name = "户类型", isNotEmpty = true, errorInfo = "户类型不能为空", isDataId = true,readConverterExp = "0=社保,1=公积金")
@Schema(description = "户类型:0社保 1公积金")
@ExcelProperty("户类型")
private String type;
/**
* 派增截止(日)
*/
@ExcelAttribute(name = "派增截止(日)",isInteger = true, isNotEmpty = true, errorInfo = "派增截止(日)不能为空", maxLength = 2)
@Schema(description = "派增截止(日)")
@ExcelProperty("派增截止(日)")
private String deadLineDay;
/**
* 派增办理规则:0当月办当月生效 1 当月办次月生效
*/
@ExcelAttribute(name = "派增办理规则", isNotEmpty = true, errorInfo = "派增办理规则不能为空", isDataId = true,readConverterExp = "0=当月办当月生效,1=当月办次月生效")
@Schema(description = "派增办理规则:0当月办当月生效 1 当月办次月生效")
@ExcelProperty("派增办理规则")
private String addHandleRule;
}
/*
* Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the yifu4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: lengleng (wangiegie@gmail.com)
*/
package com.yifu.cloud.plus.v1.yifu.social.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.CommonConstants;
import com.yifu.cloud.plus.v1.yifu.common.core.util.Common;
import com.yifu.cloud.plus.v1.yifu.common.core.util.ErrorMessage;
import com.yifu.cloud.plus.v1.yifu.common.core.util.R;
import com.yifu.cloud.plus.v1.yifu.common.core.vo.YifuUser;
import com.yifu.cloud.plus.v1.yifu.common.log.annotation.SysLog;
import com.yifu.cloud.plus.v1.yifu.common.security.util.SecurityUtils;
import com.yifu.cloud.plus.v1.yifu.social.entity.THouseHoldLimit;
import com.yifu.cloud.plus.v1.yifu.social.service.THouseHoldLimitService;
import com.yifu.cloud.plus.v1.yifu.social.vo.THouseHoldLimitSearchVo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
* 户截止日配置表
*
* @author fxj
* @date 2025-12-11 14:19:54
*/
@RestController
@RequiredArgsConstructor
@RequestMapping("/thouseholdlimit")
@Tag(name = "户截止日配置表管理")
public class THouseHoldLimitController {
private final THouseHoldLimitService tHouseHoldLimitService;
private final static String ADD_UPDATE_REPEAT_ERROR = "对应户名及户类型的配置已存在!";
/**
* 简单分页查询
*
* @param page 分页对象
* @param tHouseHoldLimit 户截止日配置表
* @return
*/
@Operation(description = "简单分页查询")
@GetMapping("/page")
public R<IPage<THouseHoldLimit>> getTHouseHoldLimitPage(Page<THouseHoldLimit> page, THouseHoldLimitSearchVo tHouseHoldLimit) {
return new R<>(tHouseHoldLimitService.getTHouseHoldLimitPage(page, tHouseHoldLimit));
}
/**
* 通过id查询户截止日配置表
*
* @param id id
* @return R
*/
@Operation(summary = "通过id查询", description = "通过id查询:hasPermission('social_thouseholdlimit_get')")
@GetMapping("/{id}")
@PreAuthorize("@pms.hasPermission('social_thouseholdlimit_get')")
public R<THouseHoldLimit> getById(@PathVariable("id") String id) {
return R.ok(tHouseHoldLimitService.getById(id));
}
/**
* 新增户截止日配置表
*
* @param tHouseHoldLimit 户截止日配置表
* @return R
*/
@Operation(summary = "新增户截止日配置表", description = "新增户截止日配置表:hasPermission('social_thouseholdlimit_add')")
@SysLog("新增户截止日配置表")
@PostMapping
@PreAuthorize("@pms.hasPermission('social_thouseholdlimit_add')")
public R<Boolean> save(@RequestBody THouseHoldLimit tHouseHoldLimit) {
//先查验是否已存在对应户名称和户类型的数据
THouseHoldLimit houseHoldLimit = tHouseHoldLimitService
.getOne(Wrappers.<THouseHoldLimit>query().lambda()
.eq(THouseHoldLimit::getName, tHouseHoldLimit.getName())
.eq(THouseHoldLimit::getType, tHouseHoldLimit.getType())
.last(CommonConstants.LAST_ONE_SQL));
if (null != houseHoldLimit){
return R.failed(ADD_UPDATE_REPEAT_ERROR);
}
return R.ok(tHouseHoldLimitService.save(tHouseHoldLimit));
}
/**
* 修改户截止日配置表
*
* @param tHouseHoldLimit 户截止日配置表
* @return R
*/
@Operation(summary = "修改户截止日配置表", description = "修改户截止日配置表:hasPermission('social_thouseholdlimit_edit')")
@SysLog("修改户截止日配置表")
@PutMapping
@PreAuthorize("@pms.hasPermission('social_thouseholdlimit_edit')")
public R<Boolean> updateById(@RequestBody THouseHoldLimit tHouseHoldLimit) {
if (tHouseHoldLimit.getId() == null){
return R.failed(CommonConstants.PARAM_INFO_ERROR);
}
//先查验是否已存在对应户名称和户类型的数据
THouseHoldLimit houseHoldLimit = tHouseHoldLimitService
.getOne(Wrappers.<THouseHoldLimit>query().lambda()
.eq(THouseHoldLimit::getName, tHouseHoldLimit.getName())
.eq(THouseHoldLimit::getType, tHouseHoldLimit.getType())
.ne(THouseHoldLimit::getId, tHouseHoldLimit.getId())
.last(CommonConstants.LAST_ONE_SQL));
if (null != houseHoldLimit){
return R.failed(ADD_UPDATE_REPEAT_ERROR);
}
return R.ok(tHouseHoldLimitService.updateById(tHouseHoldLimit));
}
/**
* 通过id删除户截止日配置表
*
* @param id id
* @return R
*/
@Operation(summary = "通过id删除户截止日配置表", description = "通过id删除户截止日配置表:hasPermission('social_thouseholdlimit_del')")
@SysLog("通过id删除户截止日配置表")
@DeleteMapping("/{id}")
@PreAuthorize("@pms.hasPermission('social_thouseholdlimit_del')")
public R<Boolean> removeById(@PathVariable String id) {
return R.ok(tHouseHoldLimitService.removeById(id));
}
/**
* 户截止日配置表 批量导入
*
* @author fxj
* @date 2025-12-11 14:19:54
**/
@SneakyThrows
@Operation(description = "批量新增户截止日配置表 hasPermission('social_thouseholdlimit-batch-import')")
@SysLog("批量新增户截止日配置表")
@PostMapping("/importListAdd")
public R<List<ErrorMessage>> importListAdd(@RequestBody MultipartFile file) {
YifuUser user = SecurityUtils.getUser();
if (Common.isEmpty(user)){
return R.failed(CommonConstants.USER_FAIL);
}
return tHouseHoldLimitService.importDiy(file.getInputStream(),user);
}
/**
* 户截止日配置表 批量导出
*
* @author fxj
* @date 2025-12-11 14:19:54
**/
@Operation(description = "导出户截止日配置表 hasPermission('social_thouseholdlimit-export')")
@PostMapping("/export")
public void export(HttpServletResponse response, @RequestBody THouseHoldLimitSearchVo searchVo) {
tHouseHoldLimitService.listExport(response, searchVo);
}
}
/*
* Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the yifu4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: lengleng (wangiegie@gmail.com)
*/
package com.yifu.cloud.plus.v1.yifu.social.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yifu.cloud.plus.v1.yifu.social.entity.THouseHoldLimit;
import com.yifu.cloud.plus.v1.yifu.social.vo.THouseHoldLimitExportVo;
import com.yifu.cloud.plus.v1.yifu.social.vo.THouseHoldLimitSearchVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 户截止日配置表
*
* @author fxj
* @date 2025-12-11 14:19:54
*/
@Mapper
public interface THouseHoldLimitMapper extends BaseMapper<THouseHoldLimit> {
/**
* 户截止日配置表简单分页查询
*
* @param tHouseHoldLimit 户截止日配置表
* @return
*/
IPage<THouseHoldLimit> getTHouseHoldLimitPage(Page<THouseHoldLimit> page, @Param("tHouseHoldLimit") THouseHoldLimit tHouseHoldLimit);
List<THouseHoldLimitExportVo> exportDiy(@Param("tHouseHoldLimit")THouseHoldLimitSearchVo searchVo);
int exportCountDiy(@Param("tHouseHoldLimit")THouseHoldLimitSearchVo searchVo);
}
/*
* Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the yifu4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: lengleng (wangiegie@gmail.com)
*/
package com.yifu.cloud.plus.v1.yifu.social.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yifu.cloud.plus.v1.yifu.common.core.util.ErrorMessage;
import com.yifu.cloud.plus.v1.yifu.common.core.util.R;
import com.yifu.cloud.plus.v1.yifu.common.core.vo.YifuUser;
import com.yifu.cloud.plus.v1.yifu.social.entity.THouseHoldLimit;
import com.yifu.cloud.plus.v1.yifu.social.vo.THouseHoldLimitSearchVo;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.util.List;
/**
* 户截止日配置表
*
* @author fxj
* @date 2025-12-11 14:19:54
*/
public interface THouseHoldLimitService extends IService<THouseHoldLimit> {
/**
* 户截止日配置表简单分页查询
*
* @param tHouseHoldLimit 户截止日配置表
* @return
*/
IPage<THouseHoldLimit> getTHouseHoldLimitPage(Page<THouseHoldLimit> page, THouseHoldLimitSearchVo tHouseHoldLimit);
R<List<ErrorMessage>> importDiy(InputStream inputStream, YifuUser user);
void listExport(HttpServletResponse response, THouseHoldLimitSearchVo searchVo);
}
/*
* Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the yifu4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: lengleng (wangiegie@gmail.com)
*/
package com.yifu.cloud.plus.v1.yifu.social.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ArrayUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.exception.ExcelAnalysisException;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.read.metadata.holder.ReadRowHolder;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.CommonConstants;
import com.yifu.cloud.plus.v1.yifu.common.core.util.*;
import com.yifu.cloud.plus.v1.yifu.common.core.vo.YifuUser;
import com.yifu.cloud.plus.v1.yifu.common.mybatis.base.BaseEntity;
import com.yifu.cloud.plus.v1.yifu.social.entity.SysHouseHoldInfo;
import com.yifu.cloud.plus.v1.yifu.social.entity.THouseHoldLimit;
import com.yifu.cloud.plus.v1.yifu.social.mapper.SysHouseHoldInfoMapper;
import com.yifu.cloud.plus.v1.yifu.social.mapper.THouseHoldLimitMapper;
import com.yifu.cloud.plus.v1.yifu.social.service.THouseHoldLimitService;
import com.yifu.cloud.plus.v1.yifu.social.vo.THouseHoldLimitExportVo;
import com.yifu.cloud.plus.v1.yifu.social.vo.THouseHoldLimitSearchVo;
import com.yifu.cloud.plus.v1.yifu.social.vo.THouseHoldLimitVo;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.util.*;
/**
* 户截止日配置表
*
* @author fxj
* @date 2025-12-11 14:19:54
*/
@Log4j2
@Service
public class THouseHoldLimitServiceImpl extends ServiceImpl<THouseHoldLimitMapper, THouseHoldLimit> implements THouseHoldLimitService {
@Autowired
private SysHouseHoldInfoMapper sysHouseHoldInfoMapper;
/**
* 户截止日配置表简单分页查询
*
* @param tHouseHoldLimit 户截止日配置表
* @return
*/
@Override
public IPage<THouseHoldLimit> getTHouseHoldLimitPage(Page<THouseHoldLimit> page, THouseHoldLimitSearchVo tHouseHoldLimit) {
return baseMapper.getTHouseHoldLimitPage(page, tHouseHoldLimit);
}
/**
* 户截止日配置表批量导出
*
* @param searchVo 户截止日配置表
* @return
*/
@Override
public void listExport(HttpServletResponse response, THouseHoldLimitSearchVo searchVo) {
String fileName = "户截止日配置表批量导出" + DateUtil.getThisTime() + ".xlsx";
//获取要导出的列表
List<THouseHoldLimitExportVo> list = new ArrayList<>();
long count = exportCountDiy(searchVo);
ServletOutputStream out = null;
try {
out = response.getOutputStream();
response.setContentType(CommonConstants.MULTIPART_FORM_DATA);
response.setCharacterEncoding("utf-8");
response.setHeader(CommonConstants.CONTENT_DISPOSITION, CommonConstants.ATTACHMENT_FILENAME + URLEncoder.encode(fileName, CommonConstants.UTF8));
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,然后文件流会自动关闭
//EasyExcel.write(out, TEmpBadRecord.class).sheet("不良记录").doWrite(list);
ExcelWriter excelWriter = EasyExcel.write(out, THouseHoldLimitExportVo.class).build();
int index = 0;
if (count > CommonConstants.ZERO_INT) {
for (int i = 0; i <= count; ) {
// 获取实际记录
searchVo.setLimitStart(i);
searchVo.setLimitEnd(CommonConstants.EXCEL_EXPORT_LIMIT);
list = exportDiy(searchVo);
if (Common.isNotNull(list)) {
ExcelUtil<THouseHoldLimitExportVo> util = new ExcelUtil<>(THouseHoldLimitExportVo.class);
for (THouseHoldLimitExportVo vo : list) {
util.convertEntity(vo, null, null, null);
}
}
if (Common.isNotNull(list)) {
WriteSheet writeSheet = EasyExcel.writerSheet("户截止日配置表" + index).build();
excelWriter.write(list, writeSheet);
index++;
}
i = i + CommonConstants.EXCEL_EXPORT_LIMIT;
if (Common.isNotNull(list)) {
list.clear();
}
}
} else {
WriteSheet writeSheet = EasyExcel.writerSheet("户截止日配置表" + index).build();
excelWriter.write(list, writeSheet);
}
if (Common.isNotNull(list)) {
list.clear();
}
out.flush();
excelWriter.finish();
} catch (Exception e) {
log.error("执行异常", e);
} finally {
try {
if (null != out) {
out.close();
}
} catch (IOException e) {
log.error("执行异常", e);
}
}
}
public List<THouseHoldLimitExportVo> exportDiy(THouseHoldLimitSearchVo searchVo) {
return baseMapper.exportDiy(searchVo);
}
private int exportCountDiy(THouseHoldLimitSearchVo searchVo) {
return baseMapper.exportCountDiy(searchVo);
}
@Override
public R<List<ErrorMessage>> importDiy(InputStream inputStream,YifuUser user) {
List<ErrorMessage> errorMessageList = new ArrayList<>();
//记录所有已存在的户名+户类型,包括EXCEL本身的
Map<String,String> map = new HashMap<>();
ExcelUtil<THouseHoldLimitVo> util1 = new ExcelUtil<>(THouseHoldLimitVo.class);
;
// 写法2:
// 匿名内部类 不用额外写一个DemoDataListener
// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
try {
EasyExcel.read(inputStream, THouseHoldLimitVo.class, new ReadListener<THouseHoldLimitVo>() {
/**
* 单次缓存的数据量
*/
public static final int BATCH_COUNT = CommonConstants.BATCH_COUNT;
/**
*临时存储
*/
private List<THouseHoldLimitVo> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
/**
* 验证表头
**/
@Override
public void invokeHead(Map<Integer, ReadCellData<?>> headMap, AnalysisContext context) {
// 定义期望的表头
Map<Integer, String> expectedHead = new HashMap<>();
expectedHead.put(0, "户名");
expectedHead.put(1, "户类型");
expectedHead.put(2, "派增截止(日)");
expectedHead.put(3, "派增办理规则");
// 验证表头
for (Map.Entry<Integer, String> entry : expectedHead.entrySet()) {
String actualValue = headMap.get(entry.getKey()).getStringValue();
if (null != headMap && null != headMap.get(entry.getKey())) {
actualValue = headMap.get(entry.getKey()).getStringValue();
}
String expectedValue = entry.getValue();
if (!expectedValue.equals(actualValue)) {
errorMessageList.add(new ErrorMessage(entry.getKey() + 1,
String.format("第%d列表头验证失败,期望:'%s',实际:'%s'",
entry.getKey() + 1, expectedValue, actualValue)));
throw new ExcelAnalysisException(
String.format("第%d列表头验证失败,期望:'%s',实际:'%s'",
entry.getKey() + 1, expectedValue, actualValue)
);
}
}
}
@Override
public void invoke(THouseHoldLimitVo data, AnalysisContext context) {
ReadRowHolder readRowHolder = context.readRowHolder();
Integer rowIndex = readRowHolder.getRowIndex();
data.setRowIndex(rowIndex + 1);
ErrorMessage errorMessage = util1.checkEntity(data, data.getRowIndex());
if (Common.isNotNull(errorMessage)) {
errorMessageList.add(errorMessage);
} else {
cachedDataList.add(data);
}
if (cachedDataList.size() >= BATCH_COUNT) {
saveData();
// 存储完成清理 list
cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
saveData();
}
/**
* 加上存储数据库
*/
private void saveData() {
log.info("{}条数据,开始存储数据库!", cachedDataList.size());
importTHouseHoldLimit(cachedDataList, errorMessageList,map,user);
log.info("存储数据库成功!");
}
}).sheet().doRead();
} catch (Exception e) {
log.error(CommonConstants.IMPORT_DATA_ANALYSIS_ERROR, e);
if (Common.isNotKong(errorMessageList)){
return R.failed(errorMessageList.get(0).getMessage());
}else{
return R.failed(CommonConstants.IMPORT_DATA_ANALYSIS_ERROR);
}
}finally {
if (Common.isNotNull(map)){
map.clear();
}
}
return this.judgeAllMessage1(errorMessageList);
}
/**
* @Author fxj
* @Description 全部成功就返回成功
* @Date 15:22 2025/12/11
* @Param
* @return
**/
private R<List<ErrorMessage>> judgeAllMessage1(List<ErrorMessage> errorMessageList) {
if (!errorMessageList.isEmpty()) {
if(errorMessageList.stream().allMatch(e-> CommonConstants.SAVE_SUCCESS.equals(e.getMessage()))) {
return R.ok();
} else {
return R.failed(errorMessageList);
}
}
return R.ok();
}
private void importTHouseHoldLimit(List<THouseHoldLimitVo> excelVOList,
List<ErrorMessage> errorMessageList,
Map<String,String> map, YifuUser user) {
// 个性化校验逻辑
ErrorMessage errorMsg;
//获取户数据(启用)
Map<String,SysHouseHoldInfo> houseHoldMap = new HashMap<>();
List<SysHouseHoldInfo> houseHoldInfoList = sysHouseHoldInfoMapper
.selectList(Wrappers.<SysHouseHoldInfo>query().lambda()
.eq(SysHouseHoldInfo::getDelFlag,CommonConstants.ZERO_STRING));
if(Common.isNotNull(houseHoldInfoList)) {
for (SysHouseHoldInfo houseHoldInfo : houseHoldInfoList) {
houseHoldMap.put(houseHoldInfo.getName()+houseHoldInfo.getType(),houseHoldInfo);
}
}
THouseHoldLimit holdLimit = null;
SysHouseHoldInfo houseHold = null;
String houseLimitRowIndex = null;
THouseHoldLimit limitInsert = null;
// 执行数据插入操作 组装
for (int i = 0; i < excelVOList.size(); i++) {
THouseHoldLimitVo excel = excelVOList.get(i);
houseHold = houseHoldMap.get(excel.getName()+excel.getType());
if(!Common.isNotNull(houseHold)) {
errorMsg = new ErrorMessage(excel.getRowIndex(), "未找到该户名及户类型的数据", excel);
errorMessageList.add(errorMsg);
continue;
}
houseLimitRowIndex = map.get(excel.getName()+excel.getType());
if (Common.isNotNull(houseLimitRowIndex)){
errorMsg = new ErrorMessage(excel.getRowIndex(), "该户名及户类型已存在EXCEL第"+houseLimitRowIndex+"行,请勿重复导入", excel);
errorMessageList.add(errorMsg);
continue;
}
holdLimit = baseMapper.selectOne(Wrappers.<THouseHoldLimit>query().lambda()
.eq(THouseHoldLimit::getType,excel.getType())
.eq(THouseHoldLimit::getName,excel.getName())
.last(CommonConstants.LAST_ONE_SQL));
if (null != holdLimit){
errorMsg = new ErrorMessage(excel.getRowIndex(), "该户名及户类型已存在", excel);
errorMessageList.add(errorMsg);
continue;
}
if (Common.isNotNull(excel.getDeadLineDay())){
if (!Common.isNumber(excel.getDeadLineDay())){
errorMsg = new ErrorMessage(excel.getRowIndex(), "派增截止(日)只能是数字", excel);
errorMessageList.add(errorMsg);
continue;
}
if (Integer.parseInt(excel.getDeadLineDay()) > 31 || Integer.parseInt(excel.getDeadLineDay()) < 1){
errorMsg = new ErrorMessage(excel.getRowIndex(), "派增截止(日)只能是1-31的数字", excel);
errorMessageList.add(errorMsg);
continue;
}
}
if (Common.isNotNull(excel.getAddHandleRule())){
if (!CommonConstants.ZERO_STRING.equals(excel.getAddHandleRule()) && !CommonConstants.ONE_STRING.equals(excel.getAddHandleRule())){
errorMsg = new ErrorMessage(excel.getRowIndex(), "派增办理规则只能是'当月办当月生效'或'当月办次月生效'", excel);
errorMessageList.add(errorMsg);
continue;
}
}
if (Common.isNotNull(excel.getType())){
if (!CommonConstants.ZERO_STRING.equals(excel.getType()) && !CommonConstants.ONE_STRING.equals(excel.getType())){
errorMsg = new ErrorMessage(excel.getRowIndex(), "户类型只能是'社保'或'公积金'", excel);
errorMessageList.add(errorMsg);
continue;
}
}
limitInsert = new THouseHoldLimit();
limitInsert.setHouseHoldId(houseHold.getId());
limitInsert.setType(excel.getType());
limitInsert.setDeadLineDay(excel.getDeadLineDay());
limitInsert.setAddHandleRule(excel.getAddHandleRule());
limitInsert.setName(excel.getName());
limitInsert.setCreateBy(user.getId());
limitInsert.setUpdateBy(user.getId());
limitInsert.setCreateTime(LocalDateTime.now());
limitInsert.setUpdateTime(LocalDateTime.now());
limitInsert.setCreateName(user.getNickname());
limitInsert.setProvince(houseHold.getProvince());
limitInsert.setCity(houseHold.getCity());
limitInsert.setTown(houseHold.getTown());
map.put(excel.getName()+excel.getType(),excel.getRowIndex().toString());
// 插入
if (!insertExcel(limitInsert)){
errorMsg = new ErrorMessage(excel.getRowIndex(), "导入异常", excel);
errorMessageList.add(errorMsg);
continue;
}
errorMessageList.add(new ErrorMessage(excel.getRowIndex(), CommonConstants.SAVE_SUCCESS, excel));
}
}
/**
* 插入excel record
*/
private boolean insertExcel(THouseHoldLimit insert) {
return baseMapper.insert(insert) >= 1;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!--
~
~ Copyright (c) 2018-2025, lengleng All rights reserved.
~
~ Redistribution and use in source and binary forms, with or without
~ modification, are permitted provided that the following conditions are met:
~
~ Redistributions of source code must retain the above copyright notice,
~ this list of conditions and the following disclaimer.
~ Redistributions in binary form must reproduce the above copyright
~ notice, this list of conditions and the following disclaimer in the
~ documentation and/or other materials provided with the distribution.
~ Neither the name of the yifu4cloud.com developer nor the names of its
~ contributors may be used to endorse or promote products derived from
~ this software without specific prior written permission.
~ Author: lengleng (wangiegie@gmail.com)
~
-->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yifu.cloud.plus.v1.yifu.social.mapper.THouseHoldLimitMapper">
<resultMap id="tHouseHoldLimitMap" type="com.yifu.cloud.plus.v1.yifu.social.entity.THouseHoldLimit">
<id property="id" column="ID"/>
<result property="name" column="NAME"/>
<result property="type" column="TYPE"/>
<result property="province" column="PROVINCE"/>
<result property="city" column="CITY"/>
<result property="town" column="TOWN"/>
<result property="houseHoldId" column="HOUSE_HOLD_ID"/>
<result property="deadLineDay" column="DEAD_LINE_DAY"/>
<result property="addHandleRule" column="ADD_HANDLE_RULE"/>
<result property="createBy" column="CREATE_BY"/>
<result property="updateBy" column="UPDATE_BY"/>
<result property="createTime" column="CREATE_TIME"/>
<result property="updateTime" column="UPDATE_TIME"/>
<result property="createName" column="CREATE_NAME"/>
</resultMap>
<resultMap id="tHouseHoldLimitExportMap" type="com.yifu.cloud.plus.v1.yifu.social.vo.THouseHoldLimitExportVo">
<result property="name" column="NAME"/>
<result property="type" column="TYPE"/>
<result property="province" column="PROVINCE"/>
<result property="deadLineDay" column="DEAD_LINE_DAY"/>
<result property="addHandleRule" column="ADD_HANDLE_RULE"/>
<result property="updateTime" column="UPDATE_TIME"/>
<result property="createName" column="CREATE_NAME"/>
</resultMap>
<sql id="Base_Column_List">
a.ID,
a.NAME,
a.TYPE,
a.PROVINCE,
a.CITY,
a.TOWN,
a.HOUSE_HOLD_ID,
a.DEAD_LINE_DAY,
a.ADD_HANDLE_RULE,
a.CREATE_BY,
a.UPDATE_BY,
a.CREATE_TIME,
a.UPDATE_TIME,
a.CREATE_NAME
</sql>
<sql id="tHouseHoldLimit_where">
<if test="tHouseHoldLimit != null">
<if test="tHouseHoldLimit.id != null and tHouseHoldLimit.id.trim() != ''">
AND a.ID = #{tHouseHoldLimit.id}
</if>
<if test="tHouseHoldLimit.name != null and tHouseHoldLimit.name.trim() != ''">
AND a.NAME = #{tHouseHoldLimit.name}
</if>
<if test="tHouseHoldLimit.type != null and tHouseHoldLimit.type.trim() != ''">
AND a.TYPE = #{tHouseHoldLimit.type}
</if>
<if test="tHouseHoldLimit.province != null and tHouseHoldLimit.province.trim() != ''">
AND a.PROVINCE = #{tHouseHoldLimit.province}
</if>
<if test="tHouseHoldLimit.city != null and tHouseHoldLimit.city.trim() != ''">
AND a.CITY = #{tHouseHoldLimit.city}
</if>
<if test="tHouseHoldLimit.town != null and tHouseHoldLimit.town.trim() != ''">
AND a.TOWN = #{tHouseHoldLimit.town}
</if>
<if test="tHouseHoldLimit.houseHoldId != null and tHouseHoldLimit.houseHoldId.trim() != ''">
AND a.HOUSE_HOLD_ID = #{tHouseHoldLimit.houseHoldId}
</if>
<if test="tHouseHoldLimit.deadLineDay != null and tHouseHoldLimit.deadLineDay.trim() != ''">
AND a.DEAD_LINE_DAY = #{tHouseHoldLimit.deadLineDay}
</if>
<if test="tHouseHoldLimit.addHandleRule != null and tHouseHoldLimit.addHandleRule.trim() != ''">
AND a.ADD_HANDLE_RULE = #{tHouseHoldLimit.addHandleRule}
</if>
<if test="tHouseHoldLimit.createBy != null and tHouseHoldLimit.createBy.trim() != ''">
AND a.CREATE_BY = #{tHouseHoldLimit.createBy}
</if>
<if test="tHouseHoldLimit.updateBy != null and tHouseHoldLimit.updateBy.trim() != ''">
AND a.UPDATE_BY = #{tHouseHoldLimit.updateBy}
</if>
<if test="tHouseHoldLimit.createTime != null">
AND a.CREATE_TIME = #{tHouseHoldLimit.createTime}
</if>
<if test="tHouseHoldLimit.updateTime != null">
AND a.UPDATE_TIME = #{tHouseHoldLimit.updateTime}
</if>
<if test="tHouseHoldLimit.updateTimeEnd != null">
AND a.UPDATE_TIME <![CDATA[<=]]> #{tHouseHoldLimit.updateTimeEnd}
</if>
<if test="tHouseHoldLimit.updateTimeStart != null">
AND a.UPDATE_TIME <![CDATA[>=]]> #{tHouseHoldLimit.updateTimeStart}
</if>
<if test="tHouseHoldLimit.createName != null and tHouseHoldLimit.createName.trim() != ''">
AND a.CREATE_NAME = #{tHouseHoldLimit.createName}
</if>
</if>
</sql>
<!--tHouseHoldLimit简单分页查询-->
<select id="getTHouseHoldLimitPage" resultMap="tHouseHoldLimitMap">
SELECT
<include refid="Base_Column_List"/>
FROM t_house_hold_limit a
<where>
1=1
<include refid="tHouseHoldLimit_where"/>
</where>
</select>
<select id="exportCountDiy" resultType="int">
SELECT
count(1)
FROM t_house_hold_limit a
<where>
1=1
<include refid="tHouseHoldLimit_where"/>
</where>
</select>
<select id="exportDiy" resultMap="tHouseHoldLimitExportMap">
SELECT
a.NAME,
a.TYPE,
CONCAT_WS('-',p.AREA_NAME,c.AREA_NAME,t.AREA_NAME) as 'PROVINCE',
a.DEAD_LINE_DAY,
a.ADD_HANDLE_RULE,
a.UPDATE_TIME,
a.CREATE_NAME
FROM t_house_hold_limit a
LEFT JOIN sys_area p on p.id=a.PROVINCE
LEFT JOIN sys_area c on c.id=a.CITY
LEFT JOIN sys_area t on t.id=a.TOWN
<where>
1=1
<include refid="tHouseHoldLimit_where"/>
<if test="tHouseHoldLimit != null">
<if test="tHouseHoldLimit.limitStart != null">
limit #{tHouseHoldLimit.limitStart},#{tHouseHoldLimit.limitEnd}
</if>
</if>
</where>
</select>
</mapper>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment