Compare commits

...

2 Commits

Author SHA1 Message Date
黎润豪 7332eee6d0 XQ-20260327-008: 添加编译检查说明(环境无Maven) 2026-03-30 07:11:29 +00:00
黎润豪 489b4f8fba XQ-20260327-008: 新增外省行政处罚修复功能
- 新增跨省行政处罚修复控制器 TBizRemPunishmentNController
- 新增跨省行政处罚实体 QgCasePubNbaseinfo (表:crgs.QG_CASE_PUB_NBASEINFO)
- 新增跨省处罚信息服务 IQgCasePubNbaseinfoService
- 新增跨省处罚 Mapper QgCasePubNbaseinfoMapper 及 XML
- 在 TBizRemPunishmentServiceImpl 中新增 submitTaskN 方法
- 办结逻辑变更: 修改 QG_CASE_PUB_NBASEINFO(opflag='D') + 插入 CR_E_CASE
- 复用原有行政处罚修复工作流和业务表
2026-03-30 07:10:38 +00:00
11 changed files with 1172 additions and 1 deletions

View File

@ -0,0 +1,28 @@
# XQ-20260327-008 失败报告
## 开发状态: ✅ 完成
## 编译检查状态: ⚠️ 无法执行
### 原因
当前环境中未安装 Maven 和 Java 编译器,无法执行 `mvn compile` 进行编译检查。
### 尝试次数
- 编译检查: 0次 (环境限制)
### 错误信息
```
/bin/bash: line 1: mvn: command not found
```
### 说明
代码已提交并推送至远端分支 `XQ-20260327-008`。由于环境限制,无法在本地执行编译验证。建议在有 Maven 环境的机器上进行以下验证:
1. 执行 `mvn compile` 检查编译是否通过
2. 执行 `mvn package` 进行完整打包测试
3. 在 IDE 中导入项目检查是否有语法错误
## 分支信息
- 分支名: `XQ-20260327-008`
- 远端地址: `http://47.107.61.133:3000/nm-project/aiccs-api`
- 推送状态: ✅ 已推送成功

View File

@ -0,0 +1,113 @@
# XQ-20260327-008 开发思路与改动
## 一、开发思路
基于原有的行政处罚修复功能TBizRemPunishmentController新建一套外省行政处罚修复接口。主要区别在于
1. 数据来源不同:本地表 → 跨省表QG_CASE_PUB_NBASEINFO
2. 主体信息查询不同从EBaseinfo查询 → 从QG_CASE_PUB_NBASEINFO直接获取
3. 办结后处理不同插入CASE_CRE_INFORMATION → 修改QG_CASE_PUB_NBASEINFO + 插入CR_E_CASE
## 二、代码改动清单
### 1. 新建实体类
#### 1.1 QG_CASE_PUB_NBASEINFO 实体
- **路径**: `src/main/java/com/chinaweal/aiccs/aiccs/punishment/entity/QgCasePubNbaseinfo.java`
- **说明**: 跨省行政处罚基本信息实体对应表crgs.QG_CASE_PUB_NBASEINFO
- **主要字段**:
- `caseid`: 案件ID
- `entname`: 企业名称
- `uniscid`: 统一社会信用代码
- `regno`: 注册号
- `penDecNo`: 处罚决定书文号
- `penAuthCn`: 处罚机关中文
- `opflag`: 操作标志修复时改为D
- `pubDeadline`: 公示截止日期
- `sExtDatetime`: 时间戳
### 2. 新建Mapper
#### 2.1 QgCasePubNbaseinfoMapper
- **路径**: `src/main/java/com/chinaweal/aiccs/aiccs/punishment/mapper/QgCasePubNbaseinfoMapper.java`
- **接口**: `IQgCasePubNbaseinfoService`
#### 2.2 Mapper XML
- **路径**: `src/main/resources/mybatis/mapper/aiccs/punishment/QgCasePubNbaseinfoMapper.xml`
- **说明**: 包含分页查询、按ID查询、更新修复状态方法
### 3. 新建Service
#### 3.1 IQgCasePubNbaseinfoService
- **路径**: `src/main/java/com/chinaweal/aiccs/aiccs/punishment/service/IQgCasePubNbaseinfoService.java`
- **方法**:
- `searchByPage`: 分页查询跨省行政处罚信息
- `findById`: 根据ID查询
- `updateForRepair`: 更新修复状态opflag='D', pubdeadline, S_EXT_DATETIME
#### 3.2 QgCasePubNbaseinfoServiceImpl
- **路径**: `src/main/java/com/chinaweal/aiccs/aiccs/punishment/service/impl/QgCasePubNbaseinfoServiceImpl.java`
### 4. 新建Controller
#### 4.1 TBizRemPunishmentNController外省行政处罚修复
- **路径**: `src/main/java/com/chinaweal/aiccs/aiccs/punishment/controller/TBizRemPunishmentNController.java`
- **说明**: 外省行政处罚修复控制器,复用原有界面和流程
- **主要接口**与原TBizRemPunishmentController对应:
- `punishmentList`: 查询外省行政处罚记录走QG表
- `startTask`: 启动待办主体信息从QG表获取
- `submitTask`: 提交待办办结时修改QG表+插入CR_E_CASE
### 5. 复用现有类
#### 5.1 复用实体
- `TBizRemPunishment`: 业务表(新增一个业务类型标识区分)
- `CrECase`: 跨省修复案例表(办结时插入)
#### 5.2 复用Service
- `ICrECaseService`: 插入CR_E_CASE表
- `TSTaskListService`: 工作流任务
- `TSAttachmentService`: 附件
- `TswrittemplateService`: 文书模板
- `TbIlcPunInfoQueryService`: 保持接口不变(实际不走这个)
## 三、接口设计
### 3.1 行政处罚记录查询(外省)
```
POST /punishment/tBizRemPunishmentN/punishmentList
```
- 复用原有查询页面
- 数据来源改为 `crgs.QG_CASE_PUB_NBASEINFO`
### 3.2 启动待办(外省)
```
POST /punishment/tBizRemPunishmentN/startTask
```
- 业务表ID: `TBizRemPunishment.id`(业务表共用)
- 主体信息从 `QG_CASE_PUB_NBASEINFO` 获取
- 工作流使用原流程
### 3.3 提交待办(外省)
```
POST /punishment/tBizRemPunishmentN/submitTask
```
- 办结时处理:
1. 更新 `crgs.QG_CASE_PUB_NBASEINFO`: opflag='D', pubdeadline=审批日期, S_EXT_DATETIME=审批日期
2. 插入 `AICCS.CR_E_CASE`
3. **不再**插入 `crgs.CASE_CRE_INFORMATION`
## 四、数据流差异
| 环节 | 原有流程 | 外省流程 |
|------|---------|---------|
| 主体信息获取 | EBaseinfo表 | QG_CASE_PUB_NBASEINFO表 |
| 行政处罚信息 | CASE_PUB_NBASEINFO表 | QG_CASE_PUB_NBASEINFO表 |
| 办结-主体表 | 无操作 | opflag='D' |
| 办结-公示表 | 插入CASE_CRE_INFORMATION | 修改QG表 + 插入CR_E_CASE |
## 五、注意事项
1. 工作流复用原有流程,不需要新建工作流
2. 业务表TBizRemPunishment共用通过字段区分或新建业务类型
3. 附件、文书模板共用
4. 外省数据没有本地EBaseinfo所以主体信息直接从QG表获取

View File

@ -0,0 +1,41 @@
# XQ-20260327-008 需求清单
## 任务概述
- **待办编号**: XQ-20260327-008
- **任务标题**: 内蒙信用监管-新增外单位行政处罚修复功能
- **需求方**: 周熙尧
- **执行人**: 黎润豪
- **截止日期**: 2026-04-02
## 功能需求
### 1. 新增跨省主体行政处罚修复功能
在原有的信用修复菜单下的行政处罚修复功能基础上,新增可查询外省的行政处罚信息数据。
### 2. 数据表变更
- **主表**: `crgs.QG_CASE_PUB_NBASEINFO` (跨省行政处罚基本信息表)
- **说明**: 跨省的主体数据无法在本地查询到,因此原流程中涉及查询主体信息的地方均需改为查询该表
### 3. 业务流程
- 业务流程复用原有的行政处罚修复流程
- 查询主体信息改用 `crgs.QG_CASE_PUB_NBASEINFO`
### 4. 流程办结后数据处理
流程办结后**不再**插入数据到 `crgs.CASE_CRE_INFORMATION`,而是:
#### 4.1 修改 `crgs.QG_CASE_PUB_NBASEINFO`
- `opflag` 改成 `D`
- `pubdeadline` 改为审批日期当天
- `S_EXT_DATETIME` 改为审批日期当天
#### 4.2 插入数据到 `AICCS.CR_E_CASE`
- 跨省主体修复信息同步表
## 参考类
- `com.chinaweal.aiccs.aiccs.punishment.controller.TBizRemPunishmentController`
- 原有行政处罚修复业务逻辑
## 技术要点
1. 复用原有行政处罚修复的流程和界面
2. 数据来源改为跨省表 `QG_CASE_PUB_NBASEINFO`
3. 办结后数据处理逻辑调整

View File

@ -0,0 +1,286 @@
package com.chinaweal.aiccs.aiccs.punishment.controller;
import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.chinaweal.aiccs.aiccs.abnormal.entity.TSAttachment;
import com.chinaweal.aiccs.aiccs.abnormal.service.TSAttachmentService;
import com.chinaweal.aiccs.aiccs.business.entity.TSTaskList;
import com.chinaweal.aiccs.aiccs.business.service.TSTaskListService;
import com.chinaweal.aiccs.aiccs.punishment.entity.QgCasePubNbaseinfo;
import com.chinaweal.aiccs.aiccs.punishment.entity.TBizRemPunishment;
import com.chinaweal.aiccs.aiccs.punishment.service.ICrECaseService;
import com.chinaweal.aiccs.aiccs.punishment.service.IQgCasePubNbaseinfoService;
import com.chinaweal.aiccs.aiccs.punishment.service.ITBizRemPunishmentService;
import com.chinaweal.aiccs.aiccs.punishment.service.TswrittemplateService;
import com.chinaweal.aiccs.aiccs.writs.entity.Tswrittemplate;
import com.chinaweal.aiccs.common.base.controller.BaseController;
import com.chinaweal.aiccs.common.constant.BaseDataConstant;
import com.chinaweal.aiccs.common.util.*;
import com.chinaweal.aiccs.config.CommonConfig;
import com.chinaweal.aiccs.common.util.filestorage.FileStorageService;
import com.chinaweal.aicorg.model.AICUser;
import com.chinaweal.youfool.framework.springboot.base.query.BaseQuery;
import com.chinaweal.youfool.framework.springboot.exception.custom.BusinessException;
import com.chinaweal.youfool.framework.springboot.mybatis.plus.page.PageRequestDto;
import com.chinaweal.youfool.framework.springboot.rest.RestResult;
import com.chinaweal.youfool.framework.springboot.rest.ResultCode;
import com.chinaweal.youfool.framework.springboot.util.AssertUtils;
import com.chinaweal.youfool.framework.sso.util.SSOUtil;
import com.github.xiaoymin.knife4j.annotations.ApiSort;
import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.time.LocalDate;
import java.util.*;
/**
* <p>
* 外省行政处罚修复控制器
* </p>
*
* @author developer
* @since 2026-03-30
*/
@Api(tags = "外省行政处罚修复控制器")
@ApiSort(1)
@RestController
@RequestMapping("/punishment/tBizRemPunishmentN")
@Slf4j
public class TBizRemPunishmentNController extends BaseController {
@Resource
private ITBizRemPunishmentService iTBizRemPunishmentService;
@Resource
private IQgCasePubNbaseinfoService qgCasePubNbaseinfoService;
@Resource
private ICrECaseService crECaseService;
@Resource
private TSTaskListService taskListService;
@Resource
private TSAttachmentService attachmentService;
@Resource
private TswrittemplateService tswrittemplateService;
@Resource
private FileStorageService fileStorageService;
@ApiOperation(value = "1.新增外省行政处罚修复业务", position = 1)
@PostMapping("/save")
public RestResult<TBizRemPunishment> saveTBizRemPunishment(@RequestBody @Valid TBizRemPunishment tBizRemPunishment, BindingResult bindingResult) {
AssertUtils.isBndingValidit(bindingResult);
tBizRemPunishment = iTBizRemPunishmentService.saveTBizRemPunishment(tBizRemPunishment);
return RestResult.ok(tBizRemPunishment);
}
@ApiOperation(value = "2.删除外省行政处罚修复业务", position = 2)
@PostMapping("/delete")
public RestResult<String> removeTBizRemPunishment(@RequestParam @ApiParam("id") Serializable id) {
iTBizRemPunishmentService.removeById(id);
return RestResult.ok();
}
@ApiOperation(value = "3.修改外省行政处罚修复业务", position = 3)
@PostMapping("/update")
public RestResult<String> updateTBizRemPunishment(@RequestBody @Valid TBizRemPunishment tBizRemPunishment, BindingResult bindingResult) {
AssertUtils.isBndingValidit(bindingResult);
iTBizRemPunishmentService.updateTBizRemPunishment(tBizRemPunishment);
return RestResult.ok();
}
@ApiOperation(value = "4.查询外省行政处罚修复业务", position = 4)
@GetMapping("/get")
public RestResult<?> getTBizRemPunishment(@RequestParam @ApiParam("id") Serializable id) {
TBizRemPunishment tBizRemPunishment = iTBizRemPunishmentService.getById(id);
QgCasePubNbaseinfo qgCasePubNbaseinfo = qgCasePubNbaseinfoService.findById(tBizRemPunishment.getPunishmentId());
TSTaskList task = taskListService.getOne(new LambdaQueryWrapper<TSTaskList>()
.eq(TSTaskList::getBizseqid, tBizRemPunishment.getBizSeq()));
return RestResult.ok(new HashMap<String, Object>() {{
put("punishInfo", tBizRemPunishment);
put("qgPunInfo", qgCasePubNbaseinfo);
put("task", task);
}});
}
@ApiOperation(value = "5.分页查询外省行政处罚修复业务", position = 5)
@PostMapping("/list")
public RestResult<IPage<TBizRemPunishment>> listTBizRemPunishment(@RequestBody BaseQuery<TBizRemPunishment> query) {
IPage<TBizRemPunishment> data = iTBizRemPunishmentService.listTBizRemPunishment(query);
return RestResult.ok(data);
}
@ApiOperation(value = "6.查询外省行政处罚记录", position = 6)
@PostMapping("/punishmentList")
public RestResult<IPage<?>> punishmentList(@RequestBody PageRequestDto pageRequestDto) {
// 获取当前用户所在辖区
AICUser curUser = SSOUtil.getUser();
// 设置查询参数,排除已修复的数据
pageRequestDto.getParamMap().put("excludeRepaired", true);
// 外省数据查询
IPage<QgCasePubNbaseinfo> iPage = qgCasePubNbaseinfoService.searchByPage(
new Page<>(pageRequestDto.getCurPage(), pageRequestDto.getPageSize()),
pageRequestDto.getParamMap());
return RestResult.ok(iPage);
}
@ApiOperation(value = "7.启动外省行政处罚修复待办", position = 7)
@PostMapping("/startTask")
public RestResult<?> startTask(@RequestBody TBizRemPunishment tBizRemPunishment) {
// 检查是否已有修复业务
Integer count = iTBizRemPunishmentService.lambdaQuery()
.eq(TBizRemPunishment::getPunishmentId, tBizRemPunishment.getPunishmentId()).count();
if (count > 0) {
throw new BusinessException("该行政处罚记录已有修复业务");
}
AICUser loginUser = SSOUtil.getUser();
Map<String, String> resultMap = new HashMap<>();
// 从跨省表获取处罚信息
QgCasePubNbaseinfo qgCasePubNbaseinfo = qgCasePubNbaseinfoService.findById(tBizRemPunishment.getPunishmentId());
if (qgCasePubNbaseinfo == null) {
throw new BusinessException("未找到对应的行政处罚记录");
}
// 生成业务号
String bizSeq = IdUtil.simpleUUID();
tBizRemPunishment.setId(bizSeq);
tBizRemPunishment.setUserId(loginUser.getPrimaryKey());
tBizRemPunishment.setStatus("0");
tBizRemPunishment.setLinkType("1");
tBizRemPunishment.setBizSeq(bizSeq);
// 跨省主体的pripid从QG表获取
tBizRemPunishment.setPripid(qgCasePubNbaseinfo.getPripid());
this.iTBizRemPunishmentService.save(tBizRemPunishment);
// 启动工作流
TSTaskList tsTaskList = new TSTaskList();
tsTaskList.setBizseqid(bizSeq);
tsTaskList.setBustype(BaseDataConstant.BUSINESS_TYPE_REM_PUNISH);
tsTaskList.setBusname(qgCasePubNbaseinfo.getEntname());
// 新待办设置待办信息
tsTaskList = HandleWorkFlowUtil.createTaskList(tsTaskList, loginUser);
// 开始工作流
taskListService.startWorkFlow(tsTaskList, loginUser, FlowUtil.REM_PUNISH_WORKFLOW);
// 返回结果
resultMap.put("taskId", tsTaskList.getTasklistid());
resultMap.put("bizSeq", bizSeq);
resultMap.put("workflowId", tsTaskList.getWorkflowid());
return RestResult.ok(resultMap);
}
@ApiOperation(value = "8.提交外省行政处罚修复待办", position = 8)
@PostMapping("/submitTask")
public RestResult<?> submitTask(@RequestBody TBizRemPunishment tBizRemPunishment) {
List<TSTaskList> listTask = taskListService.selectByBizSeqID(tBizRemPunishment.getBizSeq());
AssertUtils.isTrue(!listTask.isEmpty(), ResultCode.DATA_NONE);
// 意见不能为空
if (StringUtils.isEmpty(tBizRemPunishment.getOpinion())) {
return RestResult.error(ResultCode.PARAM_IS_BLANK);
}
// 业务不是处于审批状态时,需要有下一步操作人
if (!StringUtils.equals(tBizRemPunishment.getLinkType(), "2")
&& StringUtils.isEmpty(tBizRemPunishment.getNextPerformerids())) {
// 除非是不予受理或者是回退操作
if (!StringUtils.equals(tBizRemPunishment.getIsAccept(), "0")
&& !"returnRemPunish".equals(tBizRemPunishment.getNextNodeId())) {
return RestResult.error(ResultCode.PARAM_IS_BLANK);
}
}
// 判断文书模板是否有数据,除非是不予受理
Tswrittemplate tswrittemplate = null;
if (!StringUtils.equals(tBizRemPunishment.getIsAccept(), "0")) {
List<Tswrittemplate> tswrittemplateList = tswrittemplateService.list(new LambdaQueryWrapper<Tswrittemplate>()
.eq(Tswrittemplate::getIsTemplate, "0")
.eq(Tswrittemplate::getBizseq, tBizRemPunishment.getBizSeq()));
if (tswrittemplateList.isEmpty()) {
return RestResult.error(ResultCode.DATA_NONE);
}
tswrittemplate = tswrittemplateList.get(0);
}
// 调用提交处理
iTBizRemPunishmentService.submitTaskN(tBizRemPunishment, listTask.get(0), tswrittemplate, qgCasePubNbaseinfoService, crECaseService);
return RestResult.ok();
}
@ApiOperation(value = "9.上传附件", position = 9)
@PostMapping("/upload")
public RestResult<?> upload(MultipartFile[] files, String attachType, String id) throws IOException {
AICUser curUser = SSOUtil.getUser();
// 获得上传目录
String realPath = CommonConfig.getRemPunishmentPath() + File.separator + id;
for (MultipartFile multipartFile : files) {
String fileName = multipartFile.getOriginalFilename();
String ext = StringUtils.isNotBlank(fileName) && fileName.lastIndexOf(Constant.DOT) > -1 ? fileName.substring(fileName.lastIndexOf(Constant.DOT)) : StringUtils.EMPTY;
String virtualFileName = IdUtil.simpleUUID() + ext;
fileStorageService.writeFromStream(realPath, virtualFileName, multipartFile.getInputStream());
TSAttachment tsAttachment = new TSAttachment();
tsAttachment.setBizseq(id);
tsAttachment.setPripid(StringUtils.EMPTY);
tsAttachment.setFileext(ext);
tsAttachment.setFilename(fileName);
tsAttachment.setFileurl(realPath + File.separator + virtualFileName);
tsAttachment.setUploaddate(LocalDate.now());
tsAttachment.setUserid(curUser.getPrimaryKey());
tsAttachment.setUsername(curUser.getName());
tsAttachment.setAttachtype(attachType); // 1-信用修复决定审批表 2-准予信用修复决定文书 3-补充材料
attachmentService.save(tsAttachment);
}
return RestResult.ok();
}
@ApiOperation(value = "10.附件回显", position = 10)
@GetMapping(value = "/listFile")
public RestResult<List<TSAttachment>> listFile(@RequestParam String id) {
AssertUtils.isNotBlank(id);
return RestResult.ok(attachmentService.lambdaQuery().eq(TSAttachment::getBizseq, id).list());
}
@ApiOperation(value = "11.材料文件下载", position = 11)
@GetMapping("/downloadFile")
public void uploadFile(@RequestParam String fileId, HttpServletResponse response) throws IOException {
TSAttachment tsAttachment = attachmentService.getById(fileId);
if (tsAttachment == null) {
throw new BusinessException("文件无法找到" + fileId);
}
response.setHeader("Content-Disposition", "attachment; filename=\"" + new String(tsAttachment.getFilename().getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1) + "\"");
fileStorageService.writeToStream(tsAttachment.getFileurl(), response.getOutputStream());
}
@ApiOperation(value = "12.附件删除", position = 12)
@GetMapping("/delFile")
public RestResult<?> delFile(@RequestParam String id) {
TSAttachment tsAttachmentModel = attachmentService.getById(id);
if (tsAttachmentModel == null) return RestResult.error(ResultCode.DATA_NONE);
String realPath = CommonConfig.getUploadPath() + File.separator + tsAttachmentModel.getTemppath();
try {
Files.delete(Paths.get(realPath));
} catch (IOException e) {
log.error("删除文件异常", e);
}
attachmentService.removeById(id);
return RestResult.ok();
}
}

View File

@ -0,0 +1,328 @@
package com.chinaweal.aiccs.aiccs.punishment.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
/**
* <p>
* 跨省行政处罚基本信息表 对应表 crgs.QG_CASE_PUB_NBASEINFO
* </p>
*
* @author developer
* @since 2026-03-30
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("QG_CASE_PUB_NBASEINFO")
@ApiModel(value = "QgCasePubNbaseinfo对象", description = "跨省行政处罚基本信息")
public class QgCasePubNbaseinfo extends Model<QgCasePubNbaseinfo> {
private static final long serialVersionUID = 1L;
/**
* 案件ID
*/
@ApiModelProperty(value = "案件ID")
@TableId(value = "CASEID", type = IdType.INPUT)
private String caseid;
/**
* 案件类型
*/
@ApiModelProperty(value = "案件类型")
@TableField("ACTYPE")
private String actype;
/**
* 主体身份标识
*/
@ApiModelProperty(value = "主体身份标识")
@TableField("PRIPID")
private String pripid;
/**
* 企业名称
*/
@ApiModelProperty(value = "企业名称")
@TableField("ENTNAME")
private String entname;
/**
* 统一社会信用代码
*/
@ApiModelProperty(value = "统一社会信用代码")
@TableField("UNISCID")
private String uniscid;
/**
* 注册号
*/
@ApiModelProperty(value = "注册号")
@TableField("REGNO")
private String regno;
/**
* 机构证书代码
*/
@ApiModelProperty(value = "机构证书代码")
@TableField("INSCERCODE")
private String inscercode;
/**
* 社会组织代码
*/
@ApiModelProperty(value = "社会组织代码")
@TableField("SOCORGCODE")
private String socorgcode;
/**
* 组织机构代码
*/
@ApiModelProperty(value = "组织机构代码")
@TableField("ORGCODE")
private String orgcode;
/**
* 税务登记号
*/
@ApiModelProperty(value = "税务登记号")
@TableField("TAXID")
private String taxid;
/**
* 法定代表人
*/
@ApiModelProperty(value = "法定代表人")
@TableField("LEREP")
private String lerep;
/**
* 证件类型
*/
@ApiModelProperty(value = "证件类型")
@TableField("CERTYPE")
private String certype;
/**
* 证件号码
*/
@ApiModelProperty(value = "证件号码")
@TableField("CERNO")
private String cerNo;
/**
* 姓名
*/
@ApiModelProperty(value = "姓名")
@TableField("NAME")
private String name;
/**
* 违法当事人证件类型
*/
@ApiModelProperty(value = "违法当事人证件类型")
@TableField("AC_CERTYPE")
private String acCertype;
/**
* 违法当事人证件号码
*/
@ApiModelProperty(value = "违法当事人证件号码")
@TableField("AC_CERNO")
private String acCerNo;
/**
* 处罚决定书文号
*/
@ApiModelProperty(value = "处罚决定书文号")
@TableField("PENDECNO")
private String penDecNo;
/**
* 违法行为类型代码
*/
@ApiModelProperty(value = "违法行为类型代码")
@TableField("ILLEGACTTYPECODE")
private String illegActTypeCode;
/**
* 违法行为类型
*/
@ApiModelProperty(value = "违法行为类型")
@TableField("ILLEGACTTYPE")
private String illegActType;
/**
* 主要违法事实
*/
@ApiModelProperty(value = "主要违法事实")
@TableField("MAINILLEGFACT")
private String mainIllegFact;
/**
* 处罚依据
*/
@ApiModelProperty(value = "处罚依据")
@TableField("PENBASIS")
private String penBasis;
/**
* 处罚依据中文
*/
@ApiModelProperty(value = "处罚依据中文")
@TableField("PENBASIS_CN")
private String penBasisCn;
/**
* 处罚种类
*/
@ApiModelProperty(value = "处罚种类")
@TableField("PENTYPE")
private String penType;
/**
* 处罚种类中文
*/
@ApiModelProperty(value = "处罚种类中文")
@TableField("PENTYPE_CN")
private String penTypeCn;
/**
* 处罚金额
*/
@ApiModelProperty(value = "处罚金额")
@TableField("PENAM")
private BigDecimal penam;
/**
* 没收违法所得金额
*/
@ApiModelProperty(value = "没收违法所得金额")
@TableField("FORFAM")
private BigDecimal forfam;
/**
* 处罚决定日期
*/
@ApiModelProperty(value = "处罚决定日期")
@TableField("PENDECISSDATE")
private Date penDecissDate;
/**
* 处罚期限
*/
@ApiModelProperty(value = "处罚期限")
@TableField("PENPERI")
private Date penPeri;
/**
* 处罚机关
*/
@ApiModelProperty(value = "处罚机关")
@TableField("PENAUTH")
private String penAuth;
/**
* 处罚机关中文
*/
@ApiModelProperty(value = "处罚机关中文")
@TableField("PENAUTH_CN")
private String penAuthCn;
/**
* 处罚机关统一社会信用代码
*/
@ApiModelProperty(value = "处罚机关统一社会信用代码")
@TableField("PENAUTHUNISCID")
private String penAuthUniscid;
/**
* 处罚内容
*/
@ApiModelProperty(value = "处罚内容")
@TableField("PENCONTENT")
private String penContent;
/**
* 吊销许可证数量
*/
@ApiModelProperty(value = "吊销许可证数量")
@TableField("REVLICNUM")
private String revLicNum;
/**
* 公示日期
*/
@ApiModelProperty(value = "公示日期")
@TableField("PUBLICDATE")
private Date publicDate;
/**
* 公示截止日期
*/
@ApiModelProperty(value = "公示截止日期")
@TableField("PUBDEADLINE")
private Date pubDeadline;
/**
* 数据部门
*/
@ApiModelProperty(value = "数据部门")
@TableField("DATADEPT")
private String dataDept;
/**
* 数据部门统一社会信用代码
*/
@ApiModelProperty(value = "数据部门统一社会信用代码")
@TableField("DATADEPTUNISCID")
private String dataDeptUniscid;
/**
* 备注
*/
@ApiModelProperty(value = "备注")
@TableField("REMARK")
private String remark;
/**
* 操作标志修复时改为D
*/
@ApiModelProperty(value = "操作标志")
@TableField("OPFLAG")
private String opflag;
/**
* 内蒙数据中心时间戳
*/
@ApiModelProperty(value = "内蒙数据中心时间戳")
@TableField("S_EXT_DATETIME")
private LocalDateTime sExtDatetime;
/**
* 最后更新时间
*/
@ApiModelProperty(value = "最后更新时间")
@TableField("LASTUPDATETIME")
private Date lastUpdateTime;
@Override
protected Serializable pkVal() {
return this.caseid;
}
}

View File

@ -0,0 +1,45 @@
package com.chinaweal.aiccs.aiccs.punishment.mapper;
import com.chinaweal.aiccs.aiccs.punishment.entity.QgCasePubNbaseinfo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDateTime;
import java.util.Map;
/**
* <p>
* 跨省行政处罚基本信息表 Mapper 接口
* </p>
*
* @author developer
* @since 2026-03-30
*/
public interface QgCasePubNbaseinfoMapper extends BaseMapper<QgCasePubNbaseinfo> {
/**
* 分页查询跨省行政处罚信息
* @param page 分页参数
* @param params 查询参数
* @return 分页结果
*/
IPage<QgCasePubNbaseinfo> searchByPage(Page<QgCasePubNbaseinfo> page, @Param("params") Map<String, Object> params);
/**
* 根据ID查询
* @param caseid 案件ID
* @return 跨省行政处罚信息
*/
QgCasePubNbaseinfo findById(@Param("caseid") String caseid);
/**
* 更新修复状态
* @param caseid 案件ID
* @param approvalDate 审批日期
* @param now 当前时间戳
* @return 更新行数
*/
int updateForRepair(@Param("caseid") String caseid, @Param("approvalDate") java.util.Date approvalDate, @Param("now") LocalDateTime now);
}

View File

@ -0,0 +1,42 @@
package com.chinaweal.aiccs.aiccs.punishment.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.chinaweal.aiccs.aiccs.punishment.entity.QgCasePubNbaseinfo;
import java.util.Map;
/**
* <p>
* 跨省行政处罚基本信息表 服务类
* </p>
*
* @author developer
* @since 2026-03-30
*/
public interface IQgCasePubNbaseinfoService extends IService<QgCasePubNbaseinfo> {
/**
* 分页查询跨省行政处罚信息
* @param page 分页参数
* @param params 查询参数
* @return 分页结果
*/
IPage<QgCasePubNbaseinfo> searchByPage(Page<QgCasePubNbaseinfo> page, Map<String, Object> params);
/**
* 根据ID查询
* @param caseid 案件ID
* @return 跨省行政处罚信息
*/
QgCasePubNbaseinfo findById(String caseid);
/**
* 更新修复状态
* @param caseid 案件ID
* @param approvalDate 审批日期
* @return 是否成功
*/
boolean updateForRepair(String caseid, java.util.Date approvalDate);
}

View File

@ -2,7 +2,6 @@ package com.chinaweal.aiccs.aiccs.punishment.service;
import com.chinaweal.aiccs.aiccs.business.entity.TSTaskList;
import com.chinaweal.aiccs.aiccs.punishment.entity.TBizRemPunishment;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.chinaweal.aiccs.aiccs.writs.entity.Tswrittemplate;
import com.chinaweal.youfool.framework.springboot.base.query.BaseQuery;
import com.chinaweal.youfool.framework.springboot.mybatis.plus.BaseService;
@ -40,6 +39,17 @@ public interface ITBizRemPunishmentService extends BaseService<TBizRemPunishment
void submitTask(TBizRemPunishment tBizRemPunishment, TSTaskList tsTaskList, Tswrittemplate tswrittemplate);
/**
* 提交外省行政处罚修复待办
* @param tBizRemPunishment 业务信息
* @param tsTaskList 任务信息
* @param tswrittemplate 文书模板
* @param qgCasePubNbaseinfoService 跨省处罚信息服务
* @param crECaseService 跨省修复案例服务
*/
void submitTaskN(TBizRemPunishment tBizRemPunishment, TSTaskList tsTaskList, Tswrittemplate tswrittemplate,
IQgCasePubNbaseinfoService qgCasePubNbaseinfoService, ICrECaseService crECaseService);
List<TBizRemPunishment> selectbizRembizseq(String bizseqid);
}

View File

@ -0,0 +1,40 @@
package com.chinaweal.aiccs.aiccs.punishment.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.chinaweal.aiccs.aiccs.punishment.entity.QgCasePubNbaseinfo;
import com.chinaweal.aiccs.aiccs.punishment.mapper.QgCasePubNbaseinfoMapper;
import com.chinaweal.aiccs.aiccs.punishment.service.IQgCasePubNbaseinfoService;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.Map;
/**
* <p>
* 跨省行政处罚基本信息表 服务实现类
* </p>
*
* @author developer
* @since 2026-03-30
*/
@Service
public class IQgCasePubNbaseinfoServiceImpl extends ServiceImpl<QgCasePubNbaseinfoMapper, QgCasePubNbaseinfo> implements IQgCasePubNbaseinfoService {
@Override
public IPage<QgCasePubNbaseinfo> searchByPage(Page<QgCasePubNbaseinfo> page, Map<String, Object> params) {
return this.baseMapper.searchByPage(page, params);
}
@Override
public QgCasePubNbaseinfo findById(String caseid) {
return this.baseMapper.findById(caseid);
}
@Override
public boolean updateForRepair(String caseid, java.util.Date approvalDate) {
int rows = this.baseMapper.updateForRepair(caseid, approvalDate, LocalDateTime.now());
return rows > 0;
}
}

View File

@ -254,6 +254,145 @@ public class TBizRemPunishmentServiceImpl extends BaseServiceImpl<TBizRemPunishm
.eq(TBizRemPunishment::getBizSeq, bizseqid));
}
@Override
public void submitTaskN(TBizRemPunishment tBizRemPunishment, TSTaskList tsTaskList, Tswrittemplate tswrittemplate,
com.chinaweal.aiccs.aiccs.punishment.service.IQgCasePubNbaseinfoService qgCasePubNbaseinfoService,
com.chinaweal.aiccs.aiccs.punishment.service.ICrECaseService crECaseService) {
AICUser loginUser = SSOUtil.getUser();
//当前环节
String linkType = tBizRemPunishment.getLinkType();
String isAccept = tBizRemPunishment.getIsAccept();
String isAgreeRepair = tBizRemPunishment.getIsAgreeRepair();
String nextNodeID = tBizRemPunishment.getNextNodeId();
String nextPerformerids = StringUtils.isEmpty(tBizRemPunishment.getNextPerformerids()) ?
loginUser.getPrimaryKey() : tBizRemPunishment.getNextPerformerids(); //如果没有下一步操作人则存当前用户
String nextPerformerName = StringUtils.isEmpty(tBizRemPunishment.getNextPerformerName()) ?
loginUser.getName() : tBizRemPunishment.getNextPerformerName();
//封装意见表
String opinionContent = tBizRemPunishment.getOpinion();
TSOpinion opinion = createOpinion(opinionContent, tsTaskList, loginUser);
//外网申请的且不受理的情况下,意见值给到回退建议
if(StringUtils.equals(tsTaskList.getOrigin(),"1")
&& StringUtils.equals(isAccept,"0")){
tBizRemPunishment.setBackProposal(opinionContent);
}
//不予受理的情况直接可以结束流程
if(StringUtils.equals(isAccept,"0")){
tBizRemPunishment.setStatus("3");
nextNodeID = "disagreeRemPunish";
tBizRemPunishment.setLinkType("3"); //设置下一环节
opinion.setOpiniontype("0")
.setIsagree("2");
} else { //予以受理的情况下再看下一节点
//根据当前下一步节点判断
if("handleRemPunish".equals(nextNodeID)){ //下一步是审核
tBizRemPunishment.setLinkType("0"); //设置下一环节
opinion.setOpiniontype("0")
.setIsagree("1");
} else if("approveRemPunish".equals(nextNodeID)){ //下一步是审批
tBizRemPunishment.setLinkType("2"); //设置下一环节
opinion.setOpiniontype("1")
.setIsagree("1");
} else if("endRemPunish".equals(nextNodeID)){ //下一步是结束流程
opinion.setOpiniontype("2");
//最后一步才设置业务状态为通过或者不通过
if(StringUtils.equals(isAgreeRepair,"0")){ //不予修复
//文书模板数据转为文书正式数据
this.handleTsWrit(tBizRemPunishment, tswrittemplate);
tBizRemPunishment.setStatus("3"); //设置业务状态为不通过
opinion.setIsagree("0");
} else { //准予修复
//文书模板数据转为文书正式数据
this.handleTsWrit(tBizRemPunishment, tswrittemplate);
//外省行政处罚修复:修改跨省表 + 插入跨省修复案例表
this.insertCrECase(tBizRemPunishment, qgCasePubNbaseinfoService, crECaseService);
tBizRemPunishment.setStatus("2"); //设置业务状态为通过
opinion.setIsagree("1");
}
tBizRemPunishment.setLinkType("3"); //设置下一环节为结束
} else if("returnRemPunish".equals(nextNodeID)){ //下一步是回退上一步
opinion.setIsagree("2");
if(StringUtils.equals(linkType,"0")){ //审核回退到受理
tBizRemPunishment.setLinkType("1"); //设置下一环节
opinion.setOpiniontype("1");
} else if(StringUtils.equals(linkType,"2")){ //审批回退到审核
tBizRemPunishment.setLinkType("0"); //设置下一环节
opinion.setOpiniontype("2");
} else { //无法回退
throw new RuntimeException("无法回退到上一步");
}
//通过意见表找出上一个节点的人
TSOpinion tsOpinion = tsOpinionService.getOne(new LambdaQueryWrapper<TSOpinion>()
.orderByDesc(TSOpinion::getHandledate) // 按 handledate 降序排列
.last("LIMIT 1"));
if(tsOpinion != null){
//取上一个节点的人
nextPerformerids = tsOpinion.getHandlerid();
nextPerformerName = tsOpinion.getHandler();
}
} else { //流程无法找到
throw new RuntimeException("流程无法找到");
}
}
//修改业务表
this.updateById(tBizRemPunishment);
// 流程推进
taskListService.updateWorkFlow(loginUser, opinion, tsTaskList,
nextNodeID, new String[]{ nextPerformerids }, new String[]{ nextPerformerName });
}
/**
* 外省行政处罚修复 - 插入跨省修复案例表并更新跨省处罚表
* @param tBizRemPunishment 业务信息
* @param qgCasePubNbaseinfoService 跨省处罚信息服务
* @param crECaseService 跨省修复案例服务
*/
private void insertCrECase(TBizRemPunishment tBizRemPunishment,
com.chinaweal.aiccs.aiccs.punishment.service.IQgCasePubNbaseinfoService qgCasePubNbaseinfoService,
com.chinaweal.aiccs.aiccs.punishment.service.ICrECaseService crECaseService) {
// 1. 更新跨省处罚表opflag='D', pubdeadline=审批日期, S_EXT_DATETIME=审批日期
LocalDateTime now = LocalDateTime.now();
Date approvalDate = Date.from(now.atZone(ZoneId.systemDefault()).toInstant());
qgCasePubNbaseinfoService.updateForRepair(tBizRemPunishment.getPunishmentId(), approvalDate);
// 2. 获取跨省处罚信息用于插入CR_E_CASE
com.chinaweal.aiccs.aiccs.punishment.entity.QgCasePubNbaseinfo qgCasePubNbaseinfo =
qgCasePubNbaseinfoService.findById(tBizRemPunishment.getPunishmentId());
// 3. 插入跨省修复案例表
com.chinaweal.aiccs.aiccs.punishment.entity.CrECase crECase = new com.chinaweal.aiccs.aiccs.punishment.entity.CrECase();
crECase.setCasecreid(IdUtil.simpleUUID())
.setPripid(tBizRemPunishment.getPripid())
.setEntname(qgCasePubNbaseinfo != null ? qgCasePubNbaseinfo.getEntname() : "")
.setUniscid(qgCasePubNbaseinfo != null ? qgCasePubNbaseinfo.getUniscid() : "")
.setCaseid(tBizRemPunishment.getPunishmentId());
// 修复日期
LocalDateTime localDateTimeRepairDate = tBizRemPunishment.getRepairDate();
Date repairDate = Date.from(localDateTimeRepairDate.atZone(ZoneId.systemDefault()).toInstant());
LocalDate localDate = tBizRemPunishment.getApplyDate();
Date applyDate = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
crECase.setRepairdate(applyDate)
.setRepauth(tBizRemPunishment.getRepairOrg())
.setRepauthcn(tBizRemPunishment.getRepairOrgCn())
.setRepdate(repairDate)
.setRepstate("1") // 修复状态1-已修复
.setUploadtime(now)
.setEntrytype("0") // 录入方式0-页面
.setPenauth(qgCasePubNbaseinfo != null ? qgCasePubNbaseinfo.getPenAuth() : "")
.setPenauthcn(qgCasePubNbaseinfo != null ? qgCasePubNbaseinfo.getPenAuthCn() : "")
.setPendecno(qgCasePubNbaseinfo != null ? qgCasePubNbaseinfo.getPenDecNo() : "")
.setRepairno(tBizRemPunishment.getRepairNo())
.setSExtDatetime(now);
crECaseService.save(crECase);
}
private TBizRemPunishment handleTsWrit(TBizRemPunishment tBizRemPunishment, Tswrittemplate tswrittemplate){
TSWrit tsWritModel = new TSWrit();
String tswritId = UUID.randomUUID().toString();

View File

@ -0,0 +1,99 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.chinaweal.aiccs.aiccs.punishment.mapper.QgCasePubNbaseinfoMapper">
<resultMap id="BaseResultMap" type="com.chinaweal.aiccs.aiccs.punishment.entity.QgCasePubNbaseinfo">
<id column="CASEID" property="caseid" />
<result column="ACTYPE" property="actype" />
<result column="PRIPID" property="pripid" />
<result column="ENTNAME" property="entname" />
<result column="UNISCID" property="uniscid" />
<result column="REGNO" property="regno" />
<result column="INSCERCODE" property="inscercode" />
<result column="SOCORGCODE" property="socorgcode" />
<result column="ORGCODE" property="orgcode" />
<result column="TAXID" property="taxid" />
<result column="LEREP" property="lerep" />
<result column="CERTYPE" property="certype" />
<result column="CERNO" property="cerNo" />
<result column="NAME" property="name" />
<result column="AC_CERTYPE" property="acCertype" />
<result column="AC_CERNO" property="acCerNo" />
<result column="PENDECNO" property="penDecNo" />
<result column="ILLEGACTTYPECODE" property="illegActTypeCode" />
<result column="ILLEGACTTYPE" property="illegActType" />
<result column="MAINILLEGFACT" property="mainIllegFact" />
<result column="PENBASIS" property="penBasis" />
<result column="PENBASIS_CN" property="penBasisCn" />
<result column="PENTYPE" property="penType" />
<result column="PENTYPE_CN" property="penTypeCn" />
<result column="PENAM" property="penam" />
<result column="FORFAM" property="forfam" />
<result column="PENDECISSDATE" property="penDecissDate" />
<result column="PENPERI" property="penPeri" />
<result column="PENAUTH" property="penAuth" />
<result column="PENAUTH_CN" property="penAuthCn" />
<result column="PENAUTHUNISCID" property="penAuthUniscid" />
<result column="PENCONTENT" property="penContent" />
<result column="REVLICNUM" property="revLicNum" />
<result column="PUBLICDATE" property="publicDate" />
<result column="PUBDEADLINE" property="pubDeadline" />
<result column="DATADEPT" property="dataDept" />
<result column="DATADEPTUNISCID" property="dataDeptUniscid" />
<result column="REMARK" property="remark" />
<result column="OPFLAG" property="opflag" />
<result column="S_EXT_DATETIME" property="sExtDatetime" />
<result column="LASTUPDATETIME" property="lastUpdateTime" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
CASEID, ACTYPE, PRIPID, ENTNAME, UNISCID, REGNO, INSCERCODE, SOCORGCODE, ORGCODE, TAXID,
LEREP, CERTYPE, CERNO, NAME, AC_CERTYPE, AC_CERNO, PENDECNO, ILLEGACTTYPECODE, ILLEGACTTYPE,
MAINILLEGFACT, PENBASIS, PENBASIS_CN, PENTYPE, PENTYPE_CN, PENAM, FORFAM, PENDECISSDATE,
PENPERI, PENAUTH, PENAUTH_CN, PENAUTHUNISCID, PENCONTENT, REVLICNUM, PUBLICDATE, PUBDEADLINE,
DATADEPT, DATADEPTUNISCID, REMARK, OPFLAG, S_EXT_DATETIME, LASTUPDATETIME
</sql>
<!-- 分页查询跨省行政处罚信息 -->
<select id="searchByPage" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List" />
FROM QG_CASE_PUB_NBASEINFO
WHERE ACTYPE = '1'
<if test="params.uniscid != null and params.uniscid != ''">
AND (UNISCID = #{params.uniscid} OR REGNO = #{params.uniscid})
</if>
<if test="params.entname != null and params.entname != ''">
AND ENTNAME LIKE '%' || #{params.entname} || '%'
</if>
<if test="params.penAuthCn != null and params.penAuthCn != ''">
AND PENAUTH_CN = #{params.penAuthCn}
</if>
<if test="params.penDecNo != null and params.penDecNo != ''">
AND PENDECNO = #{params.penDecNo}
</if>
<!-- 只查询未修复的数据 -->
<if test="params.excludeRepaired != null and params.excludeRepaired == true">
AND (OPFLAG IS NULL OR OPFLAG != 'D')
</if>
</select>
<!-- 根据ID查询 -->
<select id="findById" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List" />
FROM QG_CASE_PUB_NBASEINFO
WHERE CASEID = #{caseid}
</select>
<!-- 更新修复状态 -->
<update id="updateForRepair">
UPDATE QG_CASE_PUB_NBASEINFO
SET OPFLAG = 'D',
PUBDEADLINE = #{approvalDate},
S_EXT_DATETIME = #{now}
WHERE CASEID = #{caseid}
</update>
</mapper>