From e7f846d0fbc9bc98d7f50c0c19a18a0479b2b898 Mon Sep 17 00:00:00 2001 From: cc_caijp <1049976610@qq.com> Date: Wed, 21 Jan 2026 17:15:11 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=86=85=E8=92=99=E5=8F=A4=E4=BF=A1=E7=94=A8?= =?UTF-8?q?=E7=9B=91=E7=AE=A1=E7=B3=BB=E7=BB=9F=E9=99=A4=E5=90=8D=E5=91=8A?= =?UTF-8?q?=E7=9F=A5=E3=80=81=E5=BC=82=E8=AE=AE=E5=8F=8A=E5=86=B3=E5=AE=9A?= =?UTF-8?q?=E7=AD=89=E4=B8=9A=E5=8A=A1=E6=B5=81=E7=A8=8B=E8=B0=83=E6=95=B4?= =?UTF-8?q?=202.=E6=96=B0=E5=A2=9E=E5=86=85=E8=92=99=E5=8F=A4=E4=BF=A1?= =?UTF-8?q?=E7=94=A8=E7=9B=91=E7=AE=A1=E7=B3=BB=E7=BB=9F=E9=99=A4=E5=90=8D?= =?UTF-8?q?=E5=91=8A=E7=9F=A5=E3=80=81=E5=BC=82=E8=AE=AE=E5=8F=8A=E5=86=B3?= =?UTF-8?q?=E5=AE=9A=E7=AD=89=E4=B8=9A=E5=8A=A1=E8=AF=A6=E6=83=85=E6=9F=A5?= =?UTF-8?q?=E7=9C=8B=E5=8A=9F=E8=83=BD=203.=E6=96=B0=E5=A2=9E=E5=86=85?= =?UTF-8?q?=E8=92=99=E5=8F=A4=E4=BF=A1=E7=94=A8=E7=9B=91=E7=AE=A1=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E9=99=A4=E5=90=8D=E5=91=8A=E7=9F=A5=E3=80=81=E5=BC=82?= =?UTF-8?q?=E8=AE=AE=E5=8F=8A=E5=86=B3=E5=AE=9A=E7=AD=89=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E5=AE=A1=E6=89=B9=E6=96=87=E4=B9=A6=E7=94=9F=E6=88=90=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EntBaseExpelledInfoController.java | 126 ++-- .../expelled/entity/EntBaseExpelledInfo.java | 7 + .../expelled/entity/ExpelledApplyInfo.java | 4 +- .../expelled/entity/ExpelledAuditInfo.java | 14 + .../expelled/entity/ExpelledBizInfo.java | 21 + .../expelled/entity/ExpelledEntInfo.java | 4 +- .../mapper/ExpelledAuditInfoMapper.java | 4 + .../mapper/ExpelledBizInfoMapper.java | 4 + .../service/IEntBaseExpelledInfoService.java | 5 + .../service/IExpelledApplyInfoService.java | 4 +- .../service/IExpelledAuditInfoService.java | 55 +- .../service/IExpelledBizInfoService.java | 45 +- .../service/IExpelledEntInfoService.java | 7 + .../service/IExpelledResultInfoService.java | 7 + .../impl/EntBaseExpelledInfoServiceImpl.java | 30 + .../impl/ExpelledApplyInfoServiceImpl.java | 49 +- .../impl/ExpelledAuditInfoServiceImpl.java | 705 ++++++++++++++++-- .../impl/ExpelledBizInfoServiceImpl.java | 459 +++++++++++- .../impl/ExpelledEntInfoServiceImpl.java | 7 +- .../impl/ExpelledResultInfoServiceImpl.java | 6 + .../aiccs/aiccs/expelled/vo/AuditInfoVo.java | 8 + .../aiccs/expelled/vo/RemoveApproveInfo.java | 13 +- .../common/constant/BaseDataConstant.java | 9 +- .../expelled/ExpelledAuditInfoMapper.xml | 36 + .../aiccs/expelled/ExpelledBizInfoMapper.xml | 24 + .../static/template/expelled/auditDoc.docx | Bin 0 -> 16035 bytes .../static/template/expelled/auditEntDoc.docx | Bin 0 -> 16368 bytes .../static/template/expelled/noticeDoc.docx | Bin 0 -> 15536 bytes .../template/expelled/noticeEntDoc.docx | Bin 0 -> 15636 bytes 29 files changed, 1479 insertions(+), 174 deletions(-) create mode 100644 src/main/resources/static/template/expelled/auditDoc.docx create mode 100644 src/main/resources/static/template/expelled/auditEntDoc.docx create mode 100644 src/main/resources/static/template/expelled/noticeDoc.docx create mode 100644 src/main/resources/static/template/expelled/noticeEntDoc.docx diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/controller/EntBaseExpelledInfoController.java b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/controller/EntBaseExpelledInfoController.java index fa56877..dcb2f06 100644 --- a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/controller/EntBaseExpelledInfoController.java +++ b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/controller/EntBaseExpelledInfoController.java @@ -5,9 +5,9 @@ import com.chinaweal.aiccs.aiccs.expelled.entity.EntBaseExpelledInfo; import com.chinaweal.aiccs.aiccs.expelled.entity.ExpelledApplyInfo; import com.chinaweal.aiccs.aiccs.expelled.entity.ExpelledBizInfo; import com.chinaweal.aiccs.aiccs.expelled.service.IEntBaseExpelledInfoService; +import com.chinaweal.aiccs.aiccs.expelled.service.IExpelledApplyInfoService; import com.chinaweal.aiccs.aiccs.expelled.service.IExpelledAuditInfoService; import com.chinaweal.aiccs.aiccs.expelled.service.IExpelledBizInfoService; -import com.chinaweal.aiccs.aiccs.expelled.service.IExpelledApplyInfoService; import com.chinaweal.aiccs.aiccs.expelled.vo.AuditInfoVo; import com.chinaweal.aiccs.aiccs.expelled.vo.BizInfoVo; import com.chinaweal.aiccs.aiccs.expelled.vo.RemoveApproveInfo; @@ -19,7 +19,6 @@ import com.github.xiaoymin.knife4j.annotations.ApiSort; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -87,136 +86,153 @@ public class EntBaseExpelledInfoController extends BaseController { return RestResult.ok(); } - @ApiOperation(value = "5.分页查询除名告知通知书管理", position = 5) - @PostMapping("/notice/list") - public RestResult> listNotice(@RequestBody BaseQuery query) { - IPage data = expelledBizInfoService.listExpelledNoticeInfo(query); - return RestResult.ok(data); + @ApiOperation(value = "5.启动除名告知业务", position = 5) + @PostMapping("/notice/startBiz") + public RestResult startNoticeBiz(@RequestBody ExpelledBizInfo query, HttpServletRequest request) { + return expelledBizInfoService.startNoticeBiz(query, request); } - @ApiOperation(value = "6.新增、更新、删除除名告知通知书管理", position = 6) - @PostMapping("/notice/save") - public RestResult saveNotice(@RequestBody ExpelledBizInfo query) { - if (CollectionUtils.isEmpty(query.getExpelledIds())) { - return RestResult.error(ResultCode.PARAM_IS_BLANK, "请至少勾选一个拟除名市场主体"); - } - expelledBizInfoService.saveExpelledNoticeInfo(query); - return RestResult.ok(); + @ApiOperation(value = "6.获取除名告知业务详情", position = 6) + @GetMapping("/notice/getBiz") + public RestResult getNoticeBiz(String bizId) { + return expelledBizInfoService.getNoticeBiz(bizId); } - @ApiOperation(value = "7.分页查询可引用的市场主体拟除名告知业务信息", position = 7) + @ApiOperation(value = "7.除名告知业务审批流程", position = 7) + @PostMapping("/notice/nextBiz") + public RestResult nextNoticeBiz(@RequestBody RemoveApproveInfo removeApproveInfo, HttpServletRequest request) { + return expelledBizInfoService.nextNoticeBiz(removeApproveInfo, request); + } + + @ApiOperation(value = "8.分页查询可引用的市场主体拟除名告知业务信息", position = 8) @PostMapping("/notice/toDo") public RestResult> listTodoNoticeInfo(@RequestBody BaseQuery query) { IPage data = expelledBizInfoService.listTodoNoticeInfo(query); return RestResult.ok(data); } - @ApiOperation(value = "8.分页查询除名异议管理", position = 8) - @PostMapping("/objection/list") - public RestResult> listObjection(@RequestBody BaseQuery query) { - IPage data = expelledAuditInfoService.listHavedoAuditInfo(query); - return RestResult.ok(data); + @ApiOperation(value = "9.启动除名异议业务", position = 9) + @PostMapping("/objection/startBiz") + public RestResult startObjectionBiz(@RequestBody AuditInfoVo query, HttpServletRequest request) { + return expelledAuditInfoService.startObjectionBiz(query, request); } - @ApiOperation(value = "9.新增、更新、删除除名异议管理", position = 9) - @PostMapping("/objection/save") - public RestResult saveObjection(@RequestBody AuditInfoVo query) { - if (CollectionUtils.isEmpty(query.getBizInfos())) { - return RestResult.error(ResultCode.PARAM_IS_BLANK, "请至少勾选一个拟除名市场主体"); - } - expelledAuditInfoService.saveObjection(query); - return RestResult.ok(); + @ApiOperation(value = "10.获取除名异议业务详情", position = 10) + @GetMapping("/objection/getBiz") + public RestResult getObjectionBiz(String bizId) { + return expelledAuditInfoService.getObjectionBiz(bizId); } - @ApiOperation(value = "10.分页查询除名决定管理", position = 10) - @PostMapping("/audit/list") - public RestResult> listAudit(@RequestBody BaseQuery query) { - IPage data = expelledAuditInfoService.listHavedoAuditInfo(query); - return RestResult.ok(data); + @ApiOperation(value = "11.除名异议业务审批流程", position = 11) + @PostMapping("/objection/nextBiz") + public RestResult nextObjectionBiz(@RequestBody RemoveApproveInfo removeApproveInfo, HttpServletRequest request) { + return expelledAuditInfoService.nextObjectionBiz(removeApproveInfo, request); } - @ApiOperation(value = "11.新增、更新、删除除名决定管理", position = 11) - @PostMapping("/audit/save") - public RestResult saveAudit(@RequestBody AuditInfoVo query, HttpServletRequest request) { - if (CollectionUtils.isEmpty(query.getBizInfos())) { - return RestResult.error(ResultCode.PARAM_IS_BLANK, "请至少勾选一个拟除名市场主体"); - } - expelledAuditInfoService.saveAudit(query, request); - return RestResult.ok(); + @ApiOperation(value = "12.启动除名决定业务", position = 12) + @PostMapping("/audit/startBiz") + public RestResult startAuditBiz(@RequestBody AuditInfoVo query, HttpServletRequest request) { + return expelledAuditInfoService.startAuditBiz(query, request); } - @ApiOperation(value = "12.分页查询除名公告管理", position = 12) + @ApiOperation(value = "13.获取除名决定业务详情", position = 13) + @GetMapping("/audit/getBiz") + public RestResult getAuditBiz(String bizId) { + return expelledAuditInfoService.getAuditBiz(bizId); + } + + @ApiOperation(value = "14.除名决定业务审批流程", position = 14) + @PostMapping("/audit/nextBiz") + public RestResult nextAuditBiz(@RequestBody RemoveApproveInfo removeApproveInfo, HttpServletRequest request) { + return expelledAuditInfoService.nextAuditBiz(removeApproveInfo, request); + } + + @ApiOperation(value = "15.分页查询除名公告管理", position = 15) @PostMapping("/announcement/list") public RestResult> listAnnouncement(@RequestBody BaseQuery query) { IPage data = expelledAuditInfoService.listHavedoAuditInfo(query); return RestResult.ok(data); } - @ApiOperation(value = "13.启动除名修复业务", position = 13) + @ApiOperation(value = "16.启动除名修复业务", position = 16) @PostMapping("/repair/startBiz") public RestResult startRepairBiz(@RequestBody AuditInfoVo query, HttpServletRequest request) { return expelledApplyInfoService.startRepairBiz(query, request); } - @ApiOperation(value = "14.获取除名修复业务详情", position = 14) + @ApiOperation(value = "17.获取除名修复业务详情", position = 17) @GetMapping("/repair/getBiz") public RestResult getRepairBiz(String bizId) { return expelledApplyInfoService.getRepairBiz(bizId); } - @ApiOperation(value = "15.除名修复业务审批流程", position = 15) + @ApiOperation(value = "18.除名修复业务审批流程", position = 18) @PostMapping("/repair/nextBiz") public RestResult nextRepairBiz(@RequestBody RemoveApproveInfo removeApproveInfo, HttpServletRequest request) { return expelledApplyInfoService.nextRepairBiz(removeApproveInfo, request); } - @ApiOperation(value = "16.启动除名复议业务", position = 16) + @ApiOperation(value = "19.启动除名复议业务", position = 19) @PostMapping("/review/startBiz") public RestResult startReviewBiz(@RequestBody AuditInfoVo query, HttpServletRequest request) { return expelledApplyInfoService.startReviewBiz(query, request); } - @ApiOperation(value = "17.获取除名复议业务详情", position = 17) + @ApiOperation(value = "20.获取除名复议业务详情", position = 20) @GetMapping("/review/getBiz") public RestResult getReviewBiz(String bizId) { return expelledApplyInfoService.getReviewBiz(bizId); } - @ApiOperation(value = "18.除名复议业务审批流程", position = 18) + @ApiOperation(value = "21.除名复议业务审批流程", position = 21) @PostMapping("/review/nextBiz") public RestResult nextReviewBiz(@RequestBody RemoveApproveInfo removeApproveInfo, HttpServletRequest request) { return expelledApplyInfoService.nextReviewBiz(removeApproveInfo, request); } - @ApiOperation(value = "19.启动除名撤销业务", position = 19) + @ApiOperation(value = "22.启动除名撤销业务", position = 22) @PostMapping("/revoke/startBiz") public RestResult startRevokeBiz(@RequestBody AuditInfoVo query, HttpServletRequest request) { return expelledApplyInfoService.startRevokeBiz(query, request); } - @ApiOperation(value = "20.获取除名撤销业务详情", position = 20) + @ApiOperation(value = "23.获取除名撤销业务详情", position = 23) @GetMapping("/revoke/getBiz") public RestResult getRevokeBiz(String bizId) { return expelledApplyInfoService.getRevokeBiz(bizId); } - @ApiOperation(value = "21.除名撤销业务审批流程", position = 21) + @ApiOperation(value = "24.除名撤销业务审批流程", position = 24) @PostMapping("/revoke/nextBiz") public RestResult nextRevokeBiz(@RequestBody RemoveApproveInfo removeApproveInfo, HttpServletRequest request) { return expelledApplyInfoService.nextRevokeBiz(removeApproveInfo, request); } - @ApiOperation(value = "22.分页查询撤销除名公告管理", position = 22) + @ApiOperation(value = "25.分页查询撤销除名公告管理", position = 25) @PostMapping("/revoke/listAnnouncement") public RestResult> listRevokeAnnouncement(@RequestBody BaseQuery query) { IPage data = expelledApplyInfoService.listRevokeAnnouncement(query); return RestResult.ok(data); } - @ApiOperation(value = "23.下载文书", position = 23) + @ApiOperation(value = "26.下载除名告知书", position = 26) + @GetMapping("/downloadNoticeDoc") + @ResponseBody + public void downloadNoticeDoc(HttpServletResponse response, String noticeNo) { + expelledBizInfoService.downloadNoticeDoc(response, noticeNo); + } + + @ApiOperation(value = "27.下载除名决定书", position = 27) + @GetMapping("/downloadAuditDoc") + @ResponseBody + public void downloadAuditDoc(HttpServletResponse response, String resultId, String noticeNo) { + expelledAuditInfoService.downloadAuditDoc(response, resultId, noticeNo); + } + + @ApiOperation(value = "27.下载文书", position = 27) @GetMapping("/downloadDoc") @ResponseBody public void downloadDoc(HttpServletResponse response, String bizId, String attachType) { - expelledApplyInfoService.downloadDoc(response, bizId, attachType); + expelledApplyInfoService.downloadApproveDoc(response, bizId, attachType); } } diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/entity/EntBaseExpelledInfo.java b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/entity/EntBaseExpelledInfo.java index 1a24ba2..c7c77d6 100644 --- a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/entity/EntBaseExpelledInfo.java +++ b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/entity/EntBaseExpelledInfo.java @@ -63,6 +63,13 @@ public class EntBaseExpelledInfo extends SuperEntity implements Serializable { @TableField(value = "ADDRESS") private String address; + /** + * 拟除名状态:0-拟除名中,1-已除名,2-有效 + */ + @ApiModelProperty(value = "拟除名状态:0-拟除名中,1-已除名,2-有效") + @TableField(value = "STATE") + private String state; + /** * 逻辑删除标识:0-未删除,1-已删除,2-已除名 */ diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/entity/ExpelledApplyInfo.java b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/entity/ExpelledApplyInfo.java index 78a06de..734a5d0 100644 --- a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/entity/ExpelledApplyInfo.java +++ b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/entity/ExpelledApplyInfo.java @@ -182,9 +182,9 @@ public class ExpelledApplyInfo extends SuperEntity implements Serializable { private String remark; /** - * 状态:10-有效,11-修复中,12-复议中,13-撤销中,91-修复完成,92-复议通过被动撤销完成,93-主动撤销完成 + * 状态:10-有效,11-修复中,12-复议中,13-撤销中,61-修复不通过,62-复议不通过,63-撤销不通过,91-修复完成,92-复议通过被动撤销完成,93-主动撤销完成 */ - @ApiModelProperty(value = "状态:10-有效,11-修复中,12-复议中,13-撤销中,91-修复完成,92-复议通过被动撤销完成,93-主动撤销完成") + @ApiModelProperty(value = "状态:10-有效,11-修复中,12-复议中,13-撤销中,61-修复不通过,62-复议不通过,63-撤销不通过,91-修复完成,92-复议通过被动撤销完成,93-主动撤销完成") @TableField(value = "STATE") private String state; } diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/entity/ExpelledAuditInfo.java b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/entity/ExpelledAuditInfo.java index 0095f58..7646a05 100644 --- a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/entity/ExpelledAuditInfo.java +++ b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/entity/ExpelledAuditInfo.java @@ -77,4 +77,18 @@ public class ExpelledAuditInfo extends SuperEntity implements Serializable { @ApiModelProperty(value = "逻辑删除标识:0-未删除,1-已删除") @TableField(value = "IS_DELETE") private String isDelete; + + /** + * 拟除名市场主体提出的陈述、申辩意见 + */ + @ApiModelProperty(value = "拟除名市场主体提出的陈述、申辩意见") + @TableField(exist = false) + private String opinion; + + /** + * 异议/决定意见 + */ + @ApiModelProperty(value = "异议/决定意见") + @TableField(exist = false) + private String auditOpinion; } diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/entity/ExpelledBizInfo.java b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/entity/ExpelledBizInfo.java index c1847cc..23382b5 100644 --- a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/entity/ExpelledBizInfo.java +++ b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/entity/ExpelledBizInfo.java @@ -79,6 +79,20 @@ public class ExpelledBizInfo extends SuperEntity implements Serializable { @TableField(value = "REMOVE_TIME") private LocalDate removeTime; + /** + * 除名机关编码 + */ + @ApiModelProperty(value = "除名机关编码") + @TableField(value = "REMOVE_ORG_NO") + private String removeOrgNo; + + /** + * 除名机关名称 + */ + @ApiModelProperty(value = "除名机关名称") + @TableField(value = "REMOVE_ORG_NAME") + private String removeOrgName; + /** * 逻辑删除标识:0-未删除,1-已删除 */ @@ -92,4 +106,11 @@ public class ExpelledBizInfo extends SuperEntity implements Serializable { @ApiModelProperty(value = "拟除名市场主体ID") @TableField(exist = false) private List expelledIds; + + /** + * 业务名称 + */ + @ApiModelProperty(value = "业务名称") + @TableField(exist = false) + private String busName; } \ No newline at end of file diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/entity/ExpelledEntInfo.java b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/entity/ExpelledEntInfo.java index d5d6d48..6116b63 100644 --- a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/entity/ExpelledEntInfo.java +++ b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/entity/ExpelledEntInfo.java @@ -72,9 +72,9 @@ public class ExpelledEntInfo extends SuperEntity implements Serializable { private LocalDate sendTime; /** - * 当前状态:0-可用,1-已异议,2-已决定 + * 当前状态:0-有效,1-异议中,2-决定中,3-已异议,4-已决定,5-异议不通过,6-决定不通过 */ - @ApiModelProperty(value = "当前状态:0-可用,1-已异议,2-已决定") + @ApiModelProperty(value = "当前状态:0-有效,1-异议中,2-决定中,3-已异议,4-已决定,5-异议不通过,6-决定不通过") @TableField(value = "STATUS") private String status; } diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/mapper/ExpelledAuditInfoMapper.java b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/mapper/ExpelledAuditInfoMapper.java index 35ac0bb..ea02f90 100644 --- a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/mapper/ExpelledAuditInfoMapper.java +++ b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/mapper/ExpelledAuditInfoMapper.java @@ -7,6 +7,8 @@ import com.chinaweal.aiccs.aiccs.expelled.entity.ExpelledAuditInfo; import com.chinaweal.aiccs.aiccs.expelled.vo.AuditInfoVo; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** * @Description: 市场主体拟除名名单决定业务表dao层 * @Author: TiAmo-cc @@ -16,4 +18,6 @@ import org.apache.ibatis.annotations.Param; public interface ExpelledAuditInfoMapper extends BaseMapper { IPage listHavedoAuditInfo(Page page, @Param("map") AuditInfoVo query); + + List listAuditEntBaseInfo(@Param("map") AuditInfoVo query); } diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/mapper/ExpelledBizInfoMapper.java b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/mapper/ExpelledBizInfoMapper.java index c45dc18..8ce25e4 100644 --- a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/mapper/ExpelledBizInfoMapper.java +++ b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/mapper/ExpelledBizInfoMapper.java @@ -7,6 +7,8 @@ import com.chinaweal.aiccs.aiccs.expelled.entity.ExpelledBizInfo; import com.chinaweal.aiccs.aiccs.expelled.vo.BizInfoVo; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** * @Description: 市场主体拟除名名单业务表dao类 * @Author: TiAmo-cc @@ -16,4 +18,6 @@ import org.apache.ibatis.annotations.Param; public interface ExpelledBizInfoMapper extends BaseMapper { IPage listTodoNoticeInfo(Page page, @Param("map") BizInfoVo query); + + List listNoticeEntBaseInfo(@Param("map") BizInfoVo query); } diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/IEntBaseExpelledInfoService.java b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/IEntBaseExpelledInfoService.java index 06c7cca..d930825 100644 --- a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/IEntBaseExpelledInfoService.java +++ b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/IEntBaseExpelledInfoService.java @@ -41,4 +41,9 @@ public interface IEntBaseExpelledInfoService extends IService { /** * 生成审批表 */ - void createDoc(ExpelledApplyInfo applyInfo, TSTaskList tsTaskList); + void createApproveDoc(ExpelledApplyInfo applyInfo, TSTaskList tsTaskList); /** * 下载审批表 */ - void downloadDoc(HttpServletResponse response, String bizId, String attachType); + void downloadApproveDoc(HttpServletResponse response, String bizId, String attachType); } diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/IExpelledAuditInfoService.java b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/IExpelledAuditInfoService.java index 7fdedf0..8062f94 100644 --- a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/IExpelledAuditInfoService.java +++ b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/IExpelledAuditInfoService.java @@ -2,11 +2,19 @@ package com.chinaweal.aiccs.aiccs.expelled.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; +import com.chinaweal.aiccs.aiccs.auditing.entity.TSOpinion; +import com.chinaweal.aiccs.aiccs.business.entity.TSTaskList; import com.chinaweal.aiccs.aiccs.expelled.entity.ExpelledAuditInfo; +import com.chinaweal.aiccs.aiccs.expelled.entity.ExpelledEntInfo; +import com.chinaweal.aiccs.aiccs.expelled.entity.ExpelledResultInfo; import com.chinaweal.aiccs.aiccs.expelled.vo.AuditInfoVo; +import com.chinaweal.aiccs.aiccs.expelled.vo.RemoveApproveInfo; +import com.chinaweal.aicorg.model.AICUser; import com.chinaweal.youfool.framework.springboot.base.query.BaseQuery; +import com.chinaweal.youfool.framework.springboot.rest.RestResult; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; /** * @Description: 市场主体拟除名名单决定业务表接口类 @@ -22,14 +30,38 @@ public interface IExpelledAuditInfoService extends IService { IPage listHavedoAuditInfo(BaseQuery query); /** - * 保存市场主体拟除名名单异议业务信息 + * 启动除名异议业务 */ - void saveObjection(AuditInfoVo query); + RestResult startObjectionBiz(AuditInfoVo query, HttpServletRequest request); /** - * 保存市场主体拟除名名单决定业务信息 + * 查询除名异议业务 */ - void saveAudit(AuditInfoVo query, HttpServletRequest request); + RestResult getObjectionBiz(String bizId); + + /** + * 除名异议业务审批流程 + */ + RestResult nextObjectionBiz(RemoveApproveInfo removeApproveInfo, HttpServletRequest request); + + /** + * 启动除名决定业务 + */ + RestResult startAuditBiz(AuditInfoVo query, HttpServletRequest request); + + /** + * 查询除名决定业务 + */ + RestResult getAuditBiz(String bizId); + + /** + * 除名决定业务审批流程 + */ + RestResult nextAuditBiz(RemoveApproveInfo removeApproveInfo, HttpServletRequest request); + + TSTaskList startBizAccept(AICUser user, TSTaskList tsTaskList, ExpelledAuditInfo auditInfo); + + TSTaskList saveAuditProcess(AICUser user, TSTaskList tsTaskList, ExpelledAuditInfo auditInfo, TSOpinion opinion, String nextNodeId, String[] nextPerformerIds, String[] nextPerformerNames); /** * 根据业务号查询市场主体拟除名名单异议/决定业务信息 @@ -40,4 +72,19 @@ public interface IExpelledAuditInfoService extends IService { * 生成业务号 */ String generateAuditNo(); + + /** + * 生成审批表 + */ + void createApproveDoc(ExpelledAuditInfo auditInfo, TSTaskList tsTaskList); + + /** + * 生成除名决定书 + */ + void createAuditDoc(ExpelledResultInfo resultInfo, ExpelledEntInfo entInfo); + + /** + * 下载除名决定书 + */ + void downloadAuditDoc(HttpServletResponse response, String resultId, String noticeNo); } diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/IExpelledBizInfoService.java b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/IExpelledBizInfoService.java index 5f18750..2a92fd7 100644 --- a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/IExpelledBizInfoService.java +++ b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/IExpelledBizInfoService.java @@ -2,9 +2,18 @@ package com.chinaweal.aiccs.aiccs.expelled.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; +import com.chinaweal.aiccs.aiccs.auditing.entity.TSOpinion; +import com.chinaweal.aiccs.aiccs.business.entity.TSTaskList; import com.chinaweal.aiccs.aiccs.expelled.entity.ExpelledBizInfo; +import com.chinaweal.aiccs.aiccs.expelled.entity.ExpelledEntInfo; import com.chinaweal.aiccs.aiccs.expelled.vo.BizInfoVo; +import com.chinaweal.aiccs.aiccs.expelled.vo.RemoveApproveInfo; +import com.chinaweal.aicorg.model.AICUser; import com.chinaweal.youfool.framework.springboot.base.query.BaseQuery; +import com.chinaweal.youfool.framework.springboot.rest.RestResult; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; /** * @Description: 市场主体拟除名名单业务表接口类 @@ -15,19 +24,23 @@ import com.chinaweal.youfool.framework.springboot.base.query.BaseQuery; public interface IExpelledBizInfoService extends IService { /** - * 分页查询市场主体拟除名告知业务信息 + * 启动除名告知业务 */ - IPage listExpelledNoticeInfo(BaseQuery query); + RestResult startNoticeBiz(ExpelledBizInfo query, HttpServletRequest request); /** - * 保存更新市场主体拟除名告知业务信息 + * 查询除名告知业务 */ - void saveExpelledNoticeInfo(ExpelledBizInfo query); + RestResult getNoticeBiz(String bizId); /** - * 分页查询可引用的市场主体拟除名告知业务信息 + * 除名告知业务审批流程 */ - IPage listTodoNoticeInfo(BaseQuery query); + RestResult nextNoticeBiz(RemoveApproveInfo removeApproveInfo, HttpServletRequest request); + + TSTaskList startNoticeBizAccept(AICUser user, TSTaskList tsTaskList, ExpelledBizInfo noticeInfo); + + TSTaskList saveNoticeAuditProcess(AICUser user, TSTaskList tsTaskList, ExpelledBizInfo noticeInfo, TSOpinion opinion, String nextNodeId, String[] nextPerformerIds, String[] nextPerformerNames); /** * 根据业务号查询市场主体拟除名名单业务信息 @@ -38,4 +51,24 @@ public interface IExpelledBizInfoService extends IService { * 生成业务号 */ String generateBizNo(); + + /** + * 分页查询可引用的市场主体拟除名告知业务信息 + */ + IPage listTodoNoticeInfo(BaseQuery query); + + /** + * 生成审批表 + */ + void createApproveDoc(ExpelledBizInfo noticeInfo, TSTaskList tsTaskList); + + /** + * 生成除名告知书 + */ + void createNoticeDoc(ExpelledEntInfo entInfo); + + /** + * 下载除名告知书 + */ + void downloadNoticeDoc(HttpServletResponse response, String noticeNo); } diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/IExpelledEntInfoService.java b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/IExpelledEntInfoService.java index edd1a6f..e4eff1a 100644 --- a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/IExpelledEntInfoService.java +++ b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/IExpelledEntInfoService.java @@ -3,6 +3,8 @@ package com.chinaweal.aiccs.aiccs.expelled.service; import com.baomidou.mybatisplus.extension.service.IService; import com.chinaweal.aiccs.aiccs.expelled.entity.ExpelledEntInfo; +import java.util.List; + /** * @Description: 市场主体拟除名名单企业信息表接口类 * @Author: TiAmo-cc @@ -30,4 +32,9 @@ public interface IExpelledEntInfoService extends IService { * 生成告知书编号 */ String generateNoticeNo(); + + /** + * 查询告知业务的拟除名企业信息 + */ + List searchEntInfoByBizId(String bizId); } diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/IExpelledResultInfoService.java b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/IExpelledResultInfoService.java index ef7f0e6..7737757 100644 --- a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/IExpelledResultInfoService.java +++ b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/IExpelledResultInfoService.java @@ -3,6 +3,8 @@ package com.chinaweal.aiccs.aiccs.expelled.service; import com.baomidou.mybatisplus.extension.service.IService; import com.chinaweal.aiccs.aiccs.expelled.entity.ExpelledResultInfo; +import java.util.List; + /** * @Description: 市场主体拟除名名单结果表接口类 * @Author: TiAmo-cc @@ -20,4 +22,9 @@ public interface IExpelledResultInfoService extends IService * 查询市场主体拟除名名单结果信息 */ ExpelledResultInfo getExpelledResultInfo(String auditId, String entId); + + /** + * 查询异议/决定业务的拟除名企业结果信息 + */ + List searchResultInfoByAudit(String auditId); } diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/impl/EntBaseExpelledInfoServiceImpl.java b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/impl/EntBaseExpelledInfoServiceImpl.java index 0d388d7..280e7a4 100644 --- a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/impl/EntBaseExpelledInfoServiceImpl.java +++ b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/impl/EntBaseExpelledInfoServiceImpl.java @@ -6,8 +6,12 @@ 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.chinaweal.aiccs.aiccs.expelled.entity.EntBaseExpelledInfo; +import com.chinaweal.aiccs.aiccs.expelled.entity.ExpelledEntInfo; +import com.chinaweal.aiccs.aiccs.expelled.entity.ExpelledResultInfo; import com.chinaweal.aiccs.aiccs.expelled.mapper.EntBaseExpelledInfoMapper; import com.chinaweal.aiccs.aiccs.expelled.service.IEntBaseExpelledInfoService; +import com.chinaweal.aiccs.aiccs.expelled.service.IExpelledEntInfoService; +import com.chinaweal.aiccs.aiccs.expelled.service.IExpelledResultInfoService; import com.chinaweal.aiccs.aiccs.expelled.vo.EntBaseExpelledInfoExcelVo; import com.chinaweal.aiccs.aiccs.punishment.util.ExcelIePortUtils; import com.chinaweal.aiccs.aiccs.punishment.util.ExcelListener; @@ -21,6 +25,7 @@ import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.nio.charset.StandardCharsets; @@ -41,6 +46,11 @@ public class EntBaseExpelledInfoServiceImpl extends ServiceImpl listEntBaseExpelledInfo(BaseQuery query) { EntBaseExpelledInfo entity = query.getEntity(EntBaseExpelledInfo.class); @@ -48,6 +58,7 @@ public class EntBaseExpelledInfoServiceImpl extends ServiceImpl wrapper = Wrappers.lambdaQuery() .like(StringUtils.isNotBlank(entity.getSearchEntName()), EntBaseExpelledInfo::getEntName, entity.getSearchEntName()) .eq(StringUtils.isNotBlank(entity.getSearchUscc()), EntBaseExpelledInfo::getUscc, entity.getSearchUscc()) + .eq(EntBaseExpelledInfo::getState, "2") .eq(EntBaseExpelledInfo::getIsDelete, "0"); return page(page, wrapper); } @@ -58,6 +69,7 @@ public class EntBaseExpelledInfoServiceImpl extends ServiceImpl startRepairBiz(AuditInfoVo query, HttpServletRequest request) { @@ -666,9 +669,10 @@ public class ExpelledApplyInfoServiceImpl extends ServiceImpl map = new HashMap<>(); map.put("orgName", applyInfo.getRemoveOrgName()); map.put("entName", applyInfo.getEntName()); @@ -748,38 +764,45 @@ public class ExpelledApplyInfoServiceImpl extends ServiceImpl listHavedoAuditInfo(BaseQuery query) { @@ -51,76 +84,444 @@ public class ExpelledAuditInfoServiceImpl extends ServiceImpl startObjectionBiz(AuditInfoVo query, HttpServletRequest request) { AICUser user = BaseController.getLoginUser(request); if (user == null) { throw new BusinessException("登录超时,请重新登录"); } - ExpelledAuditInfo objectionInfo = getById(query.getAuditId()); - if (objectionInfo == null) { - objectionInfo = new ExpelledAuditInfo(); - objectionInfo.setId(UUID.randomUUID().toString()); - objectionInfo.setBizType("2"); // 决定管理 - objectionInfo.setAuditNo(generateAuditNo()); - objectionInfo.setRemoveDate(LocalDate.now()); - objectionInfo.setRemoveOrgNo(user.getRegionID()); - objectionInfo.setRemoveOrgName(user.getOrgName()); - objectionInfo.setIsDelete("0"); + if (CollectionUtils.isEmpty(query.getBizInfos())) { + return RestResult.error(ResultCode.PARAM_IS_BLANK, "请至少勾选一个拟除名市场主体"); } - saveOrUpdate(objectionInfo); + Map resultMap = new HashMap<>(); + String bizId = UUID.randomUUID().toString(); + // 添加待办启动流程 + TSTaskList tsTaskList = new TSTaskList(); + tsTaskList.setBizseqid(bizId); + tsTaskList.setBustype(BaseDataConstant.BUSINESS_TYPE_REMOVE_OBJECTION); // 除名异议 + tsTaskList.setBusname(query.getBusName()); + // 保存除名异议数据 + ExpelledAuditInfo objectionInfo = new ExpelledAuditInfo(); + objectionInfo.setId(bizId); + objectionInfo.setBizType("1"); + objectionInfo.setAuditNo(generateAuditNo()); // 初始化市场主体除名异议信息 for (BizInfoVo bizInfo : query.getBizInfos()) { ExpelledResultInfo resultInfo = new ExpelledResultInfo(); resultInfo.setAuditId(objectionInfo.getId()); resultInfo.setEntId(bizInfo.getEntId()); - resultInfo.setIsRemove("1"); - resultInfo.setState("10"); - resultInfo.setAuditOpinion(query.getAuditOpinion()); expelledResultInfoService.saveExpelledResultInfo(resultInfo); - // 同步更新除名告知业务申请中的市场主体企业信息的已决定状态 + // 同步更新除名告知业务申请中的市场主体企业信息的异议中状态 ExpelledEntInfo entInfo = expelledEntInfoService.getById(bizInfo.getEntId()); if (entInfo == null) { continue; } - entInfo.setStatus("2"); // 已决定 + entInfo.setStatus("1"); // 异议中 expelledEntInfoService.saveOrUpdate(entInfo); - // 同步更新市场主体拟除名名单库中的市场主体除名状态 - EntBaseExpelledInfo expelledInfo = entBaseExpelledInfoService.getById(entInfo.getExpelledId()); - if (expelledInfo == null) { + } + // 保存业务待办信息 + tsTaskList = startBizAccept(user, tsTaskList, objectionInfo); + List nextSequenceFlows = workFlowService.findNextSequenceFlowList(tsTaskList.getWorkflowid()); + TSTwfProcessNode currentNode = workFlowService.findCurrentNode(tsTaskList.getWorkflowid()); + String opinionType = BaseDataConstant.getOpinionTypeByWorkFlowNode(currentNode.getCurrentnode()); + if (opinionType == null) { + opinionType = "1"; + } + resultMap.put("objectionInfo", objectionInfo); + resultMap.put("taskId", tsTaskList.getTasklistid()); + resultMap.put("bizId", bizId); + resultMap.put("nextSequenceFlows", nextSequenceFlows); + resultMap.put("currentNode", currentNode.getCurrentnode()); + resultMap.put("currentNodeName", WorkFlowUtil.getNodeName(currentNode.getCurrentnode())); + resultMap.put("currentLinkTypeID", opinionType); + return RestResult.ok(resultMap); + } + + @Override + public RestResult getObjectionBiz(String bizId) { + Map resultMap = new HashMap<>(); + // 除名异议业务表 + ExpelledAuditInfo objectionInfo = getById(bizId); + if (objectionInfo == null) { + throw new BusinessException("除名异议业务信息不存在,请联系管理员"); + } + List resultInfos = expelledResultInfoService.searchResultInfoByAudit(bizId); + if (CollectionUtils.isNotEmpty(resultInfos)) { + objectionInfo.setOpinion(resultInfos.get(0).getOpinion()); + objectionInfo.setAuditOpinion(resultInfos.get(0).getAuditOpinion()); + } + resultMap.put("objectionInfo", objectionInfo); + // 拟除名异议企业信息 + AuditInfoVo query = new AuditInfoVo(); + query.setAuditId(bizId); + query.setBizType("1"); + List entInfos = baseMapper.listAuditEntBaseInfo(query); + resultMap.put("entInfos", entInfos); + // 除名业务待办 + TSTaskList tsTaskList = tsTaskListService.searchTaskListByBizId(bizId); + if (tsTaskList == null) { + throw new BusinessException("除名异议业务待办信息不存在,请联系管理员"); + } + resultMap.put("tsTaskList", new TSTaskList().setTasklistid(tsTaskList.getTasklistid()).setWorkflowid(tsTaskList.getWorkflowid())); + // 获取历史审批意见 + LambdaQueryWrapper opinionWrapper = new LambdaQueryWrapper<>(); + opinionWrapper.eq(TSOpinion::getBizseq, bizId) + .ne(TSOpinion::getOpiniontype, "55") + .orderByAsc(TSOpinion::getHandledate); + List tsOpinions = opinionService.list(opinionWrapper); + resultMap.put("historyOpinions", tsOpinions); + return RestResult.ok(resultMap); + } + + @Override + public RestResult nextObjectionBiz(RemoveApproveInfo removeApproveInfo, HttpServletRequest request) { + AICUser user = BaseController.getLoginUser(request); + if (user == null) { + throw new BusinessException("登录超时,请重新登录"); + } + String bizId = removeApproveInfo.getBizId(); + String taskId = removeApproveInfo.getTaskId(); + String nextNodeId = removeApproveInfo.getNextNodeId(); + String nextPerformerIds = removeApproveInfo.getNextPerformerIds(); + String nextPerformerNames = removeApproveInfo.getNextPerformerNames(); + ExpelledAuditInfo objectionInfoQuery = removeApproveInfo.getObjectionInfo(); + if (StringUtils.isBlank(bizId)) { + throw new BusinessException("bizId参数缺失"); + } + if (StringUtils.isBlank(taskId)) { + throw new BusinessException("taskId参数缺失"); + } + if (StringUtils.isBlank(nextNodeId)) { + throw new BusinessException("nextNodeId参数缺失"); + } + if (objectionInfoQuery == null) { + throw new BusinessException("objectionInfoQuery参数缺失"); + } + Map resultMap = new HashMap<>(); + ExpelledAuditInfo objectionInfo = getById(bizId); + if (objectionInfo == null) { + throw new BusinessException("除名异议业务信息不存在,请联系管理员"); + } + // 更新除名异议业务表 + if (objectionInfoQuery != null && StringUtils.isNotBlank(objectionInfoQuery.getId())) { + TSTaskList tsTaskList = tsTaskListService.selectByTasklistID(taskId); + TSTwfProcessNode processNode = workFlowService.findCurrentNode(tsTaskList.getWorkflowid()); + + // 下一步为审核 + if (StringUtils.equals(FlowUtil.EXPTLISTWORKFLOW_HANDLEEXPTLIST, nextNodeId)) { + if (StringUtils.equals(FlowUtil.EXPTLISTWORKFLOW_EXPTLISTENTER, processNode.getCurrentnode())) { + BeanUtil.copyBean(objectionInfoQuery, objectionInfo); + } + } + + if (StringUtils.isBlank(nextPerformerIds)) { + processNode = workFlowService.findCurrentNode(tsTaskList.getWorkflowid()); + int order = WorkFlowUtil.checkNextOrder(processNode.getCurrentnode(), nextNodeId); + // 通过order判断为回退还是前进 >0 前进 + if (order > 0) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(TSOpinion::getWorkflowid, tsTaskList.getWorkflowid()) + .eq(TSOpinion::getOpiniontype, "0") // 经办为0 + .orderByDesc(TSOpinion::getLauptime); + List list = opinionService.list(wrapper); + if (org.apache.commons.collections.CollectionUtils.isEmpty(list)) { + return RestResult.error(ResultCode.DATA_NONE, "除名异议审批意见不存在,请联系管理员"); + } + nextPerformerIds = list.get(0).getHandlerid(); + nextPerformerNames = list.get(0).getHandler(); + } + // 回退时获取经办人 + if (order < 0) { + // 获取经办人 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(TSOpinion::getWorkflowid, tsTaskList.getWorkflowid()) + .eq(TSOpinion::getOpiniontype, '0') + .orderByDesc(TSOpinion::getLauptime); + List list = opinionService.list(wrapper); + if (org.apache.commons.collections.CollectionUtils.isEmpty(list)) { + return RestResult.error(ResultCode.DATA_NONE, "除名异议审批意见不存在,请联系管理员"); + } + nextPerformerIds = list.get(0).getHandlerid(); + nextPerformerNames = list.get(0).getHandler(); + } + } + + // 发送 + String[] ids = StringUtils.split(nextPerformerIds, Constant.COMMA); + String[] names = StringUtils.split(nextPerformerNames, Constant.COMMA); + try { + tsTaskList = saveAuditProcess(user, tsTaskList, objectionInfo, removeApproveInfo.getOpinionQuery(), nextNodeId, ids, names); + if (ids.length == 1 && StringUtils.equals(user.getPrimaryKey(), ids[0])) { + resultMap.put("bizId", bizId); + resultMap.put("taskId", taskId); + resultMap.put("nextNodeId", nextNodeId); + resultMap.put("workFlowId", tsTaskList.getWorkflowid()); + } + } catch (Exception e) { + log.error("除名异议业务审批出错:", e); + throw new BusinessException("除名异议业务审批出错"); + } + } + return RestResult.ok(resultMap); + } + + @Override + public RestResult startAuditBiz(AuditInfoVo query, HttpServletRequest request) { + AICUser user = BaseController.getLoginUser(request); + if (user == null) { + throw new BusinessException("登录超时,请重新登录"); + } + if (CollectionUtils.isEmpty(query.getBizInfos())) { + return RestResult.error(ResultCode.PARAM_IS_BLANK, "请至少勾选一个拟除名市场主体"); + } + Map resultMap = new HashMap<>(); + String bizId = UUID.randomUUID().toString(); + // 添加待办启动流程 + TSTaskList tsTaskList = new TSTaskList(); + tsTaskList.setBizseqid(bizId); + tsTaskList.setBustype(BaseDataConstant.BUSINESS_TYPE_REMOVE_AUDIT); // 除名决定 + tsTaskList.setBusname(query.getBusName()); + // 保存除名决定数据 + ExpelledAuditInfo auditInfo = new ExpelledAuditInfo(); + auditInfo.setId(bizId); + auditInfo.setBizType("2"); + auditInfo.setAuditNo(generateAuditNo()); + // 初始化市场主体除名决定信息 + for (BizInfoVo bizInfo : query.getBizInfos()) { + ExpelledResultInfo resultInfo = new ExpelledResultInfo(); + resultInfo.setAuditId(auditInfo.getId()); + resultInfo.setEntId(bizInfo.getEntId()); + expelledResultInfoService.saveExpelledResultInfo(resultInfo); + // 同步更新除名告知业务申请中的市场主体企业信息的决定中状态 + ExpelledEntInfo entInfo = expelledEntInfoService.getById(bizInfo.getEntId()); + if (entInfo == null) { continue; } - expelledInfo.setIsDelete("2"); // 已除名 - entBaseExpelledInfoService.saveOrUpdate(expelledInfo); + entInfo.setStatus("2"); // 决定中 + expelledEntInfoService.saveOrUpdate(entInfo); } + // 保存业务待办信息 + tsTaskList = startBizAccept(user, tsTaskList, auditInfo); + List nextSequenceFlows = workFlowService.findNextSequenceFlowList(tsTaskList.getWorkflowid()); + TSTwfProcessNode currentNode = workFlowService.findCurrentNode(tsTaskList.getWorkflowid()); + String opinionType = BaseDataConstant.getOpinionTypeByWorkFlowNode(currentNode.getCurrentnode()); + if (opinionType == null) { + opinionType = "1"; + } + resultMap.put("auditInfo", auditInfo); + resultMap.put("taskId", tsTaskList.getTasklistid()); + resultMap.put("bizId", bizId); + resultMap.put("nextSequenceFlows", nextSequenceFlows); + resultMap.put("currentNode", currentNode.getCurrentnode()); + resultMap.put("currentNodeName", WorkFlowUtil.getNodeName(currentNode.getCurrentnode())); + resultMap.put("currentLinkTypeID", opinionType); + return RestResult.ok(resultMap); + } + + @Override + public RestResult getAuditBiz(String bizId) { + Map resultMap = new HashMap<>(); + // 除名决定业务表 + ExpelledAuditInfo auditInfo = getById(bizId); + if (auditInfo == null) { + throw new BusinessException("除名决定业务信息不存在,请联系管理员"); + } + List resultInfos = expelledResultInfoService.searchResultInfoByAudit(bizId); + if (CollectionUtils.isNotEmpty(resultInfos)) { + auditInfo.setAuditOpinion(resultInfos.get(0).getAuditOpinion()); + } + resultMap.put("auditInfo", auditInfo); + // 拟除名决定企业信息 + AuditInfoVo query = new AuditInfoVo(); + query.setAuditId(bizId); + query.setBizType("2"); + List entInfos = baseMapper.listAuditEntBaseInfo(query); + resultMap.put("entInfos", entInfos); + // 除名业务待办 + TSTaskList tsTaskList = tsTaskListService.searchTaskListByBizId(bizId); + if (tsTaskList == null) { + throw new BusinessException("除名决定业务待办信息不存在,请联系管理员"); + } + resultMap.put("tsTaskList", new TSTaskList().setTasklistid(tsTaskList.getTasklistid()).setWorkflowid(tsTaskList.getWorkflowid())); + // 获取历史审批意见 + LambdaQueryWrapper opinionWrapper = new LambdaQueryWrapper<>(); + opinionWrapper.eq(TSOpinion::getBizseq, bizId) + .ne(TSOpinion::getOpiniontype, "55") + .orderByAsc(TSOpinion::getHandledate); + List tsOpinions = opinionService.list(opinionWrapper); + resultMap.put("historyOpinions", tsOpinions); + return RestResult.ok(resultMap); + } + + @Override + public RestResult nextAuditBiz(RemoveApproveInfo removeApproveInfo, HttpServletRequest request) { + AICUser user = BaseController.getLoginUser(request); + if (user == null) { + throw new BusinessException("登录超时,请重新登录"); + } + String bizId = removeApproveInfo.getBizId(); + String taskId = removeApproveInfo.getTaskId(); + String nextNodeId = removeApproveInfo.getNextNodeId(); + String nextPerformerIds = removeApproveInfo.getNextPerformerIds(); + String nextPerformerNames = removeApproveInfo.getNextPerformerNames(); + ExpelledAuditInfo auditInfoQuery = removeApproveInfo.getAuditInfo(); + if (StringUtils.isBlank(bizId)) { + throw new BusinessException("bizId参数缺失"); + } + if (StringUtils.isBlank(taskId)) { + throw new BusinessException("taskId参数缺失"); + } + if (StringUtils.isBlank(nextNodeId)) { + throw new BusinessException("nextNodeId参数缺失"); + } + if (auditInfoQuery == null) { + throw new BusinessException("auditInfoQuery参数缺失"); + } + Map resultMap = new HashMap<>(); + ExpelledAuditInfo auditInfo = getById(bizId); + if (auditInfo == null) { + throw new BusinessException("除名决定业务信息不存在,请联系管理员"); + } + // 更新除名决定业务表 + if (auditInfoQuery != null && StringUtils.isNotBlank(auditInfoQuery.getId())) { + TSTaskList tsTaskList = tsTaskListService.selectByTasklistID(taskId); + TSTwfProcessNode processNode = workFlowService.findCurrentNode(tsTaskList.getWorkflowid()); + + // 下一步为审核 + if (StringUtils.equals(FlowUtil.EXPTLISTWORKFLOW_HANDLEEXPTLIST, nextNodeId)) { + if (StringUtils.equals(FlowUtil.EXPTLISTWORKFLOW_EXPTLISTENTER, processNode.getCurrentnode())) { + BeanUtil.copyBean(auditInfoQuery, auditInfo); + } + } + + if (StringUtils.isBlank(nextPerformerIds)) { + processNode = workFlowService.findCurrentNode(tsTaskList.getWorkflowid()); + int order = WorkFlowUtil.checkNextOrder(processNode.getCurrentnode(), nextNodeId); + // 通过order判断为回退还是前进 >0 前进 + if (order > 0) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(TSOpinion::getWorkflowid, tsTaskList.getWorkflowid()) + .eq(TSOpinion::getOpiniontype, "0") // 经办为0 + .orderByDesc(TSOpinion::getLauptime); + List list = opinionService.list(wrapper); + if (org.apache.commons.collections.CollectionUtils.isEmpty(list)) { + return RestResult.error(ResultCode.DATA_NONE, "除名决定审批意见不存在,请联系管理员"); + } + nextPerformerIds = list.get(0).getHandlerid(); + nextPerformerNames = list.get(0).getHandler(); + } + // 回退时获取经办人 + if (order < 0) { + // 获取经办人 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(TSOpinion::getWorkflowid, tsTaskList.getWorkflowid()) + .eq(TSOpinion::getOpiniontype, '0') + .orderByDesc(TSOpinion::getLauptime); + List list = opinionService.list(wrapper); + if (org.apache.commons.collections.CollectionUtils.isEmpty(list)) { + return RestResult.error(ResultCode.DATA_NONE, "除名决定审批意见不存在,请联系管理员"); + } + nextPerformerIds = list.get(0).getHandlerid(); + nextPerformerNames = list.get(0).getHandler(); + } + } + + // 发送 + String[] ids = StringUtils.split(nextPerformerIds, Constant.COMMA); + String[] names = StringUtils.split(nextPerformerNames, Constant.COMMA); + try { + tsTaskList = saveAuditProcess(user, tsTaskList, auditInfo, removeApproveInfo.getOpinionQuery(), nextNodeId, ids, names); + if (ids.length == 1 && StringUtils.equals(user.getPrimaryKey(), ids[0])) { + resultMap.put("bizId", bizId); + resultMap.put("taskId", taskId); + resultMap.put("nextNodeId", nextNodeId); + resultMap.put("workFlowId", tsTaskList.getWorkflowid()); + } + } catch (Exception e) { + log.error("除名决定业务审批出错:", e); + throw new BusinessException("除名决定业务审批出错"); + } + } + return RestResult.ok(resultMap); + } + + @Override + public TSTaskList startBizAccept(AICUser user, TSTaskList tsTaskList, ExpelledAuditInfo auditInfo) { + if (StringUtils.isBlank(tsTaskList.getTasklistid())) { + auditInfo.setIsDelete("0"); + saveOrUpdate(auditInfo); + String definedname = FlowUtil.EXPTLISTWORKFLOW; // 除名异议/决定,这类参考使用企业经营异常名录流程模板,应该是可以的吧 + // 新待办 + tsTaskList = HandleWorkFlowUtil.createTaskList(tsTaskList, user); + // 开始工作流 + tsTaskListService.startWorkFlow(tsTaskList, user, definedname); + } + return tsTaskList; + } + + @Override + public TSTaskList saveAuditProcess(AICUser user, TSTaskList tsTaskList, ExpelledAuditInfo auditInfo, TSOpinion opinion, String nextNodeId, String[] nextPerformerIds, String[] nextPerformerNames) { + try { + if (StringUtils.isNotBlank(tsTaskList.getAcceptgroupid())) { + workFlowService.claimGroup(tsTaskList.getWorkflowid(), user.getPrimaryKey()); + } + tsTaskListService.updateWorkFlow(user, opinion, tsTaskList, nextNodeId, nextPerformerIds, nextPerformerNames); + auditInfo.setRemoveDate(LocalDate.now()); + auditInfo.setRemoveOrgNo(user.getRegionID()); + auditInfo.setRemoveOrgName(user.getOrgName()); + saveOrUpdate(auditInfo); + List resultInfos = expelledResultInfoService.searchResultInfoByAudit(auditInfo.getId()); + if (!CollectionUtils.isEmpty(resultInfos)) { + for (ExpelledResultInfo resultInfo : resultInfos) { + resultInfo.setOpinion(auditInfo.getOpinion()); + resultInfo.setAuditOpinion(auditInfo.getAuditOpinion()); + // 同步更新拟除名名单企业信息表状态 + ExpelledEntInfo entInfo = expelledEntInfoService.getById(resultInfo.getEntId()); + if (entInfo == null) { + continue; + } + // 同步更新拟除名名单库状态 + EntBaseExpelledInfo expelledInfo = entBaseExpelledInfoService.getById(entInfo.getExpelledId()); + if (expelledInfo == null) { + continue; + } + if (FlowUtil.EXPTLISTWORKFLOW_ENDEXPTLIST.equals(nextNodeId)) { // 完结时 + resultInfo.setState("10"); + if (StringUtils.equals(BaseDataConstant.BUSINESS_TYPE_REMOVE_OBJECTION, tsTaskList.getBustype())) { + resultInfo.setIsObjection("1"); // 有异议 + entInfo.setStatus("3"); // 已异议 + expelledInfo.setState("2"); // 有效 + } else if (StringUtils.equals(BaseDataConstant.BUSINESS_TYPE_REMOVE_AUDIT, tsTaskList.getBustype())) { + resultInfo.setIsRemove("1"); // 同意除名 + entInfo.setStatus("4"); // 已决定 + expelledInfo.setState("1"); // 已除名 + } + } + if (FlowUtil.EXPTLISTWORKFLOW_OVEREXPTLIST.equals(nextNodeId) || FlowUtil.EXPTLISTWORKFLOW_OVERFINISH.equals(nextNodeId)) { + if (StringUtils.equals(BaseDataConstant.BUSINESS_TYPE_REMOVE_OBJECTION, tsTaskList.getBustype())) { + resultInfo.setIsObjection("0"); // 无异议 + resultInfo.setState("-1"); // 除名异议不通过 + entInfo.setStatus("5"); // 异议不通过 + } else if (StringUtils.equals(BaseDataConstant.BUSINESS_TYPE_REMOVE_AUDIT, tsTaskList.getBustype())) { + resultInfo.setIsRemove("0"); // 不同意除名 + resultInfo.setState("-2"); // 除名决定不通过 + entInfo.setStatus("6"); // 决定不通过 + } + expelledInfo.setState("2"); // 有效 + } + expelledEntInfoService.saveOrUpdate(entInfo); + entBaseExpelledInfoService.saveOrUpdate(expelledInfo); + expelledResultInfoService.saveOrUpdate(resultInfo); + } + } + // 生成文书 + if (StringUtils.equals(BaseDataConstant.BUSINESS_TYPE_REMOVE_AUDIT, tsTaskList.getBustype())) { + createApproveDoc(auditInfo, tsTaskList); + } + } catch (Exception e) { + log.error("除名申请(异议、决定)流程审核出错", e); + throw new BusinessException("除名申请(异议、决定)流程审核出错"); + } + return tsTaskList; } @Override @@ -137,4 +538,188 @@ public class ExpelledAuditInfoServiceImpl extends ServiceImpl map = new HashMap<>(); + map.put("orgName", auditInfo.getRemoveOrgName()); + // 拟除名企业信息 + AuditInfoVo query = new AuditInfoVo(); + query.setAuditId(auditInfo.getId()); + query.setBizType("2"); + List entInfos = baseMapper.listAuditEntBaseInfo(query); + String entNames = ""; + String auditOpinion = ""; + if (!CollectionUtils.isEmpty(entInfos)) { + auditOpinion = entInfos.get(0).getAuditOpinion(); + for (int i = 0; i < entInfos.size(); i++) { + if (i >= 3) { + continue; + } + entNames += entInfos.get(i).getEntName() + '、'; + } + entNames = entNames.substring(0, entNames.length() - 1) + "等" + entInfos.size() + "户企业/个体户"; + } + map.put("entNames", entNames); + map.put("auditOpinion", auditOpinion); + // 获取历史审批意见 + LambdaQueryWrapper opinionWrapper = new LambdaQueryWrapper<>(); + opinionWrapper.eq(TSOpinion::getBizseq, auditInfo.getId()) + .in(TSOpinion::getOpiniontype,"0", "1", "2") + .orderByAsc(TSOpinion::getHandledate); + List tsOpinions = opinionService.list(opinionWrapper); + for (TSOpinion item : tsOpinions) { + int index = Integer.parseInt(item.getOpiniontype()) + 1; + map.put("opinion" + index, item.getOpinioncontent()); + map.put("handler" + index, item.getHandler()); + map.put("year" + index, item.getHandledate().getYear()); + map.put("month" + index, item.getHandledate().getMonthValue()); + map.put("day" + index, item.getHandledate().getDayOfMonth()); + } + try { + // 文书模板路径 + String wordTemplatePath = "static" + File.separator + "template" + File.separator + "expelled" + File.separator + "auditDoc.docx"; + String resource = this.getClass().getClassLoader().getResource(wordTemplatePath).getPath(); + // URL解码 + resource = URLDecoder.decode(resource, "UTF-8"); + String realPath = CommonConfig.getUploadPath(); // 存储路径 + String docName = UUID.randomUUID().toString(); // 文件名 + TSAttachment tsAttachment = attachmentService.getByBizseqAndType(auditInfo.getId(), "1"); + if (tsAttachment == null) { + tsAttachment = new TSAttachment(); + tsAttachment.setAttachmentid(UUID.randomUUID().toString()); + tsAttachment.setUploaddate(LocalDate.now()); + } else { + realPath = CommonConfig.getUploadPathByDate(tsAttachment.getUploaddate()); + docName = tsAttachment.getFilename().substring(0, tsAttachment.getFilename().lastIndexOf(".")); + } + realPath += File.separator + auditInfo.getId(); + File dir = new File(realPath); + if (!dir.exists()) { + dir.mkdirs(); + } + // 生成 + XWPFTemplate.compile(resource).render(map).writeToFile(realPath + File.separator + docName + ".docx"); + // 保存记录 + String ext = ".docx"; + String fileName = docName + ext; + String tempPath = auditInfo.getId() + File.separator + fileName; + tsAttachment.setCreatetype("1"); // 文件为系统生成 + tsAttachment.setBizseq(auditInfo.getId()); + tsAttachment.setFileext(ext); + tsAttachment.setFilename(fileName); + tsAttachment.setTemppath(tempPath); + tsAttachment.setAttachtype("1"); // 审批表 + attachmentService.saveOrUpdate(tsAttachment); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void createAuditDoc(ExpelledResultInfo resultInfo, ExpelledEntInfo entInfo) { + Map map = new HashMap<>(); + ExpelledAuditInfo auditInfo = getById(resultInfo.getAuditId()); + if (auditInfo == null) { + throw new BusinessException("除名决定业务信息不存在,请联系管理员"); + } + map.put("orgName", auditInfo.getRemoveOrgName()); + map.put("noticeNo", entInfo.getNoticeNo()); + EntBaseExpelledInfo expelledInfo = entBaseExpelledInfoService.getById(entInfo.getExpelledId()); + if (expelledInfo == null) { + throw new BusinessException("拟除名企业信息不存在,请联系管理员"); + } + map.put("entName", expelledInfo.getEntName()); + map.put("uscc", expelledInfo.getUscc()); + map.put("lerepName", expelledInfo.getLerepName()); + map.put("year", auditInfo.getRemoveDate().getYear()); + map.put("month", auditInfo.getRemoveDate().getMonthValue()); + map.put("day", auditInfo.getRemoveDate().getDayOfMonth()); + try { + // 文书模板路径 + String wordTemplatePath = "static" + File.separator + "template" + File.separator + "expelled" + File.separator + "auditEntDoc.docx"; + String resource = this.getClass().getClassLoader().getResource(wordTemplatePath).getPath(); + // URL解码 + resource = URLDecoder.decode(resource, "UTF-8"); + String realPath = CommonConfig.getUploadPath(); // 存储路径 + String docName = UUID.randomUUID().toString(); // 文件名 + TSAttachment tsAttachment = attachmentService.getByBizseqAndType(resultInfo.getId(), "1"); + if (tsAttachment == null) { + tsAttachment = new TSAttachment(); + tsAttachment.setAttachmentid(UUID.randomUUID().toString()); + tsAttachment.setUploaddate(LocalDate.now()); + } else { + realPath = CommonConfig.getUploadPathByDate(tsAttachment.getUploaddate()); + docName = tsAttachment.getFilename().substring(0, tsAttachment.getFilename().lastIndexOf(".")); + } + realPath += File.separator + resultInfo.getId(); + File dir = new File(realPath); + if (!dir.exists()) { + dir.mkdirs(); + } + // 生成 + XWPFTemplate.compile(resource).render(map).writeToFile(realPath + File.separator + docName + ".docx"); + // 保存记录 + String ext = ".docx"; + String fileName = docName + ext; + String tempPath = resultInfo.getId() + File.separator + fileName; + tsAttachment.setCreatetype("1"); // 文件为系统生成 + tsAttachment.setBizseq(resultInfo.getId()); + tsAttachment.setFileext(ext); + tsAttachment.setFilename(fileName); + tsAttachment.setTemppath(tempPath); + tsAttachment.setAttachtype("3"); // 除名决定书 + attachmentService.saveOrUpdate(tsAttachment); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void downloadAuditDoc(HttpServletResponse response, String resultId, String noticeNo) { + ExpelledResultInfo resultInfo = expelledResultInfoService.getById(resultId); + if (resultInfo == null) { + return; + } + ExpelledEntInfo entInfo = expelledEntInfoService.getExpelledEntInfo(noticeNo); + if (entInfo == null) { + return; + } + TSAttachment tsAttachment = attachmentService.getByBizseqAndType(resultInfo.getId(), "3"); + if (tsAttachment == null) { + createAuditDoc(resultInfo, entInfo); + tsAttachment = attachmentService.getByBizseqAndType(resultInfo.getId(), "3"); + if (tsAttachment == null) { + return; + } + } + // 获取流 + InputStream is = null; + OutputStream os = null; + try { + // 获取文件 + String realPath = CommonConfig.getUploadPathByDate(tsAttachment.getUploaddate()) + File.separator + tsAttachment.getTemppath(); + is = new FileInputStream(realPath); + os = response.getOutputStream(); + String fileName = new String(tsAttachment.getFilename().getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1); + // 设置:当浏览器收到这份资源的时候,以下载的方式提醒用户,而不是直接显示 + response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); + byte[] buffer = new byte[4096]; + int len; + while ((len = is.read(buffer)) != -1) { + os.write(buffer, 0, len); + } + } catch (Exception e) { + e.printStackTrace(); + log.error("下载文书时发生异常:{}=", e); + return; + } finally { + try { + os.close(); + is.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } } diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/impl/ExpelledBizInfoServiceImpl.java b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/impl/ExpelledBizInfoServiceImpl.java index 1793356..afc9ecd 100644 --- a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/impl/ExpelledBizInfoServiceImpl.java +++ b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/impl/ExpelledBizInfoServiceImpl.java @@ -2,9 +2,17 @@ package com.chinaweal.aiccs.aiccs.expelled.service.impl; 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.chinaweal.aiccs.aiccs.abnormal.entity.TSAttachment; +import com.chinaweal.aiccs.aiccs.abnormal.service.TSAttachmentService; +import com.chinaweal.aiccs.aiccs.auditing.entity.TSOpinion; +import com.chinaweal.aiccs.aiccs.auditing.service.TSOpinionService; +import com.chinaweal.aiccs.aiccs.business.entity.TSTaskList; +import com.chinaweal.aiccs.aiccs.business.entity.TSTwfProcessNode; +import com.chinaweal.aiccs.aiccs.business.rules.model.SequenceFlowModel; +import com.chinaweal.aiccs.aiccs.business.service.TSTaskListService; +import com.chinaweal.aiccs.aiccs.business.service.WorkFlowService; import com.chinaweal.aiccs.aiccs.expelled.entity.EntBaseExpelledInfo; import com.chinaweal.aiccs.aiccs.expelled.entity.ExpelledBizInfo; import com.chinaweal.aiccs.aiccs.expelled.entity.ExpelledEntInfo; @@ -13,13 +21,39 @@ import com.chinaweal.aiccs.aiccs.expelled.service.IEntBaseExpelledInfoService; import com.chinaweal.aiccs.aiccs.expelled.service.IExpelledBizInfoService; import com.chinaweal.aiccs.aiccs.expelled.service.IExpelledEntInfoService; import com.chinaweal.aiccs.aiccs.expelled.vo.BizInfoVo; +import com.chinaweal.aiccs.aiccs.expelled.vo.RemoveApproveInfo; +import com.chinaweal.aiccs.common.base.controller.BaseController; +import com.chinaweal.aiccs.common.constant.BaseDataConstant; +import com.chinaweal.aiccs.common.constant.Constant; +import com.chinaweal.aiccs.common.util.FlowUtil; +import com.chinaweal.aiccs.common.util.HandleWorkFlowUtil; +import com.chinaweal.aiccs.common.util.WorkFlowUtil; +import com.chinaweal.aiccs.config.CommonConfig; import com.chinaweal.aiccs.utils.BeanUtil; import com.chinaweal.aiccs.utils.DocumentNoGenerator; +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.rest.RestResult; +import com.chinaweal.youfool.framework.springboot.rest.ResultCode; +import com.deepoove.poi.XWPFTemplate; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; +import java.time.LocalDate; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.UUID; /** @@ -35,28 +69,35 @@ public class ExpelledBizInfoServiceImpl extends ServiceImpl listExpelledNoticeInfo(BaseQuery query) { - ExpelledBizInfo entity = query.getEntity(ExpelledBizInfo.class); - Page page = query.getPage(); - LambdaQueryWrapper wrapper = Wrappers.lambdaQuery() - .eq(StringUtils.isNotBlank(entity.getBizNo()), ExpelledBizInfo::getBizNo, entity.getBizNo()) - .eq(ExpelledBizInfo::getIsDelete, "0"); - return page(page, wrapper); - } - - @Override - public void saveExpelledNoticeInfo(ExpelledBizInfo query) { - ExpelledBizInfo bizInfo = getById(query.getId()); - if (bizInfo == null) { - bizInfo = new ExpelledBizInfo(); - bizInfo.setId(UUID.randomUUID().toString()); - bizInfo.setBizNo(generateBizNo()); - bizInfo.setIsDelete("0"); + public RestResult startNoticeBiz(ExpelledBizInfo query, HttpServletRequest request) { + AICUser user = BaseController.getLoginUser(request); + if (user == null) { + throw new BusinessException("登录超时,请重新登录"); } - BeanUtil.copyBean(query, bizInfo); - saveOrUpdate(bizInfo); + if (CollectionUtils.isEmpty(query.getExpelledIds())) { + return RestResult.error(ResultCode.PARAM_IS_BLANK, "请至少勾选一个拟除名市场主体"); + } + Map resultMap = new HashMap<>(); + String bizId = UUID.randomUUID().toString(); + // 添加待办启动流程 + TSTaskList tsTaskList = new TSTaskList(); + tsTaskList.setBizseqid(bizId); + tsTaskList.setBustype(BaseDataConstant.BUSINESS_TYPE_REMOVE_NOTICE); // 除名告知 + tsTaskList.setBusname(query.getBusName()); + // 保存除名告知数据 + ExpelledBizInfo noticeInfo = new ExpelledBizInfo(); + noticeInfo.setId(bizId); + noticeInfo.setBizNo(generateBizNo()); // 初始化市场主体除名结果信息 for (String expelledId : query.getExpelledIds()) { EntBaseExpelledInfo expelledInfo = entBaseExpelledInfoService.getById(expelledId); @@ -64,17 +105,203 @@ public class ExpelledBizInfoServiceImpl extends ServiceImpl nextSequenceFlows = workFlowService.findNextSequenceFlowList(tsTaskList.getWorkflowid()); + TSTwfProcessNode currentNode = workFlowService.findCurrentNode(tsTaskList.getWorkflowid()); + String opinionType = BaseDataConstant.getOpinionTypeByWorkFlowNode(currentNode.getCurrentnode()); + if (opinionType == null) { + opinionType = "1"; + } + resultMap.put("noticeInfo", noticeInfo); + resultMap.put("taskId", tsTaskList.getTasklistid()); + resultMap.put("bizId", bizId); + resultMap.put("nextSequenceFlows", nextSequenceFlows); + resultMap.put("currentNode", currentNode.getCurrentnode()); + resultMap.put("currentNodeName", WorkFlowUtil.getNodeName(currentNode.getCurrentnode())); + resultMap.put("currentLinkTypeID", opinionType); + return RestResult.ok(resultMap); } @Override - public IPage listTodoNoticeInfo(BaseQuery query) { - BizInfoVo entity = query.getEntity(BizInfoVo.class); - Page page = query.getPage(); - return baseMapper.listTodoNoticeInfo(page, entity); + public RestResult getNoticeBiz(String bizId) { + Map resultMap = new HashMap<>(); + // 除名告知业务表 + ExpelledBizInfo noticeInfo = getById(bizId); + if (noticeInfo == null) { + throw new BusinessException("除名告知业务信息不存在,请联系管理员"); + } + resultMap.put("noticeInfo", noticeInfo); + // 拟除名企业信息 + BizInfoVo query = new BizInfoVo(); + query.setId(bizId); + List entInfos = baseMapper.listNoticeEntBaseInfo(query); + resultMap.put("entInfos", entInfos); + // 除名业务待办 + TSTaskList tsTaskList = tsTaskListService.searchTaskListByBizId(bizId); + if (tsTaskList == null) { + throw new BusinessException("除名告知业务待办信息不存在,请联系管理员"); + } + resultMap.put("tsTaskList", new TSTaskList().setTasklistid(tsTaskList.getTasklistid()).setWorkflowid(tsTaskList.getWorkflowid())); + // 获取历史审批意见 + LambdaQueryWrapper opinionWrapper = new LambdaQueryWrapper<>(); + opinionWrapper.eq(TSOpinion::getBizseq, bizId) + .ne(TSOpinion::getOpiniontype, "55") + .orderByAsc(TSOpinion::getHandledate); + List tsOpinions = opinionService.list(opinionWrapper); + resultMap.put("historyOpinions", tsOpinions); + return RestResult.ok(resultMap); + } + + @Override + public RestResult nextNoticeBiz(RemoveApproveInfo removeApproveInfo, HttpServletRequest request) { + AICUser user = BaseController.getLoginUser(request); + if (user == null) { + throw new BusinessException("登录超时,请重新登录"); + } + String bizId = removeApproveInfo.getBizId(); + String taskId = removeApproveInfo.getTaskId(); + String nextNodeId = removeApproveInfo.getNextNodeId(); + String nextPerformerIds = removeApproveInfo.getNextPerformerIds(); + String nextPerformerNames = removeApproveInfo.getNextPerformerNames(); + ExpelledBizInfo noticeInfoQuery = removeApproveInfo.getNoticeInfo(); + if (StringUtils.isBlank(bizId)) { + throw new BusinessException("bizId参数缺失"); + } + if (StringUtils.isBlank(taskId)) { + throw new BusinessException("taskId参数缺失"); + } + if (StringUtils.isBlank(nextNodeId)) { + throw new BusinessException("nextNodeId参数缺失"); + } + if (noticeInfoQuery == null) { + throw new BusinessException("noticeInfoQuery参数缺失"); + } + Map resultMap = new HashMap<>(); + ExpelledBizInfo noticeInfo = getById(bizId); + if (noticeInfo == null) { + throw new BusinessException("除名告知业务信息不存在,请联系管理员"); + } + // 更新除名告知业务表 + if (noticeInfoQuery != null && StringUtils.isNotBlank(noticeInfoQuery.getId())) { + TSTaskList tsTaskList = tsTaskListService.selectByTasklistID(taskId); + TSTwfProcessNode processNode = workFlowService.findCurrentNode(tsTaskList.getWorkflowid()); + + // 下一步为审核 + if (StringUtils.equals(FlowUtil.EXPTLISTWORKFLOW_HANDLEEXPTLIST, nextNodeId)) { + if (StringUtils.equals(FlowUtil.EXPTLISTWORKFLOW_EXPTLISTENTER, processNode.getCurrentnode())) { + BeanUtil.copyBean(noticeInfoQuery, noticeInfo); + } + } + + if (StringUtils.isBlank(nextPerformerIds)) { + processNode = workFlowService.findCurrentNode(tsTaskList.getWorkflowid()); + int order = WorkFlowUtil.checkNextOrder(processNode.getCurrentnode(), nextNodeId); + // 通过order判断为回退还是前进 >0 前进 + if (order > 0) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(TSOpinion::getWorkflowid, tsTaskList.getWorkflowid()) + .eq(TSOpinion::getOpiniontype, "0") // 经办为0 + .orderByDesc(TSOpinion::getLauptime); + List list = opinionService.list(wrapper); + if (CollectionUtils.isEmpty(list)) { + return RestResult.error(ResultCode.DATA_NONE, "除名告知审批意见不存在,请联系管理员"); + } + nextPerformerIds = list.get(0).getHandlerid(); + nextPerformerNames = list.get(0).getHandler(); + } + // 回退时获取经办人 + if (order < 0) { + // 获取经办人 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(TSOpinion::getWorkflowid, tsTaskList.getWorkflowid()) + .eq(TSOpinion::getOpiniontype, '0') + .orderByDesc(TSOpinion::getLauptime); + List list = opinionService.list(wrapper); + if (org.apache.commons.collections.CollectionUtils.isEmpty(list)) { + return RestResult.error(ResultCode.DATA_NONE, "除名告知审批意见不存在,请联系管理员"); + } + nextPerformerIds = list.get(0).getHandlerid(); + nextPerformerNames = list.get(0).getHandler(); + } + } + + // 发送 + String[] ids = StringUtils.split(nextPerformerIds, Constant.COMMA); + String[] names = StringUtils.split(nextPerformerNames, Constant.COMMA); + try { + tsTaskList = saveNoticeAuditProcess(user, tsTaskList, noticeInfo, removeApproveInfo.getOpinionQuery(), nextNodeId, ids, names); + if (ids.length == 1 && StringUtils.equals(user.getPrimaryKey(), ids[0])) { + resultMap.put("bizId", bizId); + resultMap.put("taskId", taskId); + resultMap.put("nextNodeId", nextNodeId); + resultMap.put("workFlowId", tsTaskList.getWorkflowid()); + } + } catch (Exception e) { + log.error("除名告知业务审批出错:", e); + throw new BusinessException("除名告知业务审批出错"); + } + } + return RestResult.ok(resultMap); + } + + @Override + public TSTaskList startNoticeBizAccept(AICUser user, TSTaskList tsTaskList, ExpelledBizInfo noticeInfo) { + if (StringUtils.isBlank(tsTaskList.getTasklistid())) { + noticeInfo.setIsDelete("0"); + saveOrUpdate(noticeInfo); + String definedname = FlowUtil.EXPTLISTWORKFLOW; // 除名告知,这类参考使用企业经营异常名录流程模板,应该是可以的吧 + // 新待办 + tsTaskList = HandleWorkFlowUtil.createTaskList(tsTaskList, user); + // 开始工作流 + tsTaskListService.startWorkFlow(tsTaskList, user, definedname); + } + return tsTaskList; + } + + @Override + public TSTaskList saveNoticeAuditProcess(AICUser user, TSTaskList tsTaskList, ExpelledBizInfo noticeInfo, TSOpinion opinion, String nextNodeId, String[] nextPerformerIds, String[] nextPerformerNames) { + try { + if (StringUtils.isNotBlank(tsTaskList.getAcceptgroupid())) { + workFlowService.claimGroup(tsTaskList.getWorkflowid(), user.getPrimaryKey()); + } + tsTaskListService.updateWorkFlow(user, opinion, tsTaskList, nextNodeId, nextPerformerIds, nextPerformerNames); + noticeInfo.setRemoveTime(LocalDate.now()); // 核准时间 + noticeInfo.setRemoveOrgNo(user.getRegionID()); + noticeInfo.setRemoveOrgName(user.getOrgName()); + saveOrUpdate(noticeInfo); + List entInfos = expelledEntInfoService.searchEntInfoByBizId(noticeInfo.getId()); + if (!CollectionUtils.isEmpty(entInfos)) { + for (ExpelledEntInfo entInfo : entInfos) { + if (FlowUtil.EXPTLISTWORKFLOW_ENDEXPTLIST.equals(nextNodeId)) { // 完结时 + entInfo.setStatus("0"); + } + if (FlowUtil.EXPTLISTWORKFLOW_OVEREXPTLIST.equals(nextNodeId) || FlowUtil.EXPTLISTWORKFLOW_OVERFINISH.equals(nextNodeId)) { + entInfo.setStatus("-1"); // 除名告知不通过,即是不建议 + // 更新拟除名名单库状态为有效 + EntBaseExpelledInfo expelledInfo = entBaseExpelledInfoService.getById(entInfo.getExpelledId()); + if (expelledInfo != null) { + expelledInfo.setState("2"); // 有效 + entBaseExpelledInfoService.saveOrUpdate(expelledInfo); + } + } + expelledEntInfoService.saveOrUpdate(entInfo); + } + } + // 生成文书 + createApproveDoc(noticeInfo, tsTaskList); + } catch (Exception e) { + log.error("除名告知流程审核出错", e); + throw new BusinessException("除名告知流程审核出错"); + } + return tsTaskList; } @Override @@ -91,4 +318,186 @@ public class ExpelledBizInfoServiceImpl extends ServiceImpl listTodoNoticeInfo(BaseQuery query) { + BizInfoVo entity = query.getEntity(BizInfoVo.class); + Page page = query.getPage(); + return baseMapper.listTodoNoticeInfo(page, entity); + } + + @Override + public void createApproveDoc(ExpelledBizInfo noticeInfo, TSTaskList tsTaskList) { + Map map = new HashMap<>(); + map.put("orgName", noticeInfo.getRemoveOrgName()); + // 拟除名企业信息 + BizInfoVo query = new BizInfoVo(); + query.setId(noticeInfo.getId()); + List entInfos = baseMapper.listNoticeEntBaseInfo(query); + String entNames = ""; + if (!CollectionUtils.isEmpty(entInfos)) { + for (int i = 0; i < entInfos.size(); i++) { + if (i >= 3) { + continue; + } + entNames += entInfos.get(i).getEntName() + '、'; + } + entNames = entNames.substring(0, entNames.length() - 1) + "等" + entInfos.size() + "户企业/个体户"; + } + map.put("entNames", entNames); + map.put("removeReason", new StringBuilder(noticeInfo.getTruth()).append(System.lineSeparator()).append(noticeInfo.getReason()).append(System.lineSeparator()).append(noticeInfo.getLaw()).toString()); + // 获取历史审批意见 + LambdaQueryWrapper opinionWrapper = new LambdaQueryWrapper<>(); + opinionWrapper.eq(TSOpinion::getBizseq, noticeInfo.getId()) + .in(TSOpinion::getOpiniontype,"0", "1", "2") + .orderByAsc(TSOpinion::getHandledate); + List tsOpinions = opinionService.list(opinionWrapper); + for (TSOpinion item : tsOpinions) { + int index = Integer.parseInt(item.getOpiniontype()) + 1; + map.put("opinion" + index, item.getOpinioncontent()); + map.put("handler" + index, item.getHandler()); + map.put("year" + index, item.getHandledate().getYear()); + map.put("month" + index, item.getHandledate().getMonthValue()); + map.put("day" + index, item.getHandledate().getDayOfMonth()); + } + try { + // 文书模板路径 + String wordTemplatePath = "static" + File.separator + "template" + File.separator + "expelled" + File.separator + "noticeDoc.docx"; + String resource = this.getClass().getClassLoader().getResource(wordTemplatePath).getPath(); + // URL解码 + resource = URLDecoder.decode(resource, "UTF-8"); + String realPath = CommonConfig.getUploadPath(); // 存储路径 + String docName = UUID.randomUUID().toString(); // 文件名 + TSAttachment tsAttachment = attachmentService.getByBizseqAndType(noticeInfo.getId(), "1"); + if (tsAttachment == null) { + tsAttachment = new TSAttachment(); + tsAttachment.setAttachmentid(UUID.randomUUID().toString()); + tsAttachment.setUploaddate(LocalDate.now()); + } else { + realPath = CommonConfig.getUploadPathByDate(tsAttachment.getUploaddate()); + docName = tsAttachment.getFilename().substring(0, tsAttachment.getFilename().lastIndexOf(".")); + } + realPath += File.separator + noticeInfo.getId(); + File dir = new File(realPath); + if (!dir.exists()) { + dir.mkdirs(); + } + // 生成 + XWPFTemplate.compile(resource).render(map).writeToFile(realPath + File.separator + docName + ".docx"); + // 保存记录 + String ext = ".docx"; + String fileName = docName + ext; + String tempPath = noticeInfo.getId() + File.separator + fileName; + tsAttachment.setCreatetype("1"); // 文件为系统生成 + tsAttachment.setBizseq(noticeInfo.getId()); + tsAttachment.setFileext(ext); + tsAttachment.setFilename(fileName); + tsAttachment.setTemppath(tempPath); + tsAttachment.setAttachtype("1"); // 审批表 + attachmentService.saveOrUpdate(tsAttachment); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void createNoticeDoc(ExpelledEntInfo entInfo) { + Map map = new HashMap<>(); + ExpelledBizInfo noticeInfo = getById(entInfo.getBizId()); + if (noticeInfo == null) { + throw new BusinessException("除名告知业务信息不存在,请联系管理员"); + } + map.put("orgName", noticeInfo.getRemoveOrgName()); + map.put("noticeNo", entInfo.getNoticeNo()); + EntBaseExpelledInfo expelledInfo = entBaseExpelledInfoService.getById(entInfo.getExpelledId()); + if (expelledInfo == null) { + throw new BusinessException("拟除名企业信息不存在,请联系管理员"); + } + map.put("entName", expelledInfo.getEntName()); + map.put("year", noticeInfo.getRemoveTime().getYear()); + map.put("month", noticeInfo.getRemoveTime().getMonthValue()); + map.put("day", noticeInfo.getRemoveTime().getDayOfMonth()); + try { + // 文书模板路径 + String wordTemplatePath = "static" + File.separator + "template" + File.separator + "expelled" + File.separator + "noticeEntDoc.docx"; + String resource = this.getClass().getClassLoader().getResource(wordTemplatePath).getPath(); + // URL解码 + resource = URLDecoder.decode(resource, "UTF-8"); + String realPath = CommonConfig.getUploadPath(); // 存储路径 + String docName = UUID.randomUUID().toString(); // 文件名 + TSAttachment tsAttachment = attachmentService.getByBizseqAndType(entInfo.getId(), "1"); + if (tsAttachment == null) { + tsAttachment = new TSAttachment(); + tsAttachment.setAttachmentid(UUID.randomUUID().toString()); + tsAttachment.setUploaddate(LocalDate.now()); + } else { + realPath = CommonConfig.getUploadPathByDate(tsAttachment.getUploaddate()); + docName = tsAttachment.getFilename().substring(0, tsAttachment.getFilename().lastIndexOf(".")); + } + realPath += File.separator + entInfo.getId(); + File dir = new File(realPath); + if (!dir.exists()) { + dir.mkdirs(); + } + // 生成 + XWPFTemplate.compile(resource).render(map).writeToFile(realPath + File.separator + docName + ".docx"); + // 保存记录 + String ext = ".docx"; + String fileName = docName + ext; + String tempPath = entInfo.getId() + File.separator + fileName; + tsAttachment.setCreatetype("1"); // 文件为系统生成 + tsAttachment.setBizseq(entInfo.getId()); + tsAttachment.setFileext(ext); + tsAttachment.setFilename(fileName); + tsAttachment.setTemppath(tempPath); + tsAttachment.setAttachtype("2"); // 除名告知书 + attachmentService.saveOrUpdate(tsAttachment); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void downloadNoticeDoc(HttpServletResponse response, String noticeNo) { + ExpelledEntInfo entInfo = expelledEntInfoService.getExpelledEntInfo(noticeNo); + if (entInfo == null) { + return; + } + TSAttachment tsAttachment = attachmentService.getByBizseqAndType(entInfo.getId(), "2"); + if (tsAttachment == null) { + createNoticeDoc(entInfo); + tsAttachment = attachmentService.getByBizseqAndType(entInfo.getId(), "2"); + if (tsAttachment == null) { + return; + } + } + // 获取流 + InputStream is = null; + OutputStream os = null; + try { + // 获取文件 + String realPath = CommonConfig.getUploadPathByDate(tsAttachment.getUploaddate()) + File.separator + tsAttachment.getTemppath(); + is = new FileInputStream(realPath); + os = response.getOutputStream(); + String fileName = new String(tsAttachment.getFilename().getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1); + // 设置:当浏览器收到这份资源的时候,以下载的方式提醒用户,而不是直接显示 + response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); + byte[] buffer = new byte[4096]; + int len; + while ((len = is.read(buffer)) != -1) { + os.write(buffer, 0, len); + } + } catch (Exception e) { + e.printStackTrace(); + log.error("下载文书时发生异常:{}=", e); + return; + } finally { + try { + os.close(); + is.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } } diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/impl/ExpelledEntInfoServiceImpl.java b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/impl/ExpelledEntInfoServiceImpl.java index 108f855..4f00a06 100644 --- a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/impl/ExpelledEntInfoServiceImpl.java +++ b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/impl/ExpelledEntInfoServiceImpl.java @@ -9,6 +9,7 @@ import com.chinaweal.aiccs.utils.BeanUtil; import com.chinaweal.aiccs.utils.DocumentNoGenerator; import org.springframework.stereotype.Service; +import java.util.List; import java.util.UUID; /** @@ -28,7 +29,6 @@ public class ExpelledEntInfoServiceImpl extends ServiceImpl searchEntInfoByBizId(String bizId) { + return list(new LambdaQueryWrapper().eq(ExpelledEntInfo::getBizId, bizId)); + } } diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/impl/ExpelledResultInfoServiceImpl.java b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/impl/ExpelledResultInfoServiceImpl.java index 798633d..2c7e0d7 100644 --- a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/impl/ExpelledResultInfoServiceImpl.java +++ b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/service/impl/ExpelledResultInfoServiceImpl.java @@ -8,6 +8,7 @@ import com.chinaweal.aiccs.aiccs.expelled.service.IExpelledResultInfoService; import com.chinaweal.aiccs.utils.BeanUtil; import org.springframework.stereotype.Service; +import java.util.List; import java.util.UUID; /** @@ -34,4 +35,9 @@ public class ExpelledResultInfoServiceImpl extends ServiceImpl().eq(ExpelledResultInfo::getAuditId, auditId).eq(ExpelledResultInfo::getEntId, entId)); } + + @Override + public List searchResultInfoByAudit(String auditId) { + return list(new LambdaQueryWrapper().eq(ExpelledResultInfo::getAuditId, auditId)); + } } diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/vo/AuditInfoVo.java b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/vo/AuditInfoVo.java index 4bd3de5..3a19123 100644 --- a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/vo/AuditInfoVo.java +++ b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/vo/AuditInfoVo.java @@ -1,5 +1,6 @@ package com.chinaweal.aiccs.aiccs.expelled.vo; +import com.baomidou.mybatisplus.annotation.TableField; import com.chinaweal.youfool.framework.springboot.json.LocalDateTimeStringSerializer; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import io.swagger.annotations.ApiModelProperty; @@ -159,4 +160,11 @@ public class AuditInfoVo implements Serializable { */ @ApiModelProperty(value = "拟除名异议告知业务信息") private List bizInfos; + + /** + * 业务名称 + */ + @ApiModelProperty(value = "业务名称") + @TableField(exist = false) + private String busName; } diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/vo/RemoveApproveInfo.java b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/vo/RemoveApproveInfo.java index 40c7bda..5c736f0 100644 --- a/src/main/java/com/chinaweal/aiccs/aiccs/expelled/vo/RemoveApproveInfo.java +++ b/src/main/java/com/chinaweal/aiccs/aiccs/expelled/vo/RemoveApproveInfo.java @@ -2,6 +2,8 @@ package com.chinaweal.aiccs.aiccs.expelled.vo; import com.chinaweal.aiccs.aiccs.auditing.entity.TSOpinion; import com.chinaweal.aiccs.aiccs.expelled.entity.ExpelledApplyInfo; +import com.chinaweal.aiccs.aiccs.expelled.entity.ExpelledAuditInfo; +import com.chinaweal.aiccs.aiccs.expelled.entity.ExpelledBizInfo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -33,7 +35,16 @@ public class RemoveApproveInfo implements Serializable { @ApiModelProperty(value = "下一环节操作人姓名") private String nextPerformerNames; - @ApiModelProperty(value = "除名申请业务信息") + @ApiModelProperty(value = "除名告知业务信息") + private ExpelledBizInfo noticeInfo; + + @ApiModelProperty(value = "除名异议业务信息") + private ExpelledAuditInfo objectionInfo; + + @ApiModelProperty(value = "除名决定业务信息") + private ExpelledAuditInfo auditInfo; + + @ApiModelProperty(value = "除名申请(修复、复议、撤销)业务信息") private ExpelledApplyInfo applyInfoQuery; @ApiModelProperty(value = "审批意见") diff --git a/src/main/java/com/chinaweal/aiccs/common/constant/BaseDataConstant.java b/src/main/java/com/chinaweal/aiccs/common/constant/BaseDataConstant.java index 42ab05a..a184152 100644 --- a/src/main/java/com/chinaweal/aiccs/common/constant/BaseDataConstant.java +++ b/src/main/java/com/chinaweal/aiccs/common/constant/BaseDataConstant.java @@ -93,9 +93,12 @@ public class BaseDataConstant { public static final String BUSTNESS_TYPE_REM_ABN_OBJECTION = "20"; // 移出异常名录异议 public static final String BUSINESS_TYPE_FORCE_DEREGISTER = "50";// 拟强制注销 - public static final String BUSINESS_TYPE_REMOVE_REPAIR = "1001"; // 除名修复 - public static final String BUSINESS_TYPE_REMOVE_REVIEW = "1002"; // 除名复议 - public static final String BUSINESS_TYPE_REMOVE_REVOKE = "1003"; // 除名撤销 + public static final String BUSINESS_TYPE_REMOVE_NOTICE = "1001"; // 除名告知 + public static final String BUSINESS_TYPE_REMOVE_OBJECTION = "1002"; // 除名异议 + public static final String BUSINESS_TYPE_REMOVE_AUDIT = "1003"; // 除名决定 + public static final String BUSINESS_TYPE_REMOVE_REPAIR = "1004"; // 除名修复 + public static final String BUSINESS_TYPE_REMOVE_REVIEW = "1005"; // 除名复议 + public static final String BUSINESS_TYPE_REMOVE_REVOKE = "1006"; // 除名撤销 // 地址批量列异 public static final String EXPTLIST_TYPE_ADDRESSBATCH_ENTEREXCP = "71";//企业地址批量列异 diff --git a/src/main/resources/mybatis/mapper/aiccs/expelled/ExpelledAuditInfoMapper.xml b/src/main/resources/mybatis/mapper/aiccs/expelled/ExpelledAuditInfoMapper.xml index ae731ea..65ac3ae 100644 --- a/src/main/resources/mybatis/mapper/aiccs/expelled/ExpelledAuditInfoMapper.xml +++ b/src/main/resources/mybatis/mapper/aiccs/expelled/ExpelledAuditInfoMapper.xml @@ -47,4 +47,40 @@ + + diff --git a/src/main/resources/mybatis/mapper/aiccs/expelled/ExpelledBizInfoMapper.xml b/src/main/resources/mybatis/mapper/aiccs/expelled/ExpelledBizInfoMapper.xml index ba5111c..640f7c8 100644 --- a/src/main/resources/mybatis/mapper/aiccs/expelled/ExpelledBizInfoMapper.xml +++ b/src/main/resources/mybatis/mapper/aiccs/expelled/ExpelledBizInfoMapper.xml @@ -36,4 +36,28 @@ + + diff --git a/src/main/resources/static/template/expelled/auditDoc.docx b/src/main/resources/static/template/expelled/auditDoc.docx new file mode 100644 index 0000000000000000000000000000000000000000..1a83b89c691d8313ad4215f05be0cb8c0c3e721c GIT binary patch literal 16035 zcmb8W1DGYt(k|S#ZF}0D?w+2uZJX1!ZQGc(ZQHi(Y1{aF_BrS7v*&*IKKIY(S*uoM z#T$_sQ7f}5BVQSDU=S#P-z7+Dhv)b4KLzshhk=#8jIEWm9i7al7|Le_#9v}DNc}aY zfB*o_KmY&;|1G9#ZB6TJVV)t^EwxLJ&`x{>FMA$>+-M4&isjI2t45Q6b%dxoQCBTu zKFS*W{wCF^IHdK!YL)r+YLvOXZFUqVeaov}D>d3Cg3LV9u!6JrOZ+Cje1=58RBc(^ z@8s5>&;y~7t?F(eI|_@R4~eX7mR87VQbh(Aj&V-_TMuplo)PI**a#lH{BpV^3Q*FZ zjRFm(lPDE!bu7a7m*CYq(|e_f+5ED$vxQV7477>0b$d94=g+fS7qeXe^V1$BJceMT zrF`%9I}3zT%qnqE2l94>7&KDndJxv`OL6QL31d3Y5Eqx*83*NlL|*;eQ|xb9$ydG` z_=KnNr`2SWI|MJ@T^-oQZx5F{STD|*TO%K<>5r=?OK0f{1|f7M#j}vW*oUs=26;>U zo~`1UA3`@u*Xi#(6Nh0xp6(Ui)35fUICjHYInpLeSXbjwCqqjr4*E+doZA6e6@f+^ zgN}PooROHfP-ZL#{rmC%85SEn3u)QUu(*7N1@XVbqHkqu_&Y8hv9i*=1SkQUlCSWv z7c^7-9BB<vleR)yk4}z$barq&bkh zh$fc)b7@HJbEVFaM29J8WeiwibAJ3`$JaSq784NxembFn0>h01llWs)OmYcT=hvyURneLpJ(VM9)9MatbTD&>yCE` z-(|Jt1Pwhr5tR4q)OlXp#QFINYKdIzOtJw(d&#h*l!(d&D0g$@A^4V$p?N)wKHJ+? zN<-j-N%Bq9_OAt`zM9G(E~OGaUeNNa4$L3;v|*4D@@jD|Qim?C9%$zvMS=Hdj<%0N zsN(|_^52xce;2<4{ipvY;=$z-KK+0G>3`&Z_}{_K-pb;41nOgXqtfUR0xlAs@uM$5 zcKdZh2ui(01y=lL@>CPV1Hy+>`!RIMX^NjW#p~7^+>Y`UqjE9ZA3COQE;@n-*lV?H zmchC*d3350M`9ZX0o<49#?^HwH0unfhY~?`bfDJ8wL7mj?`rhh4AFr^H#a1qMnHd%B!I=xe7Ecu}N%X1>IeoT2>Urs!;vPN7BKSN{huAv|) zil{g3#i5-vY_vh^W}KV<*AE)on9IiLm4YMs({rZGYlEdZNHI}I(P84s8iLDmZM=@V z@Y^VBw$AQ|?_Z=9g2*@G!52Ec`4EU_h2p9SkoP32U$ke~Crx9IE_*g2u4Z6+5fI@y z#2Gc0h9Wd~c9!}b!!x8=pXCWo)B*}~COUzCNAZ6i13^Ed=wxMU@W=SqHoBJ@2?GEC zs1E=D{~r-Mdlz#KOOII7m=!#7qL+#>xQ_^q{2LrLuJBRdSc!(bfl&x&AAtj-)UUN8*<-0<#JHA$gJE5;b&#W8+-T_x2YjB;4 zpsK8@c+o;uSn0@6Mk%tBsD_7CE&Q_3o^E28H#%q^Nr=NPGFpCp%CP95%vlroRuljF z8^0;kRvhu2b}4Qgv2s|%Drrj&^$wiAbe#iAWscy4Ev}J>w^D2Ej-F;bkxRFj((0-? zD?F>}6@iFkt-5TQ1pIa`*q)oH_5Cv|>R0u?==8MVkPjF}CX{aI4ug{>>ODixj5Kk( z{P#8_Q&s0QCM6JAdtgdvuviFlO>XJ1p&)6c>z^Ca>|aI>1^ZU;JD49x7%4^)yKgAM zUwe(E;T7deI?Krn9f0o|9arF8pj0^*dtt-F9MmRWcZKPdvMb%6N|k>EkG~!dwA!Nv zysn~3Z=!Pf>soZMABx&z1`sCkudlg1Jaa?|zyaGFe0R~a)C$=GhCd`l5HFq4wn6N8 z#kiD!!_0b<>@PkobAnLhUy#*TU8hjHJr)|to825)7@Xn#8E4p^g2G}|120>;KSG+A zsLUGm-EW+-zrfLCzAWyF3@?)H%A_r1_VZU1+g0A80O#o4<1}yZOte>>K^pe#Pf1G& zuZAXuw_n=>w}*b86#$j2_Qw%hMRl)*Jh`m>9f-u5%=nOccntj$J zpA|O0D{MY1dOs^bR&(VhSvJft(oI9KCdCOy6yn#uJPG5(=6lPFOL96Ib68A%=SN1E zbbH~gqi8j)KEe|jP&PmmH_gNdFb8qT*8#!Z6d^M z)&)6%LCS$nk5F1iX83EAr99Xy|MyubFSWRi6@?SkX&hwdMQY>5ucJztTunUnI~x8E z8?cVca=8?xq%2f)S=q8J=NE0_knK>SqN`ZqB5R+Yb*$B&Z4K`oJ^?}LN_5-qJ&d>) zd&4>#rKi<6s$+{`NEy#|Xq9(RXbDc%6+vMhakiB?I0tM!jP08sj8PjS4jnKMj%{qG zO)mM}+p!JZrpkmb%Ra=*`s`$V(4+ev19mFDo;;+pUl0fNdimL~zA8jU?cevZDvW5T z+~SGvriN&dEr+7Y`dkY+P@K2xVnR9N_Cj)T8_~gU?Q!3)-K0qFj1{~XZ(jFL%0{%e zx!CQ03u1A0{fXf1ubH9O798D@FH6){oWa+9i)e}A-O{NfBvU_Y_?IRt?r@Gf~#V0px#Se|VaZ58g-;;D+XeKntUm1>BVO|pmlV3T|CSIEo z#HeMaS|g7l103@S@Kb)yhTlb9NFzsr!j8ZC!IE*U>V2bFRW*de?LES$qH!BF;wH+A zbUiM@XPcvV8;j1DRh~X8xjpzY*gTl!vA7)9KsWEZ=NPdzj_nEH~?_Gt(e#@$sw5qkbc+0Uys8_eW=q zv_#lxGVt7)T#7zYl)1Zq46=zWhkV!9% zd&rUHK+b*s)Tk9I%p4qv{iu;bGJ`cuzBQ#~`pxu6oQY;u<+$Q?jYpBBE9xGDNM|&? z`XToVyD`3nOg|Q_-&}=9W)j7+DOzlXLepbXlkZ&mbR?5*xyrDpw z#5$*8aaDlSyq8V(-ZYFpM{4V|tIVM_=j`n3OF zE&ESXkwdIMo0|P;ZZsdZzM$a`WtnP^G5u*HJ5VypZN=0TM@xNaBZ7!lROo7L#R4Xu zUCI6g_@h}-A*!{72(Vuj#L9e1?9T+M$*+FuwH@Y{oI|rBLey%bk&b*D`v2F>-(Iyf zhLzQ@{Ud|EXt2_;$Jlf(&^dShdgC2a2d#9}fF;tO<44lQ%&+NEMzNaUL^ zffs8G6uk=-nTDA%3YEYt@IFeLTr=0^S9(Wz}3A0LYll>a7 zG3Mmrj$TKVrB~BEwwkHG6|`7*3Q=&+vyCC^_7_5{&P#d~KUe$kZqwOC6@p(J%=9Y4 zHl}=-I#^#RZK&~NH>6Bn`#sssn$2q-wL^9B3>_2Tmin5W5v0T-%+K;bgBdP&RJ`b^ zW%gjND1Ip&T-~A>eohR*CmX_NpWN_OO+dWffuiz4IW8GeAvnqAt=wHkGQ5YKYaxS@*)_QfN`Etf92rG}lUncJIa%{;N#(`NYQx*n2z5%x%vYgCX zZGO&NJ@?Q>O-UkeCL$3!#i!R(r}-}BFo#PjUpEv^sSq!*{2iIpEI#26jW8+8KhcaZUF2`g!i-Z{nh9G5XwQiPSad4#H9w_+`ndbazz z*`;&r0{t|I3-02MgfJE9w#!M-s9iSdq*_@@MiczG7)7=6B*bmu0tN={ktY!D3>?a* zjVBy3CyI_AgNMfs0HuH;sgC-$`Q{|A##cuRP=%Sa_>Qkjw0sNSiFiM!lIb!0qetZl z7DkvWrG33^I(9)Cf<59k4qYbMvDdg^{#@kp3ktU3bR}&Ut^mCO1jb)*`jsN8j>L1W zQ^_n$F0~V}*^EVJ4obv<$Tz-=;k1o9;dH8_`*FI=0i{Hoo+8&TA5gvm({=A<*S=C9<1=7E@zHjPiLIvRh+G9A-ugzcD`&^ zdfk$3biQ8&U3|PZZs0I3Por)BfK*u2Dti90V|gC|ouKs73%#llm@MN;AICb}o`*CL z7aYSF6a00Py6WNH+KJ7ai%ZaTN#e$Gf93w(v4th>S8_)G2JXfASFgv>@0}mB7cuLs zg$lsy8|O~5vkaqw?QSdUO1#n^H>(%X-&i_r+&`Hngj1koDxxn|SH z^{+L8zus=_4DIbrEsg(rd8t=lw!~Si_kg$l;N5ENV}cjh+X}A+rexrI**MgzC2?Fs zE=kkdtDG#s6Ij+@_0{~Lbmmg&aUA9KeCT?2Jj;HTv^u`}TEvh`|aZP@%%fz`FYU1BU4BFGuL_L`|bG0>vohh+sl=8m)VPQvR-YcD&2)Ccvv+M>Tlx*RLLJTJW>dQLT$%XRd5GiB6;Q*OyOfklPg#v*w#x z-=xygZcr*0NBis6t-j+N5VEbp<0pn)y>1%z-CmTrVW~ET4c;|<#Zhj{96-IVT0g~4 zY<)9qxbxz`j(oIE*_*w<-I;ZDaJdi--E_NgUn@Mb|1j+9tZjGcvRt7Zc*6rytCSkl zgdZJGGR<>gm_}FX1T3wTHq)Mz*KI->)Sl$rtkeo8pWzn0TEDi$Du_$Y2GBm!Yov>M z>2=f$>b*4VC@d^wlWu)W>py41if>QJvhcbI+$EN zd!C;iw@gPvU_((4EF-#_(`s|} zS}49CM?kOT)-A9B&esmFt!QuOp!4|diGimagdfXM6`sj~`!V>1;De2; z-<_-_8sSIbgF2(Yog;Qzd*8li$zLR z?+saZjaLOCWn^Y%%)XqxIfKsZ*1hIrqkr6|p)tX;Q^vievUO^iK&$eu?b`S?22FmU zx3Fu{eCH|{f77-OC0$z&>HT*w z%Tb5A2ELhP`+CNV`L`tf@N2P|8w?Bcd@gz+u$1ME@LDBnv1lq2jsomm;#`&O@V)rW z`1JV((H6M8UC@m2ZI_%j$L=4ZPY0G3ZI2#W8p_UkX0||Am__}3lp?fiX)>7 z%R3b9cA6YyMtpLSlkdJ-ZYc^BTVfkx%)NVx(=hV^O|x8A^Sfgu=)hsIl`R`>D1u zCJ73|kcdaga*{^ZF(quOT)Xx6LXP7Tz&8mgs=0HJnQOJ}rb~PRG@fNO9rsl;3p#qn z`sR~8EM)jWUC|uX_z)b#^#&*2X;R`ji!-Z5xdtbXBzcC3q<%4E)e?$*r zfIP49s={x4GJ&FmNl8~e7gN5A*qEkY`xI?ZBvHVf#clL80BBEFo)k~i1%_d)ftLYq zgvWVHo!Lh*erSgfBrz`c`A0!bI^QUEZ_N8irf0Y#|(x3`RI?kMjfy!%F`m}siAh9l*;vQl%_;VZN3 zQ}w>6I@TP8Tf`pPkV!`iSxY;W454M&O;eihZmn9bGnrwahON?|Pto=Oa^&$GzJiX6Tus~p zg^#(sSVkPIk!n5KE~Z!(pewt4N=8FjU18!pJ=jK+iB%&i$7EeeZV7s5ID?5VHh?Rg zF;kBYE1F+~2xOpiUW7_$1;-5`m?X@qswTV`UyoFt1xXv7-~(*D&ONHZ;*9WN3Os`t zY6{Xe3*$A&I-#0j-Azf&2!tiwQr{2B+*aFE(N&BDdzx^oft(%VZ;<*#W6a1NOd|2H z>0h@2IYc>}kQ!mzYL2P(#!%puyN&o2wy^YoTZpKGSQ=3BHu_q#n80A<5OG-=T;jb+ zW`LA_z8FdHr#p4AE^%lH$0gGw6QE3auwv62LipM+_Z0x-BAoly=$i{mkj-F#g3)l4CPV+DqpBjRZ*uzh%R7%#JY7uU_q4O^R0g57}U=b zBsD0UQ<4=K6V5D^c1Sd(k`MH_o2Vxvuq#8AMqf>6qf`XXN==-qdIVL?TQ2U0$WLDQ zz@X&J_!DY*mUcHY3^_eegx8*9&@b*l$5MH))N~^yA)D1RgsC-Z$Vfa!!&CZ45p1N0 zFV##_g{sPkJOHtw8d_q2D0|q{VGRHY4o2V5WXfo%F9ITVGJ$UtO(wJL4KeZ*zw+*e zbf`uof*?`Un8Bj<`%vV6^}Y_5D-9XDQ3YV(3HgGlPar$V)yx7&i9V~9_YR8SNM5Vz zvy8NwCP<{Diax>TWOyU7f`&@KgV-QNMO7s>$x(Mm)HGP9}T^|3i!|xJisGOpK4YzfiZNBZ8t(2=9(>gm>rEl&-$sZ3Dez_{}=R z0%d~^+-Z;~El?}0kEvBnlSAI}hIasPDfx1iq>fM42>=hc)P!^Nk01wGC>@m*x1X{| zeozV4Fv$|qI@3+X^f_afu6reN9L3Bdy> z;RR2cFRVJDwI;L0Q}vT5qXX^?yInz4w+^nOs)Yd^SJ`_nd$xu`{5Bm&gnbv|@I|H) z0+=iH6e|YgJwhdfzqZdI5z$XimW_cDL)pP-8CfPEREcBP2NXw3g#}av25qdRI?Dhw zI6fU5dU@!FTAm52GyAmJ8WxCA5^@S`qPH2KgwqsruLTZ=x;&q7fnrB4Yi=qALVyiX zjo((k`QIL{erPAB+cd&G^XDwN^PqFO59db%0N;$ z9C-bJFDGN51H}4To$V=Yq*>Ewcvyk~xNyGSI>T*LZ4HbtA3QBEx$&Cm@ah01ZbuFy zp8cFWGjdNr0Mu)$027@xF~;4&=#BIC6ugc|m9Rx%tj~lJDFJ2=F5OhF01DZONS&kX z2_jTF9HaEk6BieCC`st*`g$cdT(Zbq7vgz&d(w4az{dx!uG*ql*UU@aoo zz~10Z)7`cVbGIg0j4vtER8gbK28$CM`%4yJ-nU&e%N874zH0g?DdT?2kq(G$@Kx;n zdET7SGI*@&UEiR4>(Jw}6M8u^o4TRB#s`_B(pdU#o~B}yr*8-hbP;ydPkXYM3AuvT zcQUD}%bxg9Xp87^`{(J_Ky}>I&*p!; zuSrhy!abhgX|LdYG`$o}FgxUJSEe|=>Z^&vtGFkxXdZZFT* z@lJsMb8Z&;KZ#d+6GIEbKQgpKb7*SspV?b#OaK7Xe+vF3&hR@=d!{OGh0TW0fqvwr za@w9?aDs>#1FRm^6p;ZE6H6rgBWcC3Pm@+;B+`=CmI?}mA{y;0Gtaa*yx=qd>{Qmb z+s@C&VCFYOT-$t9O4&PLZV*8O{JJ$OBkl?7PC{kn%5M@yPQlFt)D}+(QKKC}v)%zD z5o+)2ycfA&I><@H_ytr$)!$K|KUVI8@HGV083!QmySP!+i}nZQjMVdEA#^Z8qErLr zo7nWYc#&vb6rjFx0ChsrSj3Os$@z*LyHSdDos~}qgDkzA%wJe_c-|?3-Ruq0`YE9u~-VW##~Dy{$FQFvJis8F%f5@Fe{PWNgG00oq6I?;c>ykw$m ztO6YGR!1RNUi1!J91Tz>Tc24yjuNcCKFj% zxrM!-Ayu#Yw3w9~Yv1NeyLg;-_GAt{6g>TnyiK+A9t)f45E`W{P|u+lfjDu*!Hk9% z9^(R#2aqzB&+~2eu+rb0S`no#AjXChAF6L88tN#-J5HkERhkJz zda&o$aH;ZOls4Y?_q)g8xZT0;X&W@H-{OS|)>rX6o)4dhFD|q@++J=^xNaG>k{=bX zN3ER`VbnI;oZqhdhimCJUmxeTJ%VzxA@QR@pfAX{ug|MM$ck$9!Mpf9xx;wFgH5aB zgn;rz1Z^HKMwa+C(}_ZHnl#N1ukgTWYyc~z@l^a@7=DWETsjj=QEvh2+b7u=qgfWI z2&IC@G24P4A|pG2XY(tcvWk^cIgw)qQ`j_{4=&}nq~$2&KoqLD9^+x_pC+$+@RhaU zMSC-K3(d4jw`mHbQ({JE*QcThxsmv^NN9p&Zzx&9ox8M#w-~K=2eBe$!V2K-fhVh( zwndU5k2tRElKxbBvM>kGX3(!r+UCDo96w;LrdGaONTp)76iRX z?F#q-wq^U9)WUg(u>VX)x?CIGEtm$+Dx@2I(djK93VLBRbztSOXdnO@?T*N*bNcXP zaQF+uh|Z1HRYIJ|n1*oAXtFndE}rAFk~4=WoJul2#}`zGuCac8f@Tc5#ZVh|`XL-m zD{45o0Jm}08Sss-fQD{(NJ8{!eFc63`rJjac~Ohe%;1pUYQ=S@?W>w{)+WX4dw_~i z6@5Hnz*~zGwM%^=F}kZEWpPS4_VY89mCmdhxH4Z!8(qv@W{(k znjGWSzdjqmCQ5kMB!2hp<#d;1RN>@1Ge(Tq5>z2@dGFE|P-Ubw01si8ZbHk@fJGu= zc%Tqf>qzyK1xx(_JH1AQO#pF0-Apz#(kcWOYKe{+CBzbt$@aq)`g?ka|P}9QG zrmDsOnZoHiTvQuj#w902qDr}}EF?^bw=!1(R~n&DQfxpp&BCUfe(G?=lafqjwmZ%= zwNP!OUZ@M)qMX*$w6Y*vccne%4`ILb; zQuW%Xdc|sua~&^|r7ux_7@Hym9xonRCS5DtLKw4Sw8I$+ z0Ih)!na%rNka)&*M|V306NExKQeY@5UU^3pOME?+!el(LpEg>~b`Nf(EA8~Hx8Vm& z<1i!W`pjvC?%75~)S`BfZ@R5Lfn$<4V_-s$r@7)d&?hEcJh(!FrbUn=Ed@`g?^a z$YI!m;^og7PV?I;Zc#_0X)9;H&+$2225i=OQO7icMDKTil`@IpB^IM2wfX4mh+x87 z(FA%Ftt0evg)ef)q}r_fkXu+`6_!Bo4f}VnVxz#wVt|h~o0Q2ZjR=$Tcz(et^oC-jRc7nw>@3~*WBmZr zBdL%}-FeekzE!As{jAgiS?l_k(Pw8&a{ zF~jY-Lpp4^>9Ioh*M>mzVG&k16~)<+PP;cDeJ!uz*%OBfw!2l2F^^U_-Uc4gzoe&*HuGqJkWhIksE%=1e9OE z6xYa_0&%_Fw(Bj7W$qf`;H`M=-e_*c)xzw}Ylb~~ugzf2xXZpTw%7WV6z}Nz3?^Dy zw6#X82(GH=t4a*RQYjZtUhSW z+sIfW9RuT$oW$^jyBv!={kr)ck?G0te3UjFX3Qqx^jbb0c1Yg&c7FP_i9{pp3HnQ7 z=E`n7bO|L5>B`k}P@u9az*)IT6a;YpsQ!V6*AGj68x#_gHm7vmBcUz&yv9cjxJOK+ z*_xEqnokcp9ykR71XS@03M@19RoR#2dX<>3b-vc=E^>;j8rB7##VAcx(CcMB>Zc&|1AgMUxH-%&g)qjjJMn?=BZ+EvU5gdxGaHt@ z>cYiZ4$l(bR&2-z6-0%1;Sf?ZoZ95{g$a=Ch9J?jnxDeZaMR_hiFj5E+-G+-2z_^V zbiWf)6CRY4jwXg2&X|2~@#(aEc|Hc#PZNIF>xx+>4kCj-48x-Uno+UAy zCYHd_&>mK`W1;O3Q^^K!)_p(dyJ$A{(s&kFauyqzd(lv4c}r#;83_M=*ZodlNG!`c zV|R_(F;VlnVkgyC;sX6#QG2*2Mjg~9{;p9-@nsyXkm6SX!+m>gS9$%3M&zM%)5K41 zFZcVOUT+V*L4}4Uge?5CJ_HuE) zJ{n%u#_!;>`T_wf8yx^bf-kIZW`*tdSo+X#TxIsy2_OPT_Klp&lFXP=lrNt$5yYI9 zex*i=N%pA4F|n8eDzuryXs>yA*W=-pIj%IG!9MZ3@$hIH$%q3IRmIKN)zeTIIZaZ! zXu9Wz!R=L2v@z|%2VsI_Kh7ho`VQ6Ev-1{;G*(=*F5tCi@bgsfY4i3noK1=fNFB6s ztMxZ{T@_GhiaFJ7_v6^RDYA(KaS$E**vDh}kCf&@-0-}#<6q?D3jRX53MF<4HUSez z4dr}-MTt3IY#T)%rGH#8l8dgfAA$)1O)UXww1YHpUnUyIVMw(?gAPuUBo?{ZXL4{FIMKC%^kuAk7g3ceiqh z93Kzw=r}&!nEq}=fmKsnXtSMqPb7iR6{kyYE82>$e ziif#`F8w$r)m(IEX#lHTj8Nqo8Op$xQg@?JQrxUd6^W^iG*zAoHiB!|d{C<%HI| zjRQoE#`ega5GSB|8KS@vFcbQ~-3no_dym2xz2i-xu(xu|nJiOM>9jv&M1;gJ!K(Sf z>KRxH4vg$R=$Bifav?`Z8F?Y!F;O>~#1XmDd9gCuR)N~2D1ve&lN-)k`zx_f2)9$L zkp7HjqzkG6g842?BZ7->;kj8XJW1<2-d!`DV7Jhlz=& z0>7vVXQxOJVSIZ(y6wNAF24JrfBc!CbtNbvRix6;Z;!XQPETM#2v`V#Ruvkh8k066 zfMWF<5lfLCvmZ;i9n(r{7CE7Z)RtH0iSxA2(7GcF)4&F3eBB`mLz(VRxyjKjjHS5I zs7=tms?h6`g&h+daeKn+pskwycz>gwb&)GQvL#_^0h1U4VGxDoMOm$3=dR>Rs&8*b zn9a+wW7sId28s|FBocn|Pp&AWw}WKZ*NjggAe+)(@@K{6fy|MM!J^^#C^q9>&fGpV z&y|OtZsyhi#TAEsY1r1Hh2Ex=n}AEF1If4chK>*00}wH9+p3meMT?&G+vyyZ0(rL5 zR^DbV#*z<|gytzSUVT&<77GxL;^fEw9(ZD~Z9-}9Ps~_sk_HroKBv|Th(IpCZ(Tyi zfeK;cFRjJ@60yasewk!#w|U8;qwP%zKryZJ(tE!Yqd#5@+ zeRuYO+JQDiLE*CD1fOV;kPFdcB*@}nT+kh%IdX*IVpqX>#<5VKxsY7?CyullaJSul zmurO@wP|ZE*Q8ozVJxDq3T|k)wewem*lirV{V9EwPhtvqhz{n2X;cC8Pgg)bSf@mx z^H@O`FlNF@0Y)SLL!)+bQ7BAMW#ZIgmxf{5Wiq~dCQ76nl=PH*R{Y+0x|zpqAtE7U z%6N>uAZv`t^P$;do#v=9Tyf1H((*%oT9Wg8@AW?T^*BuHiM)OWzb#Nhfv%`$yKUz6A^S}D9seSQ>0@;!oDqqk&E#D`ZYkZ4N?uyS>U7tFdSq_!D(3f&km zM``Pc-VK~$2?ky2mAMw3^^o(9OU>C^^jWnc3fv|O0xiYk^1#=YGz2Gq4H?!ic(f@y z)JQ%do0P2|H4UeoY+wtLG5fx!3X0r39b3FQ-vCCIa7Lu>918^n#dWs_?4nX7>| zq0@!Pp;(xP#qjP{*M-oH(S{9dznR{oy%?I9My&KwG| zS}b=RavCtRAb5t&iUctSqnQ5H6B0u!51)Np#`)+wYiA2^(H%fun$1{X;gjD zkhw(Fo)EIf-WXj!*3l{?^5i4r;RoJO>vL>z3oZakEooJ0l(1a5`W|oq_c;(fkjuHc z!xn88D4LwIALdTtlDa1lQKyKS=`)#mq~XDm%gpZpYZMM4J=d!1q&yoB8bDA#5Lmyo z_*e9t&}IX>n%jk}TH#xHz0!7XGn5(&U)X!m%2tO|(X-PXS;v1o=&ZfAJiEQUou7bH z5R&So`|#B<)@dg$PQTqMHh7jbB=HtvFSgt@J5l4i7nb`J z%@`|N&`rL<{sib}o-$%XG^fGYLYBExZZ&`O2HR!%nOu*0y!RKc>3?QqfPMb&v~3N| z|D>b=5)t9QeO}xCd;Ht(n8OfM+cJuYWDY&hN zngPkh1tl=@X8XBR(Nf$p%3kWe9ZRZmAG;p|-lY_-G=g1scmT|giN=0BL~62exQCpZ z^>m>V*`ouq-S_4uudEScvnN6kf_h-?cuGPfZl?oK%h6dmMCjI%0Tb4iCBGk77isVp zDG6>Zk22t*^M-Nvoz%XRcme)%E^r?f_0;?1dZBzSGXLg!sq=r%1D{I;+6pe#hIX2N zalPV4Eqmw@1RoNf;bR&V^^S5%sDQ$_6KSBI0V|jQOFf5~WFB9nfOG*-#AMlGkX9dX zHdXM#6DN$IMNE9@1UrvHVA|jku4d)hq_wWyVhAaJjyS?iNc3SZAY2nZ0Z;i=t+D&evvAz`d?;2v2Z?0&ke$ThlK?)xfd zeaPg*TDF?3-P6felG?GTsk!11H^5@Xv$uO@UM=Z3@_1f^Q__A{^h7T;7xcz|!HIhs zVxB84Mu1SwrS*z`kJGX@3sqNhi4SCPF3NR<3tZ!IPiL7O@hiHfeKv4YMjQ|b1>kR9 z>YqXRj0*rD0Kw-s)z|+qME_Foe;#RmEBF`1HIel{W6GaK{~URKBmQNy<$q!R`k(yY zjQu9t{;T}v)BZ01MZNuJC;ueh{uch1J@WsC{hNyWXKVlDi2jZ4_`I9{m(l+)M*oEW zNpbue&i(md^f&x}5gz|kRBmczzxoP)r z{LUxO_kY{M`zQQQy5iq(^8fh!Z}Q^5!2d7a&m#J_?f)d;{&}DNnS%S<>hM2-e<$Q* X#6f@0@1LA<1c0f}`>CDd_u2mk?Fezg literal 0 HcmV?d00001 diff --git a/src/main/resources/static/template/expelled/auditEntDoc.docx b/src/main/resources/static/template/expelled/auditEntDoc.docx new file mode 100644 index 0000000000000000000000000000000000000000..c23905c84671870666759f3668757867dabfccbe GIT binary patch literal 16368 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 mKd;l@SM>h28uCxz-|KsFlAwRwbqF66Gs0J9a_< literal 0 HcmV?d00001 diff --git a/src/main/resources/static/template/expelled/noticeEntDoc.docx b/src/main/resources/static/template/expelled/noticeEntDoc.docx new file mode 100644 index 0000000000000000000000000000000000000000..b86f6286b475af40999c8ec2df5fb0c505b0aef6 GIT binary patch literal 15636 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 jXT#<{R^dqg0sK$