Commit 27e184c9 authored by hcing's avatar hcing

feat(tcm): 风险报送 接口开发

parent 62e2ffcf
package com.yeejoin.amos.boot.module.tcm.api.dto;
import com.yeejoin.amos.boot.biz.common.dto.BaseDto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.yeejoin.amos.boot.biz.common.dto.BaseDto;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
......@@ -60,4 +61,7 @@ public class RiskProcessesDto extends BaseDto {
@ApiModelProperty(value = "创建人")
private String createUserName;
@ApiModelProperty(value = "风险处置单位/监管单位")
private String riskDisposalUnit;
}
package com.yeejoin.amos.boot.module.tcm.api.dto;
import com.yeejoin.amos.boot.biz.common.dto.BaseDto;
import com.yeejoin.amos.boot.module.tcm.api.entity.RiskProcesses;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
import java.util.List;
/**
* 风险报送表
......@@ -16,17 +18,20 @@ import java.util.Date;
*/
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(value="RiskReportDto", description="风险报送表")
public class RiskReportDto extends BaseDto {
@ApiModel(value = "RiskReportDto", description = "风险报送表")
public class RiskReportDto extends BaseDto {
private static final long serialVersionUID = 1L;
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "报送编号")
private String reportNo;
@ApiModelProperty(value = "风险类型")
private String riskType;
@ApiModelProperty(value = "风险类型code")
private String riskTypeCode;
@ApiModelProperty(value = "风险类型名称")
private String riskTypeName;
@ApiModelProperty(value = "报送单位seq")
private String reportCompanySeq;
......@@ -103,4 +108,22 @@ public class RiskReportDto extends BaseDto {
@ApiModelProperty(value = "创建人")
private String createUserName;
@ApiModelProperty(value = "登录人所在单位类型/监管supervision/企业company")
private String unitType;
@ApiModelProperty(value = "暂存or提交标志")
private Boolean submitFlag;
@ApiModelProperty(value = "报送单位Name-搜索用")
private String reportCompanyNameWithSearch;
@ApiModelProperty(value = "风险企业")
private String riskCompany;
@ApiModelProperty(value = "风险处置单位")
private String riskDisposalUnit;
@ApiModelProperty(value = "风险处置单位")
private List<RiskProcesses> riskProcesses;
}
......@@ -2,10 +2,9 @@ package com.yeejoin.amos.boot.module.tcm.api.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import com.yeejoin.amos.boot.biz.common.entity.BaseEntity;
import lombok.*;
import java.util.Date;
/**
......@@ -15,8 +14,10 @@ import java.util.Date;
* @date 2025-08-08
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("tzs_risk_processes")
public class RiskProcesses extends BaseEntity {
......
......@@ -2,10 +2,8 @@ package com.yeejoin.amos.boot.module.tcm.api.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity;
import com.yeejoin.amos.boot.biz.common.entity.BaseEntity;
import lombok.*;
import java.util.Date;
......@@ -16,8 +14,10 @@ import java.util.Date;
* @date 2025-08-08
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("tzs_risk_report")
public class RiskReport extends BaseEntity {
......@@ -30,10 +30,16 @@ public class RiskReport extends BaseEntity {
private String reportNo;
/**
* 风险类型
* 风险类型code 平台字典值 RISK_TYPE
*/
@TableField("risk_type")
private String riskType;
@TableField("risk_type_code")
private String riskTypeCode;
/**
* 风险类型name 平台字典值 RISK_TYPE
*/
@TableField("risk_type_name")
private String riskTypeName;
/**
* 报送单位seq
......
package com.yeejoin.amos.boot.module.tcm.api.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 处置方式-风险报送使用
*/
@Getter
@AllArgsConstructor
public enum DisposalMethodEnums {
CONFIRM_DISPOSAL("10001", "确认已处置", "情况说明"),
NOT_NEED_DISPOSAL("10002", "无需处置", "情况说明"),
ISSUED_DISPOSAL("10003", "下发整改", "整改意见"),
REPORT_DISPOSAL("10004", "整改上报", "整改情况"),
REPORT_FOR_WARDE("10005", "转办", "情况说明");
private final String code;
private final String name;
private final String title;
}
package com.yeejoin.amos.boot.module.tcm.api.enums;
import lombok.Getter;
/**
* 风险报告处理状态枚举
*/
@Getter
public enum RiskReportProcessStatus {
DRAFT("草稿"),
TO_HANDLE("待处理"),
TO_RECTIFY("待整改"),
TO_CONFIRM("待确认"),
COMPLETED("已办理");
private final String name;
RiskReportProcessStatus(String name) {
this.name = name;
}
/**
* 根据中文名称获取枚举
*/
public static RiskReportProcessStatus fromName(String name) {
for (RiskReportProcessStatus status : values()) {
if (status.name.equals(name)) {
return status;
}
}
return null;
}
}
package com.yeejoin.amos.boot.module.tcm.api.enums;
import lombok.Getter;
/**
* 风险报告状态枚举
*/
@Getter
public enum RiskReportStage {
/**
* 草稿状态
*/
DRAFT("草稿"),
/**
* 监管处置
*/
SUPERVISION("监管处置"),
/**
* 企业整改
*/
COMPANY_RECTIFICATION("企业整改");
private final String name;
RiskReportStage(String name) {
this.name = name;
}
/**
* 根据中文名称获取枚举
*/
public static RiskReportStage fromName(String name) {
for (RiskReportStage status : values()) {
if (status.name.equals(name)) {
return status;
}
}
return null;
}
}
\ No newline at end of file
package com.yeejoin.amos.boot.module.tcm.api.enums;
public enum RiskUnitType {
DISPOSAL("处置单位"), // 处置单位
RECTIFICATION("整改单位"); // 整改单位
private final String label;
RiskUnitType(String label) {
this.label = label;
}
public String getLabel() {
return label;
}
/**
* 通过中文名称查找枚举
*/
public static RiskUnitType fromLabel(String label) {
for (RiskUnitType type : values()) {
if (type.label.equals(label)) {
return type;
}
}
throw new IllegalArgumentException("未知的单位类型: " + label);
}
}
......@@ -2,8 +2,10 @@ package com.yeejoin.amos.boot.module.tcm.api.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yeejoin.amos.boot.module.tcm.api.dto.RiskReportDto;
import com.yeejoin.amos.boot.module.tcm.api.entity.RiskReport;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.Map;
......@@ -18,4 +20,12 @@ public interface RiskReportMapper extends BaseMapper<RiskReport> {
Page<Map<String, String>> allAgencyWithPage(@Param("page") Page<Map<String, String>> page,
@Param("isAdmin") boolean isAdmin,
@Param("companyName") String companyName);
Page<RiskReport> queryForRiskReportPage(@Param("page") Page<RiskReport> page,
@Param("dto") RiskReportDto reportDto);
Map<String, String> getCompanyBySeq(@Param("companySeq") String companySeq);
@Select("select risk_disposal_unit_org_code from tzs_risk_report where sequence_nbr = #{sequenceNbr}")
String getRiskDisposalUnitOrgCode(Long sequenceNbr);
}
......@@ -2,6 +2,9 @@ package com.yeejoin.amos.boot.module.tcm.api.service;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yeejoin.amos.boot.module.tcm.api.dto.RiskProcessesDto;
import com.yeejoin.amos.boot.module.tcm.api.dto.RiskReportDto;
import com.yeejoin.amos.boot.module.tcm.api.entity.RiskReport;
import com.yeejoin.amos.feign.systemctl.model.DictionarieValueModel;
import java.util.List;
......@@ -20,4 +23,14 @@ public interface IRiskReportService {
JSONObject superviseOrgForEnter(String enterSeq);
List<DictionarieValueModel> riskTypeByPermission();
Page<RiskReport> queryForRiskReportPage(RiskReportDto reportDto, int current, int size);
RiskReport saveOrUpdateReport(RiskReportDto dto);
RiskReportDto selectRiskDetail(Long sequenceNbr);
Boolean forWardeBySeq(Long riskReportSeq, RiskProcessesDto riskProcessesDto);
List<String> permissionButton(Long sequenceNbr);
}
......@@ -2,6 +2,15 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yeejoin.amos.boot.module.tcm.api.mapper.RiskReportMapper">
<select id="getCompanyBySeq" resultType="java.util.Map">
SELECT sequence_nbr AS "companySeq",
company_code AS "companyCode",
company_name AS "companyName",
org_code AS "companyOrgCode"
FROM privilege_company
WHERE sequence_nbr = #{companySeq}
</select>
<select id="allAgencyWithPage" resultType="java.util.Map">
SELECT
sequence_nbr AS "key",
......@@ -21,4 +30,91 @@
sequence_nbr
</select>
<sql id="baseSelectForRiskReport">
SELECT sequence_nbr,
is_delete,
report_no,
risk_type_code,
risk_type_name,
report_company_seq,
report_company_name,
risk_company_seq,
risk_company_name,
risk_disposal_unit_seq,
risk_disposal_unit_name,
risk_disposal_unit_org_code,
all_risk_disposal_unit_org_code,
risk_equip_record,
operation_user_id,
risk_main_title,
risk_main_content,
report_user_id,
report_user_name,
report_user_phone,
current_stage,
current_status,
end_date,
create_date,
create_user_id
</sql>
<select id="queryForRiskReportPage" resultType="com.yeejoin.amos.boot.module.tcm.api.entity.RiskReport">
select * FROM
(
SELECT * FROM (
-- 风险单位
<include refid="baseSelectForRiskReport"/>
FROM tzs_risk_report AS rr1
WHERE rr1."risk_company_code" = #{dto.riskCompanyCode}
UNION
-- 报送单位(排除草稿)
<include refid="baseSelectForRiskReport"/>
FROM tzs_risk_report AS rr2
WHERE rr2."report_company_code" = #{dto.reportCompanyCode}
AND rr2."current_status" != '草稿'
<!-- 处置单位 -->
<if test='dto.unitType != null and dto.unitType != "" and dto.unitType == "supervision"'>
UNION
<include refid="baseSelectForRiskReport"/>
FROM tzs_risk_report AS rr3
WHERE rr3."all_risk_disposal_unit_org_code" like CONCAT('%', #{dto.riskDisposalUnitOrgCode}, '%')
</if>
<!-- 自己的草稿状态 -->
<if test='dto.createUserId != null and dto.createUserId != ""'>
UNION
<include refid="baseSelectForRiskReport"/>
FROM tzs_risk_report AS rr4
WHERE rr4."create_user_id" = #{dto.createUserId}
AND rr4."current_status" = '草稿'
</if>
) AS temp
<where>
temp."is_delete" = 'f'
<if test="dto.riskTypeCode != null and dto.riskTypeCode != ''">
AND temp."risk_type_code" = #{dto.riskTypeCode}
</if>
<if test="dto.currentStatus != null and dto.currentStatus != ''">
AND temp."current_status" = #{dto.currentStatus}
</if>
<if test="dto.riskMainTitle != null and dto.riskMainTitle != ''">
AND temp."risk_main_title" LIKE CONCAT('%', #{dto.riskMainTitle}, '%')
</if>
<if test="dto.reportCompanyNameWithSearch != null and dto.reportCompanyNameWithSearch != ''">
AND temp."report_company_name" LIKE CONCAT('%', #{dto.reportCompanyNameWithSearch}, '%')
</if>
<if test="dto.riskCompanyName != null and dto.riskCompanyName != ''">
AND temp."risk_company_name" LIKE CONCAT('%', #{dto.riskCompanyName}, '%')
</if>
<if test="dto.riskDisposalUnitName != null and dto.riskDisposalUnitName != ''">
AND temp."risk_disposal_unit_name" LIKE CONCAT('%', #{dto.riskDisposalUnitName}, '%')
</if>
</where>
) as t
ORDER BY t."create_date" DESC
</select>
</mapper>
......@@ -3,6 +3,8 @@ package com.yeejoin.amos.boot.module.tcm.biz.controller;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yeejoin.amos.boot.biz.common.controller.BaseController;
import com.yeejoin.amos.boot.module.tcm.api.dto.RiskProcessesDto;
import com.yeejoin.amos.boot.module.tcm.api.dto.RiskReportDto;
import com.yeejoin.amos.boot.module.tcm.api.entity.RiskReport;
import com.yeejoin.amos.boot.module.tcm.api.service.IRiskReportService;
import com.yeejoin.amos.feign.systemctl.model.DictionarieValueModel;
......@@ -15,7 +17,6 @@ import org.typroject.tyboot.core.restful.doc.TycloudOperation;
import org.typroject.tyboot.core.restful.utils.ResponseHelper;
import org.typroject.tyboot.core.restful.utils.ResponseModel;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
......@@ -67,47 +68,34 @@ public class RiskReportController extends BaseController {
}
/**
* 新增
* 风险报送列表分页查询
*
* @return
*/
@TycloudOperation(ApiLevel = UserType.AGENCY)
@PostMapping(value = "/save")
@ApiOperation(httpMethod = "POST", value = "新增", notes = "新增")
public ResponseModel<RiskReport> save(@RequestBody RiskReport entity) {
// entity = riskReportServiceImpl.createWithModel(entity);
return ResponseHelper.buildResponse(entity);
}
/**
* 根据sequenceNbr更新
*
* @param sequenceNbr 主键
* @return
* @param current 当前页
* @param size 每页大小
* @return result
*/
@TycloudOperation(ApiLevel = UserType.AGENCY)
@PutMapping(value = "/{sequenceNbr}")
@ApiOperation(httpMethod = "PUT", value = "根据sequenceNbr更新", notes = "根据sequenceNbr更新")
public ResponseModel<RiskReport> updateBySequenceNbrRiskReport(@RequestBody RiskReport entity, @PathVariable(value = "sequenceNbr") Long sequenceNbr) {
entity.setSequenceNbr(sequenceNbr);
return ResponseHelper.buildResponse(null);
@PostMapping(value = "/page")
@ApiOperation(httpMethod = "POST", value = "分页查询", notes = "分页查询")
public ResponseModel<Page<RiskReport>> queryForRiskReportPage(@RequestParam(value = "current") int current,
@RequestParam(value = "size") int size,
@RequestBody RiskReportDto reportDto) {
;
return ResponseHelper.buildResponse(iRiskReportService.queryForRiskReportPage(reportDto, current, size));
}
/**
* 根据sequenceNbr删除
*
* @param sequenceNbr 主键
* @return
* 风险上报 新增
*/
@TycloudOperation(ApiLevel = UserType.AGENCY)
@DeleteMapping(value = "/{sequenceNbr}")
@ApiOperation(httpMethod = "DELETE", value = "根据sequenceNbr删除", notes = "根据sequenceNbr删除")
public ResponseModel<Boolean> deleteBySequenceNbr(HttpServletRequest request, @PathVariable(value = "sequenceNbr") Long sequenceNbr) {
return ResponseHelper.buildResponse(null);
@PostMapping(value = "/saveOrUpdateReport")
@ApiOperation(httpMethod = "POST", value = "风险上报", notes = "风险上报")
public ResponseModel<RiskReport> saveOrUpdateReport(@RequestBody RiskReportDto dto) {
return ResponseHelper.buildResponse(iRiskReportService.saveOrUpdateReport(dto));
}
/**
* 根据sequenceNbr查询
* 根据sequenceNbr查询详情
*
* @param sequenceNbr 主键
* @return
......@@ -115,37 +103,30 @@ public class RiskReportController extends BaseController {
@TycloudOperation(ApiLevel = UserType.AGENCY)
@GetMapping(value = "/{sequenceNbr}")
@ApiOperation(httpMethod = "GET", value = "根据sequenceNbr查询单个", notes = "根据sequenceNbr查询单个")
public ResponseModel<RiskReport> selectOne(@PathVariable Long sequenceNbr) {
return ResponseHelper.buildResponse(null);
public ResponseModel<RiskReportDto> selectRiskDetail(@PathVariable Long sequenceNbr) {
return ResponseHelper.buildResponse(iRiskReportService.selectRiskDetail(sequenceNbr));
}
/**
* 列表分页查询
*
* @param current 当前页
* @param current 每页大小
* @return
* 转办
*/
@TycloudOperation(ApiLevel = UserType.AGENCY)
@GetMapping(value = "/page")
@ApiOperation(httpMethod = "GET", value = "分页查询", notes = "分页查询")
public ResponseModel<Page<RiskReport>> queryForPage(@RequestParam(value = "current") int current, @RequestParam
(value = "size") int size) {
Page<RiskReport> page = new Page<RiskReport>();
page.setCurrent(current);
page.setSize(size);
return ResponseHelper.buildResponse(null);
@PutMapping(value = "/forWarde/{sequenceNbr}")
@ApiOperation(httpMethod = "PUT", value = "转办", notes = "转办")
public ResponseModel<Boolean> forWardeBySeq(@PathVariable Long sequenceNbr,
@RequestBody RiskProcessesDto riskProcessesDto) {
return ResponseHelper.buildResponse(iRiskReportService.forWardeBySeq(sequenceNbr, riskProcessesDto));
}
/**
* 列表全部数据查询
*
* @return
* 风险详情中的按钮权限(保存/保存提交/转办/处置/提交整改)
*/
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(httpMethod = "GET", value = "列表全部数据查询", notes = "列表全部数据查询")
@GetMapping(value = "/list")
public ResponseModel<List<RiskReport>> selectForList() {
return ResponseHelper.buildResponse(null);
@PutMapping(value = "/permissionButton/{sequenceNbr}")
@ApiOperation(httpMethod = "PUT", value = "风险详情中的按钮权限", notes = "风险详情中的按钮权限")
public ResponseModel<List<String>> permissionButton(@PathVariable(value = "sequenceNbr") Long sequenceNbr) {
return ResponseHelper.buildResponse(iRiskReportService.permissionButton(sequenceNbr));
}
}
package com.yeejoin.amos.boot.module.tcm.biz.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yeejoin.amos.boot.biz.common.bo.CompanyBo;
import com.yeejoin.amos.boot.biz.common.bo.ReginParams;
import com.yeejoin.amos.boot.biz.common.controller.BaseController;
import com.yeejoin.amos.boot.biz.common.utils.RedisKey;
import com.yeejoin.amos.boot.biz.common.utils.RedisUtils;
import com.yeejoin.amos.boot.biz.common.utils.SnowflakeIdUtil;
import com.yeejoin.amos.boot.module.tcm.api.dto.RiskProcessesDto;
import com.yeejoin.amos.boot.module.tcm.api.dto.RiskReportDto;
import com.yeejoin.amos.boot.module.tcm.api.entity.RiskProcesses;
import com.yeejoin.amos.boot.module.tcm.api.entity.RiskReport;
import com.yeejoin.amos.boot.module.tcm.api.enums.PersonManageRoleEnum;
import com.yeejoin.amos.boot.module.tcm.api.enums.*;
import com.yeejoin.amos.boot.module.tcm.api.mapper.RiskReportMapper;
import com.yeejoin.amos.boot.module.tcm.api.service.IRiskReportService;
import com.yeejoin.amos.feign.privilege.Privilege;
......@@ -13,14 +24,27 @@ import com.yeejoin.amos.feign.privilege.model.CompanyModel;
import com.yeejoin.amos.feign.systemctl.Systemctl;
import com.yeejoin.amos.feign.systemctl.model.DictionarieValueModel;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.BeanUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.rdbms.service.BaseService;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
/**
* 风险报送表服务实现类
......@@ -28,6 +52,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
* @author system_generator
* @date 2025-08-08
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class RiskReportServiceImpl extends BaseService<RiskReport, RiskReport, RiskReportMapper> implements IRiskReportService {
......@@ -36,24 +61,29 @@ public class RiskReportServiceImpl extends BaseService<RiskReport, RiskReport, R
* 风险类型
*/
public static final String RISK_TYPE = "RISK_TYPE";
private static final String LOCK_KEY = "lock:sequence:risk";
private static final String SEQUENCE_TYPE_AF = "%03d";
private static final String SEQUENCE_KEY = "SXBS";
public static final String COMPANY_CODE = "companyCode";
public static final String COMPANY_NAME = "companyName";
public static final String COMPANY_ORG_CODE = "companyOrgCode";
public static final String COMPANY_SEQ = "companySeq";
private final SnowflakeIdUtil sequence;
private final RedisUtils redisUtils;
private final RiskReportMapper riskReportMapper;
private final RiskProcessesServiceImpl riskProcessesService;
private final RedissonClient redissonClient;
private final RedisTemplate<String, String> redisTemplate;
/**
* 分页查询
*/
public Page<RiskReport> queryForRiskReportPage(Page<RiskReport> page) {
return this.queryForPage(page, null, false);
}
/**
* 列表查询 示例
* @return 当前登录用户信息
*/
public List<RiskReport> queryForRiskReportList() {
return this.queryForList("", false);
protected ReginParams getSelectedOrgInfo() {
return JSONObject.parseObject(redisUtils.get(RedisKey.buildReginKey(RequestContext.getExeUserId(), RequestContext.getToken())).toString(), ReginParams.class);
}
private final RedisUtils redisUtils;
private final RiskReportMapper riskReportMapper;
/**
* 包含全部监管机构及企业的分页列表
*
......@@ -110,4 +140,246 @@ public class RiskReportServiceImpl extends BaseService<RiskReport, RiskReport, R
// 无报送权限
return Collections.emptyList();
}
/**
* 分页查询
*/
public Page<RiskReport> queryForRiskReportPage(RiskReportDto reportDto, int current, int size) {
Page<RiskReport> page = new Page<>();
page.setCurrent(current);
page.setSize(size);
CompanyBo company = getSelectedOrgInfo().getCompany();
if (company.getLevel().equals(BaseController.COMPANY_TYPE_COMPANY)) {
reportDto.setUnitType(BaseController.COMPANY_TYPE_COMPANY);
} else {
reportDto.setUnitType(BaseController.COMPANY_TYPE_SUPERVISION);
}
reportDto.setReportCompanyCode(company.getCompanyCode());
reportDto.setRiskCompanyCode(company.getCompanyCode());
reportDto.setRiskDisposalUnitOrgCode(company.getCompanyCode());
reportDto.setCreateUserId(RequestContext.getExeUserId());
return riskReportMapper.queryForRiskReportPage(page, reportDto);
}
/**
* 风险上报
*/
@Override
@Transactional(rollbackFor = Exception.class)
public RiskReport saveOrUpdateReport(RiskReportDto dto) {
CompanyBo company = getSelectedOrgInfo().getCompany();
AgencyUserModel userModel = getSelectedOrgInfo().getUserModel();
Date now = new Date();
Boolean submitFlag = dto.getSubmitFlag();
String[] riskCompany = dto.getRiskCompany().split("_");
Map<String, String> riskCompanyMap = this.getCompanyBySeq(riskCompany[0]);
String[] riskDisposalUnit = dto.getRiskDisposalUnit().split("_");
Map<String, String> riskDisposalUnitMap = this.getCompanyBySeq(riskDisposalUnit[0]);
RiskReport riskReport = RiskReport.builder()
.reportNo(ObjectUtils.isEmpty(dto.getSequenceNbr()) ? generateReportNo() : null)
.riskTypeCode(dto.getRiskTypeCode())
.riskTypeName(getRiskTypeNameByCode(dto.getRiskTypeCode()))
.reportCompanySeq(company.getSequenceNbr().toString())
.reportCompanyCode(company.getCompanyCode())
.reportCompanyName(company.getCompanyName())
.riskCompanySeq(String.valueOf(riskCompanyMap.get(COMPANY_SEQ)))
.riskCompanyCode(riskCompanyMap.get(COMPANY_CODE))
.riskCompanyName(riskCompanyMap.get(COMPANY_NAME))
.riskDisposalUnitSeq(String.valueOf(riskDisposalUnitMap.get(COMPANY_SEQ)))
.riskDisposalUnitCode(riskDisposalUnitMap.get(COMPANY_CODE))
.riskDisposalUnitName(riskDisposalUnitMap.get(COMPANY_NAME))
.riskDisposalUnitOrgCode(riskDisposalUnitMap.get(COMPANY_ORG_CODE))
.allRiskDisposalUnitOrgCode(this.buildAllRiskDisposalUnitOrgCode(riskDisposalUnitMap.get(COMPANY_ORG_CODE), dto.getSequenceNbr()))
.riskEquipRecord(null)
.operationUserId(userModel.getUserId())
.riskMainTitle(dto.getRiskMainTitle())
.riskMainContent(dto.getRiskMainContent())
.riskMainFile(ObjectUtils.isEmpty(dto.getRiskMainFile()) ? null : JSONObject.toJSONString(JSONArray.parseObject(dto.getRiskMainFile())))
.reportUserId(userModel.getUserId())
.reportUserName(userModel.getRealName())
.reportUserPhone(userModel.getLandlinePhone())
.currentStage(submitFlag ? RiskReportStage.SUPERVISION.getName() : RiskReportStage.DRAFT.getName())
.currentStatus(submitFlag ? RiskReportProcessStatus.TO_HANDLE.getName() : RiskReportProcessStatus.DRAFT.getName())
.createDate(now)
.createUserId(userModel.getUserId())
.createUserName(userModel.getRealName())
.build();
riskReport.setSequenceNbr(ObjectUtils.isEmpty(dto.getSequenceNbr()) ? sequence.nextId() : dto.getSequenceNbr());
riskReport.setIsDelete(Boolean.FALSE);
this.saveOrUpdate(riskReport);
return riskReport;
}
private String buildAllRiskDisposalUnitOrgCode(String defaultOrgCode, Long sequenceNbr) {
if (!ObjectUtils.isEmpty(sequenceNbr)) {
String riskDisposalUnitOrgCode = riskReportMapper.getRiskDisposalUnitOrgCode(sequenceNbr);
String collect = Arrays.stream(riskDisposalUnitOrgCode.split(","))
.filter(item -> !item.equals(defaultOrgCode))
.collect(Collectors.joining(","));
return defaultOrgCode + "," + collect;
}
return defaultOrgCode;
}
private String getRiskTypeNameByCode(String riskTypeCode) {
List<DictionarieValueModel> riskType = Systemctl.dictionarieClient.dictValues("RISK_TYPE").getResult();
return riskType.stream()
.filter(item -> item.getDictDataKey().equals(riskTypeCode))
.findFirst()
.map(DictionarieValueModel::getDictDataValue)
.orElse(null);
}
private Map<String, String> getCompanyBySeq(String companySeq) {
return riskReportMapper.getCompanyBySeq(companySeq);
}
public String generateReportNo() {
String prefix = SEQUENCE_KEY + LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
RLock lock = redissonClient.getLock(LOCK_KEY);
try {
if (lock.tryLock(10, TimeUnit.SECONDS)) {
ValueOperations<String, String> ops = redisTemplate.opsForValue();
String seqStr = ops.get(SEQUENCE_KEY);
long seq = (seqStr != null) ? Long.parseLong(seqStr) : 0L;
seq++;
ops.set(SEQUENCE_KEY, String.valueOf(seq));
// 设置当天23:59:59过期
long expireMillis = calculateEndOfDay(new Date()).getTime() - System.currentTimeMillis();
redisTemplate.expire(SEQUENCE_KEY, expireMillis, TimeUnit.MILLISECONDS);
String reportNo = prefix + String.format(SEQUENCE_TYPE_AF, seq);
log.info("生成报表编号:{}", reportNo);
return reportNo;
} else {
throw new RuntimeException("获取锁失败,无法生成报表编号");
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new RuntimeException("线程中断异常", e);
} finally {
if (lock.isHeldByCurrentThread()) {
lock.unlock();
log.info("释放锁");
}
}
}
private static Date calculateEndOfDay(Date date) {
LocalDateTime endOfDay = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault())
.with(LocalTime.MAX);
return Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant());
}
@Override
public RiskReportDto selectRiskDetail(Long sequenceNbr) {
RiskReport riskReport = this.baseMapper.selectOne(new LambdaQueryWrapper<RiskReport>()
.select(RiskReport::getSequenceNbr,
RiskReport::getReportNo,
RiskReport::getRiskTypeCode,
RiskReport::getRiskTypeName,
RiskReport::getReportCompanySeq,
RiskReport::getReportCompanyName,
RiskReport::getRiskCompanySeq,
RiskReport::getRiskCompanyName,
RiskReport::getRiskDisposalUnitSeq,
RiskReport::getRiskDisposalUnitName,
RiskReport::getRiskDisposalUnitOrgCode,
RiskReport::getAllRiskDisposalUnitOrgCode,
RiskReport::getRiskEquipRecord,
RiskReport::getOperationUserId,
RiskReport::getRiskMainContent,
RiskReport::getRiskMainTitle,
RiskReport::getRiskMainFile,
RiskReport::getReportUserId,
RiskReport::getReportUserName,
RiskReport::getCurrentStatus,
RiskReport::getEndDate,
RiskReport::getCreateDate,
RiskReport::getCreateUserId,
RiskReport::getCreateUserName
)
.eq(RiskReport::getSequenceNbr, sequenceNbr));
List<RiskProcesses> riskProcesses = riskProcessesService.getBaseMapper().selectList(new LambdaQueryWrapper<RiskProcesses>()
// 排除转办的记录
// .ne(RiskProcesses::getDisposalWayCode, DisposalMethodEnums.REPORT_FOR_WARDE.getCode())
.eq(RiskProcesses::getRiskReportSeq, sequenceNbr)
.eq(RiskProcesses::getIsDelete, Boolean.FALSE)
.orderByAsc(RiskProcesses::getCreateDate));
RiskReportDto riskReportDto = new RiskReportDto();
BeanUtils.copyProperties(riskReport, riskReportDto);
riskReportDto.setRiskProcesses(riskProcesses);
riskReportDto.setRiskCompany(riskReport.getRiskCompanySeq() + "_" + riskReport.getRiskCompanyName());
riskReportDto.setRiskDisposalUnit(riskReport.getRiskDisposalUnitSeq() + "_" + riskReport.getRiskDisposalUnitName());
return riskReportDto;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean forWardeBySeq(Long riskReportSeq, RiskProcessesDto riskProcessesDto) {
ReginParams selectedOrgInfo = getSelectedOrgInfo();
AgencyUserModel userModel = selectedOrgInfo.getUserModel();
CompanyBo company = getSelectedOrgInfo().getCompany();
String riskDisposalUnitSeq = riskProcessesDto.getRiskDisposalUnit().split("_")[0];
Map<String, String> riskDisposalUnit = riskReportMapper.getCompanyBySeq(riskDisposalUnitSeq);
String riskDisposalUnitOrgCode = riskDisposalUnit.get(COMPANY_ORG_CODE);
String riskDisposalUnitCode = riskDisposalUnit.get(COMPANY_CODE);
String riskDisposalUnitName = riskDisposalUnit.get(COMPANY_NAME);
String allRiskDisposalUnitOrgCode = buildAllRiskDisposalUnitOrgCode(riskDisposalUnitOrgCode, riskReportSeq);
this.update(new LambdaUpdateWrapper<RiskReport>().eq(RiskReport::getSequenceNbr, riskReportSeq)
.set(RiskReport::getRiskDisposalUnitSeq, riskDisposalUnitSeq)
.set(RiskReport::getRiskDisposalUnitName, riskDisposalUnitName)
.set(RiskReport::getRiskDisposalUnitCode, riskDisposalUnitCode)
.set(RiskReport::getAllRiskDisposalUnitOrgCode, allRiskDisposalUnitOrgCode));
RiskProcesses processes = RiskProcesses.builder()
.riskReportSeq(riskReportSeq.toString())
.unitType(RiskUnitType.DISPOSAL.getLabel())
.disposalWayCode(DisposalMethodEnums.REPORT_FOR_WARDE.getCode())
.disposalWayName(DisposalMethodEnums.REPORT_FOR_WARDE.getName())
.disposalContent(riskProcessesDto.getDisposalContent())
.operationCompanySeq(company.getSequenceNbr().toString())
.operationCompanyName(company.getCompanyName())
.operationUserId(userModel.getUserId())
.operationUserName(userModel.getUserName())
.createDate(new Date())
.createUserId(userModel.getUserId())
.createUserName(userModel.getRealName())
.build();
return riskProcessesService.save(processes);
}
/**
* 风险详情中的按钮权限(保存/保存提交/转办/处置/提交整改)根据业务状态走
*/
@Override
public List<String> permissionButton(Long sequenceNbr) {
CompanyBo company = getSelectedOrgInfo().getCompany();
RiskReport riskReport = this.getById(sequenceNbr);
String currentStatus = riskReport.getCurrentStatus();
String riskDisposalUnitCode = riskReport.getRiskDisposalUnitCode();
String riskCompanyCode = riskReport.getRiskCompanyCode();
// 草稿
if (currentStatus.equals(RiskReportProcessStatus.DRAFT.getName())) {
return Arrays.asList("存草稿", "提交风险");
}
// 待处理 + 当前单位是处置单位
if (currentStatus.equals(RiskReportProcessStatus.TO_HANDLE.getName()) && company.getCompanyCode().equals(riskDisposalUnitCode)) {
return Arrays.asList("转办", "处置");
}
// 待整改 + 当前单位是风险单位
if (currentStatus.equals(RiskReportProcessStatus.TO_RECTIFY.getName()) && company.getCompanyCode().equals(riskCompanyCode)) {
return Collections.singletonList("提交整改");
}
// 待确认 + 当前单位是处置单位
if (currentStatus.equals(RiskReportProcessStatus.TO_CONFIRM.getName()) && company.getCompanyCode().equals(riskDisposalUnitCode)) {
return Arrays.asList("转办", "处置");
}
// 已办理 or 其他情况
return Collections.emptyList();
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment