diff --git a/docs/db/phase2/init-phase2.sql b/docs/db/phase2/init-phase2.sql index dbd5dfde..168d8e41 100644 --- a/docs/db/phase2/init-phase2.sql +++ b/docs/db/phase2/init-phase2.sql @@ -772,6 +772,55 @@ create table `eval_sign_record` ( ) engine=innodb default charset=utf8mb4 collate=utf8mb4_0900_ai_ci comment='项目签字记录表'; +CREATE TABLE IF NOT EXISTS `qual_on_site_review` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增主键', + `biz_type` varchar(64) DEFAULT NULL COMMENT '资质类型:add 新增 ,change:变更', + `biz_id` bigint DEFAULT NULL COMMENT '业务id', + `org_id` bigint NOT NULL COMMENT '受审查机构ID (关联机构表)', + `review_date_start` datetime NOT NULL COMMENT '现场审查开始时间', + `review_location` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '审查地点', + `review_members` varchar(512) DEFAULT NULL COMMENT '审查组成员名单', + `material_requirements` text COMMENT '材料准备要求', + `supervisor_contact` varchar(64) DEFAULT NULL COMMENT '监管联系人姓名', + `contact_phone` varchar(32) DEFAULT NULL COMMENT '监管联系电话', + `status` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '1' COMMENT '现场审查状态(AGENCY_PENDING_CONFIRMATION机构待确认、AGENCY_CONFIRMED机构已确认、REVIEW_PASSED核查通过、REVIEW_FAILED核查不通过)', + `review_opinion` varchar(256) DEFAULT NULL COMMENT '核查意见', + `delete_enum` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '删除标识true false', + `remarks` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '备注', + `create_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '创建人姓名', + `update_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '更新人姓名', + `tenant_id` bigint DEFAULT NULL COMMENT '租户id', + `version` int DEFAULT NULL COMMENT '版本', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '修改时间', + `create_id` bigint DEFAULT NULL COMMENT '创建人id', + `update_id` bigint DEFAULT NULL COMMENT '修改人id', + `env` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '环境', + PRIMARY KEY (`id`), + KEY `idx_review_date_start` (`review_date_start`), + KEY `idx_org_id` (`org_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='资质现场核查'; + +CREATE TABLE IF NOT EXISTS `qual_on_site_review_file` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增主键', + `qual_on_site_review_id` bigint NOT NULL COMMENT '资质现场核查id', + `file_name` varchar(128) NOT NULL COMMENT '文件名称', + `file_url` varchar(1024) NOT NULL COMMENT '文件url', + `delete_enum` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '删除标识true false', + `remarks` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '备注', + `create_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '创建人姓名', + `update_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '更新人姓名', + `tenant_id` bigint DEFAULT NULL COMMENT '租户id', + `version` int DEFAULT NULL COMMENT '版本', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '修改时间', + `create_id` bigint DEFAULT NULL COMMENT '创建人id', + `update_id` bigint DEFAULT NULL COMMENT '修改人id', + `env` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '环境', + PRIMARY KEY (`id`), + KEY `idx_qual_on_site_review_id` (`qual_on_site_review_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='资质现场核查-文件信息'; + set foreign_key_checks = 1; -- ============================================= diff --git a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/config/WpsFilter.java b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/config/WpsFilter.java new file mode 100644 index 00000000..f727bd59 --- /dev/null +++ b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/config/WpsFilter.java @@ -0,0 +1,121 @@ +package org.qinan.safetyeval.adapter.config; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.Ordered; +import org.springframework.util.StringUtils; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + */ +@Slf4j +@Configuration +public class WpsFilter extends OncePerRequestFilter { + + private static final String WPS_TOKEN_HEADER = "X-Weboffice-Token"; + private static final String AUTH_TOKEN_HEADER = "token"; + private static final String AUTH_TOKEN_PREFIX = "jjb-saas-auth:oauth:"; + + @Bean + public FilterRegistrationBean wpsFilterRegistration() { + FilterRegistrationBean bean = new FilterRegistrationBean<>(); + bean.setFilter(this); + bean.setOrder(Ordered.HIGHEST_PRECEDENCE); + bean.addUrlPatterns("/safetyEval-h5/wsp/*"); + bean.setName("wpsFilter"); + return bean; + } + + @Override + protected boolean shouldNotFilter(HttpServletRequest request) { + String uri = request.getRequestURI(); + return uri == null || !uri.contains("/safetyEval-h5/wsp/"); + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + String wpsToken = request.getHeader(WPS_TOKEN_HEADER); + if (!StringUtils.hasText(wpsToken)) { + log.warn("WPS callback missing {}: {}", WPS_TOKEN_HEADER, request.getRequestURI()); + filterChain.doFilter(request, response); + return; + } + + String token = wpsToken.trim(); + if (!token.startsWith(AUTH_TOKEN_PREFIX)) { + token = AUTH_TOKEN_PREFIX + token; + } + + MutableHeaderRequestWrapper wrapped = new MutableHeaderRequestWrapper(request); + wrapped.putHeader(AUTH_TOKEN_HEADER, token); + log.info("WPS token mapped to header {} for {}", AUTH_TOKEN_HEADER, request.getRequestURI()); + filterChain.doFilter(wrapped, response); + } + + static final class MutableHeaderRequestWrapper extends HttpServletRequestWrapper { + + private final Map extraHeaders = new HashMap<>(); + + MutableHeaderRequestWrapper(HttpServletRequest request) { + super(request); + } + + void putHeader(String name, String value) { + extraHeaders.put(name, value); + } + + @Override + public String getHeader(String name) { + String value = findExtra(name); + return value != null ? value : super.getHeader(name); + } + + @Override + public Enumeration getHeaders(String name) { + String value = findExtra(name); + if (value != null) { + return Collections.enumeration(Collections.singletonList(value)); + } + return super.getHeaders(name); + } + + @Override + public Enumeration getHeaderNames() { + Set names = new HashSet<>(); + Enumeration original = super.getHeaderNames(); + while (original.hasMoreElements()) { + names.add(original.nextElement()); + } + names.addAll(extraHeaders.keySet()); + return Collections.enumeration(names); + } + + private String findExtra(String name) { + if (name == null) { + return null; + } + for (Map.Entry entry : extraHeaders.entrySet()) { + if (entry.getKey().equalsIgnoreCase(name)) { + return entry.getValue(); + } + } + return null; + } + } +} diff --git a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/H5OpenController.java b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/H5OpenController.java index 44a77c9f..b587f260 100644 --- a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/H5OpenController.java +++ b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/H5OpenController.java @@ -1,122 +1,156 @@ package org.qinan.safetyeval.adapter.web; -import cn.hutool.json.JSONUtil; -import com.alibaba.fastjson2.JSON; -import com.jjb.saas.framework.auth.model.SSOUser; -import com.jjb.saas.framework.utils.JwtTokenUtils; +import com.alibaba.cola.dto.SingleResponse; +import com.alibaba.fastjson2.JSONObject; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; -import org.dromara.x.file.storage.core.FileInfo; -import org.dromara.x.file.storage.core.FileStorageService; -import org.qinan.safetyeval.infrastructure.mapper.AccountMapper; -import org.springframework.beans.factory.annotation.Autowired; +import org.qinan.safetyeval.client.api.WpsApi; +import org.qinan.safetyeval.client.co.WpsDocOpenCO; +import org.qinan.safetyeval.infrastructure.dataobject.base.Req; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.io.IOException; -import java.io.InputStream; +import java.util.HashMap; import java.util.List; import java.util.Map; /** - * 对外开放接口(免鉴权)。 - *

- * 所有不需要登录验证的接口统一挂载在 /safetyEval/images 前缀下。 - *

+ * WPS WebOffice 服务器回调(免登录拦截,由 WPS 携带 token)。 + * + * @author safety-eval */ -@Api(tags = "对外开放接口") +@Api(tags = "WPS回调接口") @RestController @RequestMapping("/safetyEval-h5/wsp") @Slf4j public class H5OpenController { - @Autowired - private AccountMapper accountMapper; - @Autowired - private FileStorageService fileStorageService; + @Resource + private WpsApi wpsApi; - @ApiOperation("wps回调预览") + @ApiOperation("wps回调-获取文件信息") @GetMapping(value = "/v3/3rd/files/{file_id}", produces = MediaType.APPLICATION_JSON_VALUE) - public String getWpsInfoByFileId(@PathVariable("file_id") String file_id, HttpServletRequest request) { - log.info("token, {}", request.getHeader("token")); - log.info("Token, {}", request.getHeader("Token")); - String header = request.getHeader("X-Weboffice-Token"); - log.info("X-Weboffice-Token, {}", request.getHeader("X-Weboffice-Token")); - - String token = header; - log.info("2.5token不为空:{}", token); - token = token.replaceAll("jjb-saas-auth:oauth:", "").trim(); - String json = null; - SSOUser ssoUser; - try { - json = JwtTokenUtils.parseToken(token); - } catch (Exception var41) { - } - if (null != json) { - ssoUser = (SSOUser) JSONUtil.toBean(json, SSOUser.class); - } else { - ssoUser = new SSOUser(); - } - log.info("ssoUser:{}", ssoUser); - log.info("wps回调预览:{}", file_id); - return accountMapper.getWps(1); + public String getWpsInfoByFileId(@PathVariable("file_id") String fileId) { + log.info("wps回调预览:{}", fileId); + return toJson(wpsApi.getFileInfo(fileId)); } - @ApiOperation("wps回调下载") + @ApiOperation("wps回调-获取下载地址") @GetMapping(value = "/v3/3rd/files/{file_id}/download", produces = MediaType.APPLICATION_JSON_VALUE) - public String getWpsDownloadByFileId(@PathVariable("file_id") String file_id) { - log.info("wps回调下载:{}", file_id); - return accountMapper.getWps(2); + public String getWpsDownloadByFileId(@PathVariable("file_id") String fileId) { + log.info("wps回调下载:{}", fileId); + return toJson(wpsApi.getDownload(fileId)); } - @ApiOperation("wps回调权限信息") + @ApiOperation("wps回调-文档权限") @GetMapping(value = "/v3/3rd/files/{file_id}/permission", produces = MediaType.APPLICATION_JSON_VALUE) - public String getWpsPermissionByFileId(@PathVariable("file_id") String file_id) { - log.info("wps回调权限信息:{}", file_id); - return accountMapper.getWps(3); + public String getWpsPermissionByFileId(@PathVariable("file_id") String fileId) { + log.info("wps回调权限信息:{}", fileId); + return toJson(wpsApi.getPermission(fileId)); } - @ApiOperation("wps回调用户信息") + @ApiOperation("wps回调-批量用户信息") @GetMapping(value = "/v3/3rd/users", produces = MediaType.APPLICATION_JSON_VALUE) - public String getWpsUsers(@RequestParam List user_ids) { - log.info("wps回调用户信息:{}", user_ids); - return accountMapper.getWps(4); + public String getWpsUsers(@RequestParam("user_ids") List userIds) { + log.info("wps回调用户信息:{}", userIds); + return toJson(wpsApi.getUsers(userIds)); } - @ApiOperation("wps回调上传第一步") + @ApiOperation("wps回调-上传准备") @GetMapping(value = "/v3/3rd/files/{file_id}/upload/prepare", produces = MediaType.APPLICATION_JSON_VALUE) - public String getWpsUpLoadOne(@PathVariable("file_id") String file_id) { - log.info("wps回调上传第一步:{}", file_id); - return accountMapper.getWps(5); + public String getWpsUpLoadOne(@PathVariable("file_id") String fileId) { + log.info("wps回调上传第一步:{}", fileId); + return toJson(wpsApi.uploadPrepare(fileId)); } - @ApiOperation("wps回调上传第二步") - @PostMapping(value = "/v3/3rd/files/{file_id}/upload/address") - public String getWpsUpLoadTwo(@PathVariable("file_id") String file_id, @RequestBody Map map) { - log.info("wps回调上传第二步:{}, map: {}", file_id, JSON.toJSONString(map)); - return accountMapper.getWps(6); + @ApiOperation("wps回调-获取上传地址") + @PostMapping(value = "/v3/3rd/files/{file_id}/upload/address", produces = MediaType.APPLICATION_JSON_VALUE) + public String getWpsUpLoadTwo(@PathVariable("file_id") String fileId, + @RequestBody Map body) { + log.info("wps回调上传第二步:{}, body={}", fileId, body); + return toJson(wpsApi.uploadAddress(fileId, body)); } - @ApiOperation("wps回调上传第三步") - @PostMapping(value = "/v3/3rd/files/{file_id}/upload/complete") - public String getWpsUpLoadThree(@PathVariable("file_id") String file_id, @RequestBody Map map) { - String msg = accountMapper.getWps(7); - log.info("wps回调上传第三步:{}, map: {}", file_id, msg); - return msg; + @ApiOperation("wps回调-上传完成") + @PostMapping(value = "/v3/3rd/files/{file_id}/upload/complete", produces = MediaType.APPLICATION_JSON_VALUE) + public String getWpsUpLoadThree(@PathVariable("file_id") String fileId, + @RequestBody Map body) { + log.info("wps回调上传第三步:{}, body={}", fileId, body); + return toJson(wpsApi.uploadComplete(fileId, body)); } - @PutMapping(value = "/upload/{file_id}", consumes = "application/octet-stream") - public String uploadFile(@PathVariable("file_id") String file_id, HttpServletRequest request) throws IOException { - // 获取文件的二进制流 - try (InputStream inputStream = request.getInputStream()) { - FileInfo upload = fileStorageService.of(inputStream, file_id).upload(); - log.info("上传文件成功:{}", JSON.toJSONString(upload)); - return "ok"; + @ApiOperation("wps回调-PUT上传文件实体") + @PutMapping(value = "/upload/{file_id}", consumes = "application/octet-stream", produces = MediaType.APPLICATION_JSON_VALUE) + public String uploadFile(@PathVariable("file_id") String fileId, HttpServletRequest request) throws IOException { + log.info("wps PUT上传:{}", fileId); + return toJson(wpsApi.uploadBinary(fileId, request.getInputStream())); + } + + @ApiOperation("wps回调-历史版本列表") + @GetMapping(value = "/v3/3rd/files/{file_id}/versions", produces = MediaType.APPLICATION_JSON_VALUE) + public String getWpsVersions(@PathVariable("file_id") String fileId) { + log.info("wps回调历史版本列表:{}", fileId); + return toJson(wpsApi.listVersions(fileId)); + } + + @ApiOperation("wps回调-指定历史版本") + @GetMapping(value = "/v3/3rd/files/{file_id}/versions/{version}", produces = MediaType.APPLICATION_JSON_VALUE) + public String getWpsVersion(@PathVariable("file_id") String fileId, + @PathVariable("version") Integer version) { + log.info("wps回调历史版本详情:{}, version={}", fileId, version); + return toJson(wpsApi.getVersion(fileId, version)); + } + + @ApiOperation("wps回调-历史版本下载") + @GetMapping(value = "/v3/3rd/files/{file_id}/versions/{version}/download", produces = MediaType.APPLICATION_JSON_VALUE) + public String getWpsVersionDownload(@PathVariable("file_id") String fileId, + @PathVariable("version") Integer version) { + log.info("wps回调历史版本下载:{}, version={}", fileId, version); + return toJson(wpsApi.getVersionDownload(fileId, version)); + } + + @ApiOperation("wps回调-文档重命名") + @PutMapping(value = "/v3/3rd/files/{file_id}/name", produces = MediaType.APPLICATION_JSON_VALUE) + public String renameWpsFile(@PathVariable("file_id") String fileId, + @RequestBody Map body) { + log.info("wps回调重命名:{}, body={}", fileId, body); + return toJson(wpsApi.rename(fileId, body)); + } + + @ApiOperation("打开页:当前用户有文档返回最近一份,没有则创建空白docx") + @GetMapping(value = "/doc/my-or-create", produces = MediaType.APPLICATION_JSON_VALUE) + public SingleResponse myOrCreate(@RequestParam("docxUrl") String docxUrl) { + log.info("wps my-or-create"); + return SingleResponse.of(wpsApi.myOrCreate(docxUrl)); + } + + @ApiOperation("始终新建一份空白docx") + @PostMapping(value = "/doc/create", produces = MediaType.APPLICATION_JSON_VALUE) + public SingleResponse createBlank(@RequestBody Req req) { + log.info("wps create blank"); + return SingleResponse.of(wpsApi.createBlank(req.getData())); + } + + @ApiOperation("模版文档(固定)") + @PostMapping(value = "/doc/template") + public SingleResponse> template() { + Map map = new HashMap<>(); + map.put("安全预评价报告", "https://test-dragon-yf-pub.oss-cn-hangzhou.aliyuncs.com/jjb/6a5dd9010dc588e38bfb4cce.docx"); + map.put("安全验收评价报告", "https://test-dragon-yf-pub.oss-cn-hangzhou.aliyuncs.com/jjb/6a5dd9010dc588e38bfb4cce.docx"); + map.put("安全现状评价报告", "https://test-dragon-yf-pub.oss-cn-hangzhou.aliyuncs.com/jjb/6a5dd9010dc588e38bfb4cce.docx"); + return SingleResponse.of(map); + } + + private String toJson(Map result) { + try { + return JSONObject.toJSONString(result).toString(); } catch (Exception e) { - log.error("上传文件失败:{}", e.getMessage()); - return "上传文件失败"; + log.error("wps response serialize failed", e); + return "{\"code\":40001,\"message\":\"serialize error\"}"; } } } diff --git a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/QualOnSiteReviewController.java b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/QualOnSiteReviewController.java index 08971f49..8645851d 100644 --- a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/QualOnSiteReviewController.java +++ b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/QualOnSiteReviewController.java @@ -8,9 +8,17 @@ import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import org.qinan.safetyeval.app.review.service.QualOnSiteReviewServiceI; import org.qinan.safetyeval.client.review.request.QualOnSiteReviewAddCmd; +import org.qinan.safetyeval.client.review.request.QualOnSiteReviewMonitorPageQry; +import org.qinan.safetyeval.client.review.request.QualOnSiteReviewOrgPageQry; import org.qinan.safetyeval.client.review.request.QualOnSiteReviewPageQry; +import org.qinan.safetyeval.client.review.request.QualOnSiteReviewResultUploadCmd; import org.qinan.safetyeval.client.review.request.QualOnSiteReviewUpdateCmd; import org.qinan.safetyeval.client.review.response.QualOnSiteReviewCo; +import org.qinan.safetyeval.client.review.response.QualOnSiteReviewMonitorCo; +import org.qinan.safetyeval.client.review.response.QualOnSiteReviewOrgCo; +import org.qinan.safetyeval.client.review.response.QualOnSiteReviewStatisticsCo; +import org.qinan.safetyeval.domain.constant.QualOnSiteReviewStatusEnum; +import org.qinan.safetyeval.infrastructure.adapter.ThreadLocalUserInfoAdapter; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -39,8 +47,23 @@ public class QualOnSiteReviewController implements Serializable { @GetMapping("/monitor/page") @ApiOperation("监管端-查询资质现场核查列表-分页") - public PageResponse monitorPage(@Validated QualOnSiteReviewPageQry qry) { - return qualOnSiteReviewServiceI.listQualOnSiteReviewPage(qry); + public org.qinan.safetyeval.client.dto.PageResponse monitorPage( + @Validated QualOnSiteReviewMonitorPageQry qry) { + return qualOnSiteReviewServiceI.monitorPage(qry); + } + + @GetMapping("/org/page") + @ApiOperation("机构端-查询资质现场核查列表-分页") + public org.qinan.safetyeval.client.dto.PageResponse orgPage(@Validated QualOnSiteReviewOrgPageQry qry) { + Long orgId = ThreadLocalUserInfoAdapter.getOrgId(); + qry.setOrgId(orgId); + return qualOnSiteReviewServiceI.orgPage(qry); + } + + @GetMapping("/monitor/page/statistics") + @ApiOperation("资质现场核查统计") + public SingleResponse statistics(@RequestParam(required = false) Long orgId) { + return SingleResponse.of(qualOnSiteReviewServiceI.statistics(orgId)); } @GetMapping("/{id}") @@ -52,6 +75,7 @@ public class QualOnSiteReviewController implements Serializable { @PostMapping @ApiOperation("新增资质现场核查") public Response save(@Validated @RequestBody QualOnSiteReviewAddCmd qualOnSiteReviewAddCmd) { + qualOnSiteReviewAddCmd.setStatus(QualOnSiteReviewStatusEnum.AGENCY_PENDING_CONFIRMATION.getCode()); qualOnSiteReviewServiceI.saveQualOnSiteReview(qualOnSiteReviewAddCmd); return Response.buildSuccess(); } @@ -63,6 +87,13 @@ public class QualOnSiteReviewController implements Serializable { return Response.buildSuccess(); } + @PostMapping("/result-upload") + @ApiOperation("审查结果上传") + public Response uploadReviewResult(@Validated @RequestBody QualOnSiteReviewResultUploadCmd qualOnSiteReviewResultUploadCmd) { + qualOnSiteReviewServiceI.uploadReviewResult(qualOnSiteReviewResultUploadCmd); + return Response.buildSuccess(); + } + @DeleteMapping("/{id}") @ApiOperation("删除资质现场核查(单个)") public Response deletedById(@PathVariable("id") Long id) { diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/change/convertor/QualFilingChangeCmdConvertor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/change/convertor/QualFilingChangeCmdConvertor.java index 708af742..17775155 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/change/convertor/QualFilingChangeCmdConvertor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/change/convertor/QualFilingChangeCmdConvertor.java @@ -9,6 +9,7 @@ import org.qinan.safetyeval.client.dto.QualFilingAddCmd; import org.qinan.safetyeval.client.dto.QualFilingChangeAddCmd; import org.qinan.safetyeval.domain.entity.QualFilingChangeEntity; import org.qinan.safetyeval.domain.entity.QualFilingEntity; +import org.qinan.safetyeval.infrastructure.dataobject.QualFilingDO; import java.util.List; @@ -69,4 +70,23 @@ public interface QualFilingChangeCmdConvertor { @Mapping(target = "applyTypeCode", ignore = true) @Mapping(target = "applyTypeName", ignore = true) QualFilingAddCmd convertChangeEToFilingCmd(QualFilingChangeEntity changeEntity); + + /** + * 备案DO转变更Cmd(审核通过同步变更记录时使用) + *

+ * 原 BeanUtils.copyProperties(qualFilingDO, cmd, "id") 行为: + * - id 不拷贝 + * - filingId 由 DO.id 设置 + * - businessScope 由 JSON 字符串解析为 List + */ + @Mapping(target = "id", ignore = true) + @Mapping(target = "filingId", source = "id") + @Mapping(target = "changeFilingId", ignore = true) + @Mapping(target = "businessScope", source = "businessScope", qualifiedByName = "jsonStringToList") + QualFilingChangeAddCmd convertDOToCmd(QualFilingDO qualFilingDO); + + @Named("jsonStringToList") + default List jsonStringToList(String json) { + return json == null ? null : JSON.parseArray(json, String.class); + } } diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/change/convertor/QualFilingCommitmentChangeCmdConvertor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/change/convertor/QualFilingCommitmentChangeCmdConvertor.java index e9d41da3..639447c8 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/change/convertor/QualFilingCommitmentChangeCmdConvertor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/change/convertor/QualFilingCommitmentChangeCmdConvertor.java @@ -8,6 +8,7 @@ import org.qinan.safetyeval.client.co.QualFilingCommitmentCO; import org.qinan.safetyeval.client.dto.QualFilingCommitmentAddCmd; import org.qinan.safetyeval.domain.change.model.QualFilingCommitmentChangeE; import org.qinan.safetyeval.domain.entity.QualFilingCommitmentEntity; +import org.qinan.safetyeval.infrastructure.dataobject.QualFilingCommitmentDO; import java.time.LocalDate; import java.time.LocalDateTime; @@ -63,7 +64,18 @@ public interface QualFilingCommitmentChangeCmdConvertor { */ QualFilingCommitmentAddCmd convertChangeEToCmd(QualFilingCommitmentChangeE changeE); + /** + * 备案承诺书DO转变更Cmd(审核通过同步变更记录时使用) + * signDate 由 LocalDate 转为 LocalDateTime + */ + @Mapping(target = "filingChangeId", ignore = true) + QualFilingCommitmentChangeAddCmd convertDOToCmd(QualFilingCommitmentDO qualFilingCommitmentDO); + default LocalDate map(LocalDateTime dateTime) { return dateTime == null ? null : dateTime.toLocalDate(); } + + default LocalDateTime map(LocalDate date) { + return date == null ? null : date.atStartOfDay(); + } } diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/change/convertor/QualFilingEquipmentChangeCmdConvertor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/change/convertor/QualFilingEquipmentChangeCmdConvertor.java index 66647c4d..a56df155 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/change/convertor/QualFilingEquipmentChangeCmdConvertor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/change/convertor/QualFilingEquipmentChangeCmdConvertor.java @@ -7,6 +7,7 @@ import org.qinan.safetyeval.client.change.request.QualFilingEquipmentChangeUpdat import org.qinan.safetyeval.client.co.QualFilingEquipmentCO; import org.qinan.safetyeval.domain.change.model.QualFilingEquipmentChangeE; import org.qinan.safetyeval.domain.entity.QualFilingEquipmentEntity; +import org.qinan.safetyeval.infrastructure.dataobject.QualFilingEquipmentDO; import java.util.List; @@ -60,4 +61,15 @@ public interface QualFilingEquipmentChangeCmdConvertor { * 批量转换变更装备为CO */ List convertChangeEListToCOList(List changeEs); + + /** + * 备案装备DO转变更Cmd(审核通过同步变更记录时使用) + */ + @Mapping(target = "filingChangeId", ignore = true) + QualFilingEquipmentChangeAddCmd convertDOToCmd(QualFilingEquipmentDO qualFilingEquipmentDO); + + /** + * 批量转换备案装备DO为变更Cmd + */ + List convertDOListToCmdList(List qualFilingEquipmentDOs); } diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/change/convertor/QualFilingMaterialChangeCmdConvertor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/change/convertor/QualFilingMaterialChangeCmdConvertor.java index 13326c1a..8b83ae10 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/change/convertor/QualFilingMaterialChangeCmdConvertor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/change/convertor/QualFilingMaterialChangeCmdConvertor.java @@ -8,6 +8,7 @@ import org.qinan.safetyeval.client.co.QualFilingMaterialCO; import org.qinan.safetyeval.client.dto.QualFilingMaterialAddCmd; import org.qinan.safetyeval.domain.change.model.QualFilingMaterialChangeE; import org.qinan.safetyeval.domain.entity.QualFilingMaterialEntity; +import org.qinan.safetyeval.infrastructure.dataobject.QualFilingMaterialDO; import java.util.List; @@ -80,4 +81,15 @@ public interface QualFilingMaterialChangeCmdConvertor { * 批量转换变更实体为备案Cmd */ List convertChangeEListToCmdList(List changeEs); + + /** + * 备案材料DO转变更Cmd(审核通过同步变更记录时使用) + */ + @Mapping(target = "filingChangeId", ignore = true) + QualFilingMaterialChangeAddCmd convertDOToCmd(QualFilingMaterialDO qualFilingMaterialDO); + + /** + * 批量转换备案材料DO为变更Cmd + */ + List convertDOListToCmdList(List qualFilingMaterialDOs); } diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/change/convertor/QualFilingPersonnelChangeCmdConvertor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/change/convertor/QualFilingPersonnelChangeCmdConvertor.java index dc3cfcc6..59a29430 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/change/convertor/QualFilingPersonnelChangeCmdConvertor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/change/convertor/QualFilingPersonnelChangeCmdConvertor.java @@ -8,6 +8,7 @@ import org.qinan.safetyeval.client.co.QualFilingPersonnelCO; import org.qinan.safetyeval.client.dto.QualFilingPersonnelAddCmd; import org.qinan.safetyeval.domain.change.model.QualFilingPersonnelChangeE; import org.qinan.safetyeval.domain.entity.QualFilingPersonnelEntity; +import org.qinan.safetyeval.infrastructure.dataobject.QualFilingPersonnelDO; import java.time.LocalDate; import java.time.LocalDateTime; @@ -84,7 +85,23 @@ public interface QualFilingPersonnelChangeCmdConvertor { */ List convertChangeEListToCmdList(List changeEs); + /** + * 备案人员DO转变更Cmd(审核通过同步变更记录时使用) + * birthDate / joinWorkDate 由 LocalDate 转为 LocalDateTime + */ + @Mapping(target = "filingChangeId", ignore = true) + QualFilingPersonnelChangeAddCmd convertDOToCmd(QualFilingPersonnelDO qualFilingPersonnelDO); + + /** + * 批量转换备案人员DO为变更Cmd + */ + List convertDOListToCmdList(List qualFilingPersonnelDOs); + default LocalDate map(LocalDateTime dateTime) { return dateTime == null ? null : dateTime.toLocalDate(); } + + default LocalDateTime map(LocalDate date) { + return date == null ? null : date.atStartOfDay(); + } } diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/convertor/WpsCmdConvertor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/convertor/WpsCmdConvertor.java new file mode 100644 index 00000000..20e59640 --- /dev/null +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/convertor/WpsCmdConvertor.java @@ -0,0 +1,36 @@ +package org.qinan.safetyeval.app.convertor; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.qinan.safetyeval.client.co.WpsFileCO; +import org.qinan.safetyeval.client.co.WpsUserCO; +import org.qinan.safetyeval.domain.entity.AccountEntity; +import org.qinan.safetyeval.domain.entity.WpsDocEntity; +import org.qinan.safetyeval.domain.entity.WpsDocVersionEntity; + +/** + * WPS 回调对象转换(App层) + * + * @author safety-eval + */ +@Mapper(componentModel = "spring") +public interface WpsCmdConvertor { + + @Mapping(source = "fileId", target = "id") + @Mapping(source = "docVersion", target = "version") + @Mapping(source = "createTimeEpoch", target = "createTime") + @Mapping(source = "modifyTimeEpoch", target = "modifyTime") + WpsFileCO toFileCO(WpsDocEntity entity); + + @Mapping(source = "fileId", target = "id") + @Mapping(source = "docVersion", target = "version") + @Mapping(source = "createTimeEpoch", target = "createTime") + @Mapping(source = "createTimeEpoch", target = "modifyTime") + @Mapping(target = "creatorId", ignore = true) + WpsFileCO toFileCO(WpsDocVersionEntity entity); + + @Mapping(target = "id", expression = "java(entity.getId() == null ? null : String.valueOf(entity.getId()))") + @Mapping(source = "userName", target = "name") + @Mapping(source = "profileUrl", target = "avatarUrl") + WpsUserCO toUserCO(AccountEntity entity); +} diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/QualFilingExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/QualFilingExecutor.java index 883fbe8c..e9021141 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/QualFilingExecutor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/QualFilingExecutor.java @@ -16,6 +16,7 @@ import org.qinan.safetyeval.client.dto.*; import org.qinan.safetyeval.domain.constant.BooleanQAEnum; import org.qinan.safetyeval.domain.constant.QualFilingApplyTypeEnum; import org.qinan.safetyeval.domain.constant.QualFilingReviewResultEnum; +import org.qinan.safetyeval.domain.constant.QualFilingStatusEnum; import org.qinan.safetyeval.domain.entity.*; import org.qinan.safetyeval.domain.exception.BizException; import org.qinan.safetyeval.domain.exception.ErrorCode; @@ -225,49 +226,8 @@ public class QualFilingExecutor implements QualFilingApi { @Override @Transactional(rollbackFor = Exception.class) public void review(QualFilingReviewAddCmd cmd) { - qualFilingDomainService.review(cmd.getFilingId(), cmd.getReviewResult(), cmd.getReviewResultRemark(), cmd.getFilingExpertId(), cmd.getFilingExpertName(), cmd.getReviewOpinion()); - if (QualFilingReviewResultEnum.PASS.getCode() == Integer.parseInt(cmd.getReviewResult())) { - // 审核通过,需要新增资质变更记录 - AggregationSaveOrEditQualFilingChangeCmd cmdSync = new AggregationSaveOrEditQualFilingChangeCmd(); - // 基本信息 - QualFilingDO qualFilingDO = qualFilingMapper.selectById(cmd.getFilingId()); - QualFilingChangeAddCmd qualFilingChangeAddCmd = new QualFilingChangeAddCmd(); - BeanUtils.copyProperties(qualFilingDO, qualFilingChangeAddCmd, "id"); - qualFilingChangeAddCmd.setBusinessScope(JSON.parseArray(qualFilingDO.getBusinessScope(), String.class)); - qualFilingChangeAddCmd.setFilingId(qualFilingDO.getId()); - cmdSync.setQualFilingChangeAddCmd(qualFilingChangeAddCmd); - // 备案承诺书 - QualFilingCommitmentDO qualFilingCommitmentDO = qualFilingCommitmentMapper.selectOne(new LambdaQueryWrapper() - .eq(QualFilingCommitmentDO::getFilingId, cmd.getFilingId())); - QualFilingCommitmentChangeAddCmd qualFilingCommitmentChangeAddCmd = new QualFilingCommitmentChangeAddCmd(); - BeanUtils.copyProperties(qualFilingCommitmentDO, qualFilingCommitmentChangeAddCmd); - cmdSync.setQualFilingCommitmentChangeAddCmd(qualFilingCommitmentChangeAddCmd); - // 备案装备 - List qualFilingEquipmentDOs = qualFilingEquipmentMapper.selectList(new LambdaQueryWrapper() - .eq(QualFilingEquipmentDO::getFilingId, cmd.getFilingId())); - cmdSync.setQualFilingEquipmentChangeAddCmds(qualFilingEquipmentDOs.stream().map(item -> { - QualFilingEquipmentChangeAddCmd qualFilingEquipmentChangeAddCmd = new QualFilingEquipmentChangeAddCmd(); - BeanUtils.copyProperties(item, qualFilingEquipmentChangeAddCmd); - return qualFilingEquipmentChangeAddCmd; - }).collect(Collectors.toList())); - // 备案材料清单 - List qualFilingMaterialDOs = qualFilingMaterialMapper.selectList(new LambdaQueryWrapper() - .eq(QualFilingMaterialDO::getFilingId, cmd.getFilingId())); - cmdSync.setQualFilingMaterialChangeAddCmds(qualFilingMaterialDOs.stream().map(item -> { - QualFilingMaterialChangeAddCmd qualFilingMaterialChangeAddCmd = new QualFilingMaterialChangeAddCmd(); - BeanUtils.copyProperties(item, qualFilingMaterialChangeAddCmd); - return qualFilingMaterialChangeAddCmd; - }).collect(Collectors.toList())); - // 备案人员 - List qualFilingPersonnelDOs = qualFilingPersonnelMapper.selectList(new LambdaQueryWrapper() - .eq(QualFilingPersonnelDO::getFilingId, cmd.getFilingId())); - cmdSync.setQualFilingPersonnelChangeAddCmds(qualFilingPersonnelDOs.stream().map(item -> { - QualFilingPersonnelChangeAddCmd qualFilingPersonnelChangeAddCmd = new QualFilingPersonnelChangeAddCmd(); - BeanUtils.copyProperties(item, qualFilingPersonnelChangeAddCmd); - return qualFilingPersonnelChangeAddCmd; - }).collect(Collectors.toList())); - qualFilingChangeExecutor.aggregationSaveOrEdit(cmdSync, true); - } + qualFilingDomainService.review(cmd.getFilingId(), cmd.getReviewResult() + , cmd.getReviewResultRemark(), cmd.getFilingExpertId(), cmd.getFilingExpertName(), cmd.getReviewOpinion()); } @Override diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/WpsExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/WpsExecutor.java new file mode 100644 index 00000000..7edd25dd --- /dev/null +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/WpsExecutor.java @@ -0,0 +1,477 @@ +package org.qinan.safetyeval.app.executor; + +import com.alibaba.fastjson2.JSON; +import lombok.extern.slf4j.Slf4j; +import org.dromara.x.file.storage.core.FileInfo; +import org.dromara.x.file.storage.core.FileStorageService; +import org.qinan.safetyeval.app.convertor.WpsCmdConvertor; +import org.qinan.safetyeval.client.api.WpsApi; +import org.qinan.safetyeval.client.co.WpsDocOpenCO; +import org.qinan.safetyeval.client.co.WpsFileCO; +import org.qinan.safetyeval.client.co.WpsPermissionCO; +import org.qinan.safetyeval.client.co.WpsUserCO; +import org.qinan.safetyeval.domain.entity.AccountEntity; +import org.qinan.safetyeval.domain.entity.FileStorage; +import org.qinan.safetyeval.domain.entity.WpsDocEntity; +import org.qinan.safetyeval.domain.entity.WpsDocVersionEntity; +import org.qinan.safetyeval.domain.exception.BizException; +import org.qinan.safetyeval.domain.exception.ErrorCode; +import org.qinan.safetyeval.domain.gateway.AccountGateway; +import org.qinan.safetyeval.domain.service.FileStorageDomainService; +import org.qinan.safetyeval.domain.service.WpsDocDomainService; +import org.qinan.safetyeval.infrastructure.adapter.ThreadLocalUserInfoAdapter; +import org.qinan.safetyeval.infrastructure.adapter.auth.AuthUserContextAdapter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.annotation.Resource; +import java.io.InputStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.stream.Collectors; + +/** + * WPS WebOffice 回调执行器 + * + * @author safety-eval + */ +@Slf4j +@Service +public class WpsExecutor implements WpsApi { + + @Resource + private WpsDocDomainService wpsDocDomainService; + @Resource + private AccountGateway accountGateway; + @Resource + private WpsCmdConvertor wpsCmdConvertor; + @Resource + private FileStorageService fileStorageService; + @Resource + private FileStorageDomainService fileStorageDomainService; + + @Value("${wps.upload-base-url:}") + private String uploadBaseUrl; + + @Value("${wps.def-docx-url:}") + private String defDocxUrl; + + @Override + public Map getFileInfo(String fileId) { + try { + WpsDocEntity doc = wpsDocDomainService.getByFileId(fileId); + return ok(wpsCmdConvertor.toFileCO(doc)); + } catch (BizException e) { + return fail(e); + } + } + + @Override + public Map getDownload(String fileId) { + try { + WpsDocEntity doc = wpsDocDomainService.getByFileId(fileId); + Map data = new LinkedHashMap<>(); + data.put("url", resolveDownloadUrl(doc.getDownloadUrl(), doc.getResourceId())); + return ok(data); + } catch (BizException e) { + return fail(e); + } + } + + @Override + public Map getPermission(String fileId) { + try { + wpsDocDomainService.getByFileId(fileId); + Long userId = AuthUserContextAdapter.getCurrentUserId(); + if (userId == null) { + throw new BizException(ErrorCode.WPS_USER_NOT_LOGIN); + } + WpsPermissionCO permission = new WpsPermissionCO(); + permission.setUserId(String.valueOf(userId)); + permission.setRead(1); + permission.setUpdate(1); + permission.setDownload(1); + permission.setPrint(1); + permission.setCopy(1); + permission.setComment(1); + // 未实现重命名回调,保持 0 + permission.setRename(1); + permission.setHistory(1); + permission.setSaveas(1); + return ok(permission); + } catch (BizException e) { + return fail(e); + } + } + + @Override + public Map getUsers(List userIds) { + try { + if (userIds == null || userIds.isEmpty()) { + return ok(Collections.emptyList()); + } + List ids = userIds.stream() + .filter(StringUtils::hasText) + .map(Long::valueOf) + .distinct() + .collect(Collectors.toList()); + List accounts = accountGateway.listByIds(ids); + List users = new ArrayList<>(); + for (AccountEntity account : accounts) { + users.add(wpsCmdConvertor.toUserCO(account)); + } + return ok(users); + } catch (BizException e) { + return fail(e); + } catch (Exception e) { + log.error("wps getUsers failed, userIds={}", userIds, e); + return fail(ErrorCode.UNKNOWN_ERROR); + } + } + + @Override + public Map uploadPrepare(String fileId) { + try { + wpsDocDomainService.getByFileId(fileId); + Map data = new LinkedHashMap<>(); + data.put("digest_types", Collections.singletonList("sha1")); + return ok(data); + } catch (BizException e) { + return fail(e); + } + } + + @Override + public Map uploadAddress(String fileId, Map body) { + try { + wpsDocDomainService.getByFileId(fileId); + if (!StringUtils.hasText(uploadBaseUrl)) { + log.error("wps.upload-base-url is empty"); + return fail(ErrorCode.UNKNOWN_ERROR); + } + String base = uploadBaseUrl.endsWith("/") ? uploadBaseUrl.substring(0, uploadBaseUrl.length() - 1) : uploadBaseUrl; + Map data = new LinkedHashMap<>(); + data.put("url", base + "/upload/" + fileId); + data.put("method", "PUT"); + return ok(data); + } catch (BizException e) { + return fail(e); + } + } + + @Override + public Map uploadBinary(String fileId, InputStream inputStream) { + try { + wpsDocDomainService.getByFileId(fileId); + FileInfo ossFileInfo = fileStorageService.of(inputStream, fileId).upload(); + FileStorage fileStorage = FileStorageHelper.buildResource(ossFileInfo, fileId, true); + FileStorage saved = fileStorageDomainService.saveResource(fileStorage); + wpsDocDomainService.savePendingUpload(fileId, saved.getId(), saved.getUrl(), saved.getSize()); + log.info("wps upload binary success, fileId={}, resourceId={}, url={}", fileId, saved.getId(), saved.getUrl()); + Map data = new LinkedHashMap<>(); + data.put("status", "ok"); + return ok(data); + } catch (BizException e) { + return fail(e); + } catch (Exception e) { + log.error("wps upload binary failed, fileId={}", fileId, e); + return fail(ErrorCode.FILE_UPLOAD_FAILED); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Map uploadComplete(String fileId, Map body) { + try { + WpsDocEntity doc = wpsDocDomainService.getByFileId(fileId); + if (doc.getPendingResourceId() == null) { + throw new BizException(ErrorCode.WPS_UPLOAD_PENDING_NOT_FOUND); + } + Integer pendingResourceId = doc.getPendingResourceId(); + String pendingUrl = doc.getPendingDownloadUrl(); + Long pendingSize = doc.getPendingSize(); + + Long userId = AuthUserContextAdapter.getCurrentUserId(); + String modifierId = userId == null ? doc.getModifierId() : String.valueOf(userId); + long nowEpoch = System.currentTimeMillis() / 1000; + + int nextVersion = (doc.getDocVersion() == null ? 1 : doc.getDocVersion()) + 1; + String name = doc.getName(); + Boolean isManual = null; + String digestSha1 = null; + if (body != null && body.get("request") instanceof Map) { + @SuppressWarnings("unchecked") + Map request = (Map) body.get("request"); + if (request.get("name") != null) { + name = String.valueOf(request.get("name")); + } + if (request.get("is_manual") != null) { + isManual = Boolean.valueOf(String.valueOf(request.get("is_manual"))); + } + Object digestObj = request.get("digest"); + if (digestObj instanceof Map) { + Object sha1 = ((Map) digestObj).get("sha1"); + if (sha1 != null) { + digestSha1 = String.valueOf(sha1); + } + } + } + + doc.setName(name); + doc.setDocVersion(nextVersion); + doc.setSize(pendingSize == null ? doc.getSize() : pendingSize); + doc.setResourceId(pendingResourceId); + doc.setDownloadUrl(pendingUrl); + doc.setModifierId(modifierId); + doc.setModifyTimeEpoch(nowEpoch); + + WpsDocVersionEntity versionEntity = new WpsDocVersionEntity(); + versionEntity.setOrgId(doc.getOrgId()); + versionEntity.setFileId(fileId); + versionEntity.setDocVersion(nextVersion); + versionEntity.setName(name); + versionEntity.setSize(doc.getSize()); + versionEntity.setResourceId(pendingResourceId); + versionEntity.setDownloadUrl(pendingUrl); + versionEntity.setDigestSha1(digestSha1); + versionEntity.setModifierId(modifierId); + versionEntity.setManualFlag(Boolean.TRUE.equals(isManual) ? 1 : 2); + versionEntity.setCreateTimeEpoch(nowEpoch); + versionEntity.setTenantId(doc.getTenantId()); + + WpsDocEntity updated = wpsDocDomainService.completeSave(doc, versionEntity); + log.info("wps upload complete, body={}", JSON.toJSONString(body)); + return ok(wpsCmdConvertor.toFileCO(updated)); + } catch (BizException e) { + return fail(e); + } catch (Exception e) { + log.error("wps upload complete failed, fileId={}", fileId, e); + return fail(ErrorCode.FILE_UPLOAD_FAILED); + } + } + + @Override + public Map listVersions(String fileId) { + try { + WpsDocEntity doc = wpsDocDomainService.getByFileId(fileId); + List versions = wpsDocDomainService.listVersions(fileId); + List list = new ArrayList<>(); + for (WpsDocVersionEntity version : versions) { + WpsFileCO co = wpsCmdConvertor.toFileCO(version); + co.setCreatorId(doc.getCreatorId()); + co.setModifierId(version.getModifierId()); + list.add(co); + } + return ok(list); + } catch (BizException e) { + return fail(e); + } + } + + @Override + public Map getVersion(String fileId, Integer version) { + try { + WpsDocEntity doc = wpsDocDomainService.getByFileId(fileId); + WpsDocVersionEntity versionEntity = wpsDocDomainService.getVersion(fileId, version); + WpsFileCO co = wpsCmdConvertor.toFileCO(versionEntity); + co.setCreatorId(doc.getCreatorId()); + co.setModifierId(versionEntity.getModifierId()); + return ok(co); + } catch (BizException e) { + return fail(e); + } + } + + @Override + public Map getVersionDownload(String fileId, Integer version) { + try { + WpsDocVersionEntity versionEntity = wpsDocDomainService.getVersion(fileId, version); + Map data = new LinkedHashMap<>(); + data.put("url", resolveDownloadUrl(versionEntity.getDownloadUrl(), versionEntity.getResourceId())); + return ok(data); + } catch (BizException e) { + return fail(e); + } + } + + @Override + public Map rename(String fileId, Map body) { + try { + String name = body == null || body.get("name") == null ? null : String.valueOf(body.get("name")); + wpsDocDomainService.rename(fileId, name); + return ok(Collections.emptyMap()); + } catch (BizException e) { + return fail(e); + } + } + + @Override + public WpsDocOpenCO myOrCreate(String docxUrl) { + try { + Long userId = requireUserId(); + String creatorId = String.valueOf(userId); + WpsDocEntity existing = wpsDocDomainService.findLatestByCreatorId(creatorId); + if (existing != null) { + return toOpenCO(existing, false); + } + WpsDocEntity created = doCreateBlankDoc(userId, docxUrl); + return toOpenCO(created, true); + } catch (Exception e) { + log.error("wps myOrCreate failed", e); + throw new BizException(ErrorCode.UNKNOWN_ERROR); + } + } + + @Override + public WpsDocOpenCO createBlank(String docxUrl) { + try { + Long userId = requireUserId(); + WpsDocEntity created = doCreateBlankDoc(userId, docxUrl); + return toOpenCO(created, true); + } catch (Exception e) { + log.error("wps createBlank failed", e); + throw new BizException(ErrorCode.UNKNOWN_ERROR); + } + } + + protected WpsDocEntity doCreateBlankDoc(Long userId, String docxUrl) { + String resDocxUrl = !StringUtils.hasText(docxUrl) ? defDocxUrl : docxUrl; + if (!StringUtils.hasText(resDocxUrl)) { + throw new BizException(ErrorCode.WPS_BLANK_DOCX_URL_EMPTY); + } + Long orgId = requireOrgId(); + String creatorId = String.valueOf(userId); + String fileId = generateFileId(); + String docName = "未命名文档.docx"; + long nowEpoch = System.currentTimeMillis() / 1000; + + FileStorage saved; + try (InputStream inputStream = new URL(resDocxUrl).openStream()) { + FileInfo ossFileInfo = fileStorageService.of(inputStream, docName).upload(); + FileStorage fileStorage = FileStorageHelper.buildResource(ossFileInfo, docName, true); + saved = fileStorageDomainService.saveResource(fileStorage); + } catch (BizException e) { + throw e; + } catch (Exception e) { + log.error("download blank docx failed, url={}", resDocxUrl, e); + throw new BizException(ErrorCode.WPS_BLANK_DOCX_DOWNLOAD_FAILED, e); + } + + WpsDocEntity doc = new WpsDocEntity(); + doc.setFileId(fileId); + doc.setOrgId(orgId); + doc.setName(docName); + doc.setDocVersion(1); + doc.setSize(saved.getSize() == null ? 0L : saved.getSize()); + doc.setResourceId(saved.getId()); + doc.setDownloadUrl(saved.getUrl()); + doc.setCreatorId(creatorId); + doc.setModifierId(creatorId); + doc.setCreateTimeEpoch(nowEpoch); + doc.setModifyTimeEpoch(nowEpoch); + doc.setTenantId(AuthUserContextAdapter.getCurrentTenantId()); + + WpsDocVersionEntity versionEntity = new WpsDocVersionEntity(); + versionEntity.setOrgId(orgId); + versionEntity.setFileId(fileId); + versionEntity.setDocVersion(1); + versionEntity.setName(docName); + versionEntity.setSize(doc.getSize()); + versionEntity.setResourceId(saved.getId()); + versionEntity.setDownloadUrl(saved.getUrl()); + versionEntity.setModifierId(creatorId); + versionEntity.setManualFlag(1); + versionEntity.setCreateTimeEpoch(nowEpoch); + versionEntity.setTenantId(doc.getTenantId()); + + return wpsDocDomainService.createInitial(doc, versionEntity); + } + + private WpsDocOpenCO toOpenCO(WpsDocEntity doc, boolean created) { + WpsDocOpenCO co = new WpsDocOpenCO(); + co.setFileId(doc.getFileId()); + co.setName(doc.getName()); + co.setCreated(created); + return co; + } + + private String generateFileId() { + // 字母数字,不超过 47:wps + 32位uuid = 35 + return "wps" + UUID.randomUUID().toString().replace("-", ""); + } + + private Long requireUserId() { + Long userId = AuthUserContextAdapter.getCurrentUserId(); + if (userId == null) { + throw new BizException(ErrorCode.WPS_USER_NOT_LOGIN); + } + return userId; + } + + private Long requireOrgId() { + Long orgId = ThreadLocalUserInfoAdapter.get(); + if (orgId != null) { + return orgId; + } + if (RequestContextHolder.getRequestAttributes() instanceof ServletRequestAttributes) { + orgId = ThreadLocalUserInfoAdapter.getOrgId(); + } + if (orgId == null) { + throw new BizException(ErrorCode.ORG_INFO_NOT_FOUND); + } + return orgId; + } + + private String resolveDownloadUrl(String downloadUrl, Integer resourceId) { + if (StringUtils.hasText(downloadUrl)) { + return downloadUrl; + } + if (resourceId == null) { + throw new BizException(ErrorCode.FILE_NOT_FOUND); + } + FileStorage resource = fileStorageDomainService.getResource(resourceId); + return resource.getUrl(); + } + + private Map ok(Object data) { + Map resp = new LinkedHashMap<>(); + resp.put("code", 0); + resp.put("data", data); + return resp; + } + + private Map fail(BizException e) { + Map resp = new LinkedHashMap<>(); + resp.put("code", toWpsCode(e.getCode())); + resp.put("message", e.getMessage()); + return resp; + } + + private Map fail(ErrorCode errorCode) { + Map resp = new LinkedHashMap<>(); + resp.put("code", toWpsCode(errorCode.getCode())); + resp.put("message", errorCode.getMessage()); + return resp; + } + + private int toWpsCode(String errorCode) { + if (ErrorCode.WPS_DOC_NOT_FOUND.getCode().equals(errorCode) + || ErrorCode.WPS_VERSION_NOT_FOUND.getCode().equals(errorCode) + || ErrorCode.FILE_NOT_FOUND.getCode().equals(errorCode)) { + return 40004; + } + if (ErrorCode.WPS_USER_NOT_LOGIN.getCode().equals(errorCode)) { + return 40005; + } + return 40001; + } +} diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/review/executor/command/QualOnSiteReviewUpdateCmdExe.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/review/executor/command/QualOnSiteReviewUpdateCmdExe.java index 81bd266a..2fcb6829 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/review/executor/command/QualOnSiteReviewUpdateCmdExe.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/review/executor/command/QualOnSiteReviewUpdateCmdExe.java @@ -1,14 +1,32 @@ package org.qinan.safetyeval.app.review.executor.command; import com.alibaba.cola.exception.BizException; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.AllArgsConstructor; +import org.qinan.safetyeval.app.change.convertor.*; +import org.qinan.safetyeval.app.executor.QualFilingChangeExecutor; +import org.qinan.safetyeval.app.file.convertor.QualOnSiteReviewFileCmdConvertor; import org.qinan.safetyeval.app.review.convertor.QualOnSiteReviewCmdConvertor; +import org.qinan.safetyeval.client.dto.AggregationSaveOrEditQualFilingChangeCmd; +import org.qinan.safetyeval.client.file.request.QualOnSiteReviewFileAddCmd; +import org.qinan.safetyeval.client.review.request.QualOnSiteReviewResultUploadCmd; import org.qinan.safetyeval.client.review.request.QualOnSiteReviewUpdateCmd; +import org.qinan.safetyeval.domain.constant.QualFilingStatusEnum; +import org.qinan.safetyeval.domain.constant.QualOnSiteReviewStatusEnum; +import org.qinan.safetyeval.domain.entity.QualFilingEntity; +import org.qinan.safetyeval.domain.file.model.QualOnSiteReviewFileE; +import org.qinan.safetyeval.domain.gateway.QualFilingGateway; import org.qinan.safetyeval.domain.review.ability.QualOnSiteReviewAbility; import org.qinan.safetyeval.domain.review.model.QualOnSiteReviewE; +import org.qinan.safetyeval.infrastructure.dataobject.*; +import org.qinan.safetyeval.infrastructure.mapper.*; +import org.qinan.safetyeval.infrastructure.persistence.domainobject.QualOnSiteReviewDO; import org.qinan.safetyeval.infrastructure.persistence.queryservice.QualOnSiteReviewQueryService; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.util.List; /** * 修改资质现场核查资源执行器 @@ -22,6 +40,19 @@ public class QualOnSiteReviewUpdateCmdExe { private final QualOnSiteReviewQueryService qualOnSiteReviewQueryService; private final QualOnSiteReviewCmdConvertor qualOnSiteReviewCmdConvertor; private final QualOnSiteReviewAbility qualOnSiteReviewAbility; + private final QualOnSiteReviewFileCmdConvertor qualOnSiteReviewFileCmdConvertor; + private final QualFilingGateway qualFilingGateway; + private final QualFilingMapper qualFilingMapper; + private final QualFilingCommitmentMapper qualFilingCommitmentMapper; + private final QualFilingEquipmentMapper qualFilingEquipmentMapper; + private final QualFilingMaterialMapper qualFilingMaterialMapper; + private final QualFilingPersonnelMapper qualFilingPersonnelMapper; + private final QualFilingChangeExecutor qualFilingChangeExecutor; + private final QualFilingChangeCmdConvertor qualFilingChangeCmdConvertor; + private final QualFilingCommitmentChangeCmdConvertor qualFilingCommitmentChangeCmdConvertor; + private final QualFilingEquipmentChangeCmdConvertor qualFilingEquipmentChangeCmdConvertor; + private final QualFilingMaterialChangeCmdConvertor qualFilingMaterialChangeCmdConvertor; + private final QualFilingPersonnelChangeCmdConvertor qualFilingPersonnelChangeCmdConvertor; /** * 修改资质现场核查 @@ -38,4 +69,100 @@ public class QualOnSiteReviewUpdateCmdExe { } return true; } + + /** + * 审查结果上传 + *

+ * 1. 更新现场核查状态(通过/不通过)及审查意见 + * 2. 审查通过时,将对应备案记录状态更新为已备案 + * 3. 保存审查结果文件 + * + * @param cmd 审查结果上传对象 + * @return 结果 + */ + @Transactional(rollbackFor = Exception.class) + public boolean execute(QualOnSiteReviewResultUploadCmd cmd) { + QualOnSiteReviewDO reviewDO = qualOnSiteReviewQueryService.getById(cmd.getId()); + if (reviewDO == null) { + throw new BizException("资质现场核查记录不存在"); + } + + // 解析审查结论 + boolean passed = cmd.getReviewResult(); + String status = passed ? QualOnSiteReviewStatusEnum.REVIEW_PASSED.getCode() + : QualOnSiteReviewStatusEnum.REVIEW_FAILED.getCode(); + + // 更新现场核查状态及审查意见 + QualOnSiteReviewE reviewE = QualOnSiteReviewE.of(); + reviewE.setId(cmd.getId()); + reviewE.setStatus(status); + reviewE.setReviewOpinion(cmd.getReviewOpinion()); + Boolean updateRes = reviewE.update(); + if (!updateRes) { + throw new BizException("数据已被更新,请刷新重试"); + } + + // 审查通过时,更新备案状态为已备案 + if (passed && reviewDO.getBizId() != null) { + QualFilingEntity filingEntity = new QualFilingEntity(); + filingEntity.setId(reviewDO.getBizId()); + filingEntity.setFilingStatusCode(QualFilingStatusEnum.FILED.getCode()); + filingEntity.setFilingStatusName(QualFilingStatusEnum.FILED.getName()); + qualFilingGateway.modify(filingEntity); + + // 审核通过,同步生成资质变更记录 + passedSaveToChange(reviewDO.getOrgId()); + } + + // 保存审查结果文件 + saveFileList(cmd.getId(), cmd.getFileList()); + + return true; + } + + + private void saveFileList(Long reviewId, List fileList) { + if (CollectionUtils.isEmpty(fileList)) { + return; + } + for (QualOnSiteReviewFileAddCmd fileCmd : fileList) { + QualOnSiteReviewFileE fileE = qualOnSiteReviewFileCmdConvertor.convertCmdToE(fileCmd); + fileE.setQualOnSiteReviewId(reviewId); + boolean res = fileE.add(); + if (!res) { + throw new BizException("审查结果文件保存失败"); + } + } + } + + private void passedSaveToChange(Long orgId) { + // 基本信息 + QualFilingDO qualFilingDO = qualFilingMapper.selectByOrgIdLastOne(orgId); + if (qualFilingDO == null) { + throw new BizException("未找到该机构的资质备案记录"); + } + Long filingId = qualFilingDO.getId(); + + // 审核通过,需要新增资质变更记录 + AggregationSaveOrEditQualFilingChangeCmd cmdSync = new AggregationSaveOrEditQualFilingChangeCmd(); + + cmdSync.setQualFilingChangeAddCmd(qualFilingChangeCmdConvertor.convertDOToCmd(qualFilingDO)); + // 备案承诺书 + QualFilingCommitmentDO qualFilingCommitmentDO = qualFilingCommitmentMapper.selectOne(new LambdaQueryWrapper() + .eq(QualFilingCommitmentDO::getFilingId, filingId)); + cmdSync.setQualFilingCommitmentChangeAddCmd(qualFilingCommitmentChangeCmdConvertor.convertDOToCmd(qualFilingCommitmentDO)); + // 备案装备 + List qualFilingEquipmentDOs = qualFilingEquipmentMapper.selectList(new LambdaQueryWrapper() + .eq(QualFilingEquipmentDO::getFilingId, filingId)); + cmdSync.setQualFilingEquipmentChangeAddCmds(qualFilingEquipmentChangeCmdConvertor.convertDOListToCmdList(qualFilingEquipmentDOs)); + // 备案材料清单 + List qualFilingMaterialDOs = qualFilingMaterialMapper.selectList(new LambdaQueryWrapper() + .eq(QualFilingMaterialDO::getFilingId, filingId)); + cmdSync.setQualFilingMaterialChangeAddCmds(qualFilingMaterialChangeCmdConvertor.convertDOListToCmdList(qualFilingMaterialDOs)); + // 备案人员 + List qualFilingPersonnelDOs = qualFilingPersonnelMapper.selectList(new LambdaQueryWrapper() + .eq(QualFilingPersonnelDO::getFilingId, filingId)); + cmdSync.setQualFilingPersonnelChangeAddCmds(qualFilingPersonnelChangeCmdConvertor.convertDOListToCmdList(qualFilingPersonnelDOs)); + qualFilingChangeExecutor.aggregationSaveOrEdit(cmdSync, true); + } } diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/review/executor/query/QualOnSiteReviewPageQueryExe.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/review/executor/query/QualOnSiteReviewPageQueryExe.java index d41d43d5..944d30d3 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/review/executor/query/QualOnSiteReviewPageQueryExe.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/review/executor/query/QualOnSiteReviewPageQueryExe.java @@ -1,12 +1,21 @@ package org.qinan.safetyeval.app.review.executor.query; import com.alibaba.cola.dto.PageResponse; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.AllArgsConstructor; +import org.qinan.safetyeval.client.review.request.QualOnSiteReviewMonitorPageQry; +import org.qinan.safetyeval.client.review.request.QualOnSiteReviewOrgPageQry; import org.qinan.safetyeval.client.review.request.QualOnSiteReviewPageQry; import org.qinan.safetyeval.client.review.response.QualOnSiteReviewCo; +import org.qinan.safetyeval.client.review.response.QualOnSiteReviewMonitorCo; +import org.qinan.safetyeval.client.review.response.QualOnSiteReviewOrgCo; +import org.qinan.safetyeval.client.review.response.QualOnSiteReviewStatisticsCo; +import org.qinan.safetyeval.infrastructure.persistence.mapper.QualOnSiteReviewMapper; import org.qinan.safetyeval.infrastructure.persistence.queryservice.QualOnSiteReviewQueryService; import org.springframework.stereotype.Component; +import java.util.List; + /** * 资质现场核查分页查询执行器 * @@ -18,15 +27,50 @@ import org.springframework.stereotype.Component; public class QualOnSiteReviewPageQueryExe { private final QualOnSiteReviewQueryService qualOnSiteReviewQueryService; + private final QualOnSiteReviewMapper qualOnSiteReviewMapper; /** * 分页查找资质现场核查 * - * @param qualOnSiteReviewPageQry - * @return + * @param qualOnSiteReviewPageQry 查询条件 + * @return 结果集 */ public PageResponse execute(QualOnSiteReviewPageQry qualOnSiteReviewPageQry) { return qualOnSiteReviewQueryService.listQualOnSiteReviewPage(qualOnSiteReviewPageQry); } + /** + * 监管端分页查找资质现场核查(关联机构信息,直接返回Co) + * + * @param qry 查询条件 + * @return 结果集 + */ + public org.qinan.safetyeval.client.dto.PageResponse execute(QualOnSiteReviewMonitorPageQry qry) { + Page page = new Page<>(qry.getCurrent(), qry.getSize()); + List list = qualOnSiteReviewMapper.monitorPage(page, qry); + return org.qinan.safetyeval.client.dto.PageResponse.of(list, page.getTotal()); + } + + /** + * 机构端分页查找资质现场核查(按机构ID过滤,直接返回Co) + * + * @param qry 查询条件 + * @return 结果集 + */ + public org.qinan.safetyeval.client.dto.PageResponse execute(QualOnSiteReviewOrgPageQry qry) { + Page page = new Page<>(qry.getCurrent(), qry.getSize()); + List list = qualOnSiteReviewMapper.orgPage(page, qry); + return org.qinan.safetyeval.client.dto.PageResponse.of(list, page.getTotal()); + } + + /** + * 资质现场核查统计 + * + * @param orgId 机构ID(为空时统计全部) + * @return 统计结果 + */ + public QualOnSiteReviewStatisticsCo executeStatistics(Long orgId) { + return qualOnSiteReviewMapper.statistics(orgId); + } + } diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/review/service/QualOnSiteReviewServiceI.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/review/service/QualOnSiteReviewServiceI.java index 605bba69..7009e7b8 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/review/service/QualOnSiteReviewServiceI.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/review/service/QualOnSiteReviewServiceI.java @@ -2,9 +2,15 @@ package org.qinan.safetyeval.app.review.service; import com.alibaba.cola.dto.PageResponse; import org.qinan.safetyeval.client.review.request.QualOnSiteReviewAddCmd; +import org.qinan.safetyeval.client.review.request.QualOnSiteReviewMonitorPageQry; +import org.qinan.safetyeval.client.review.request.QualOnSiteReviewOrgPageQry; import org.qinan.safetyeval.client.review.request.QualOnSiteReviewPageQry; +import org.qinan.safetyeval.client.review.request.QualOnSiteReviewResultUploadCmd; import org.qinan.safetyeval.client.review.request.QualOnSiteReviewUpdateCmd; import org.qinan.safetyeval.client.review.response.QualOnSiteReviewCo; +import org.qinan.safetyeval.client.review.response.QualOnSiteReviewMonitorCo; +import org.qinan.safetyeval.client.review.response.QualOnSiteReviewOrgCo; +import org.qinan.safetyeval.client.review.response.QualOnSiteReviewStatisticsCo; /** * 资质现场核查 @@ -21,6 +27,22 @@ public interface QualOnSiteReviewServiceI { */ PageResponse listQualOnSiteReviewPage(QualOnSiteReviewPageQry qualOnSiteReviewPageQry); + /** + * 监管端分页获取资质现场核查列表(关联机构信息) + * + * @param qualOnSiteReviewMonitorPageQry 查找条件对象 + * @return 结果集 + */ + org.qinan.safetyeval.client.dto.PageResponse monitorPage(QualOnSiteReviewMonitorPageQry qualOnSiteReviewMonitorPageQry); + + /** + * 机构端分页获取资质现场核查列表(按机构ID过滤) + * + * @param qualOnSiteReviewOrgPageQry 查找条件对象 + * @return 结果集 + */ + org.qinan.safetyeval.client.dto.PageResponse orgPage(QualOnSiteReviewOrgPageQry qualOnSiteReviewOrgPageQry); + /** * 根据ID获取资质现场核查详情 * @@ -61,5 +83,21 @@ public interface QualOnSiteReviewServiceI { */ boolean deletedQualOnSiteReviewByIds(Long[] ids); + /** + * 审查结果上传 + * + * @param qualOnSiteReviewResultUploadCmd 审查结果上传对象 + * @return 结果 + */ + boolean uploadReviewResult(QualOnSiteReviewResultUploadCmd qualOnSiteReviewResultUploadCmd); + + /** + * 资质现场核查统计 + * + * @param orgId 机构ID(为空时统计全部) + * @return 统计结果 + */ + QualOnSiteReviewStatisticsCo statistics(Long orgId); + } diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/review/service/impl/QualOnSiteReviewServiceImpl.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/review/service/impl/QualOnSiteReviewServiceImpl.java index e9a1b351..d4f607b7 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/review/service/impl/QualOnSiteReviewServiceImpl.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/review/service/impl/QualOnSiteReviewServiceImpl.java @@ -9,9 +9,15 @@ import org.qinan.safetyeval.app.review.executor.query.QualOnSiteReviewListQueryE import org.qinan.safetyeval.app.review.executor.query.QualOnSiteReviewPageQueryExe; import org.qinan.safetyeval.app.review.service.QualOnSiteReviewServiceI; import org.qinan.safetyeval.client.review.request.QualOnSiteReviewAddCmd; +import org.qinan.safetyeval.client.review.request.QualOnSiteReviewMonitorPageQry; +import org.qinan.safetyeval.client.review.request.QualOnSiteReviewOrgPageQry; import org.qinan.safetyeval.client.review.request.QualOnSiteReviewPageQry; +import org.qinan.safetyeval.client.review.request.QualOnSiteReviewResultUploadCmd; import org.qinan.safetyeval.client.review.request.QualOnSiteReviewUpdateCmd; import org.qinan.safetyeval.client.review.response.QualOnSiteReviewCo; +import org.qinan.safetyeval.client.review.response.QualOnSiteReviewMonitorCo; +import org.qinan.safetyeval.client.review.response.QualOnSiteReviewOrgCo; +import org.qinan.safetyeval.client.review.response.QualOnSiteReviewStatisticsCo; import org.springframework.stereotype.Service; /** @@ -35,6 +41,16 @@ public class QualOnSiteReviewServiceImpl implements QualOnSiteReviewServiceI { return qualOnSiteReviewPageQueryExe.execute(qualOnSiteReviewPageQry); } + @Override + public org.qinan.safetyeval.client.dto.PageResponse monitorPage(QualOnSiteReviewMonitorPageQry qualOnSiteReviewMonitorPageQry) { + return qualOnSiteReviewPageQueryExe.execute(qualOnSiteReviewMonitorPageQry); + } + + @Override + public org.qinan.safetyeval.client.dto.PageResponse orgPage(QualOnSiteReviewOrgPageQry qualOnSiteReviewOrgPageQry) { + return qualOnSiteReviewPageQueryExe.execute(qualOnSiteReviewOrgPageQry); + } + @Override public QualOnSiteReviewCo getQualOnSiteReviewById(Long id) { return qualOnSiteReviewListQueryExe.execute(id); @@ -60,4 +76,14 @@ public class QualOnSiteReviewServiceImpl implements QualOnSiteReviewServiceI { return qualOnSiteReviewDelCommandExe.execute(ids); } + @Override + public boolean uploadReviewResult(QualOnSiteReviewResultUploadCmd qualOnSiteReviewResultUploadCmd) { + return qualOnSiteReviewUpdateCommandExe.execute(qualOnSiteReviewResultUploadCmd); + } + + @Override + public QualOnSiteReviewStatisticsCo statistics(Long orgId) { + return qualOnSiteReviewPageQueryExe.executeStatistics(orgId); + } + } diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/WpsApi.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/WpsApi.java new file mode 100644 index 00000000..6f32c498 --- /dev/null +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/WpsApi.java @@ -0,0 +1,49 @@ +package org.qinan.safetyeval.client.api; + +import org.qinan.safetyeval.client.co.WpsDocOpenCO; + +import java.io.InputStream; +import java.util.List; +import java.util.Map; + +/** + * WPS WebOffice 回调接口(Client层) + * + * @author safety-eval + */ +public interface WpsApi { + + Map getFileInfo(String fileId); + + Map getDownload(String fileId); + + Map getPermission(String fileId); + + Map getUsers(List userIds); + + Map uploadPrepare(String fileId); + + Map uploadAddress(String fileId, Map body); + + Map uploadComplete(String fileId, Map body); + + Map uploadBinary(String fileId, InputStream inputStream); + + Map listVersions(String fileId); + + Map getVersion(String fileId, Integer version); + + Map getVersionDownload(String fileId, Integer version); + + Map rename(String fileId, Map body); + + /** + * 打开页:当前用户有文档则返回最近一份,没有则创建空白 docx + */ + WpsDocOpenCO myOrCreate(String docxUrl); + + /** + * 始终新建一份空白 docx(即使用户已有文档) + */ + WpsDocOpenCO createBlank(String docxUrl); +} diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/WpsDocOpenCO.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/WpsDocOpenCO.java new file mode 100644 index 00000000..ee1a7650 --- /dev/null +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/WpsDocOpenCO.java @@ -0,0 +1,23 @@ +package org.qinan.safetyeval.client.co; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 打开/新建 WPS 文档返回 + * + * @author safety-eval + */ +@Data +public class WpsDocOpenCO { + + /** WPS file_id,唯一 */ + @ApiModelProperty(value = "WPS file_id,唯一") + private String fileId; + /** 文档名称 */ + @ApiModelProperty(value = "文档名称") + private String name; + /** 是否本次新建 */ + @ApiModelProperty(value = "是否本次新建") + private Boolean created; +} diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/WpsFileCO.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/WpsFileCO.java new file mode 100644 index 00000000..e6b45ea3 --- /dev/null +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/WpsFileCO.java @@ -0,0 +1,30 @@ +package org.qinan.safetyeval.client.co; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * WPS 文件信息 CO(官方字段 snake_case) + * + * @author safety-eval + */ +@Data +public class WpsFileCO { + + private String id; + private String name; + private Integer version; + private Long size; + + @JsonProperty("create_time") + private Long createTime; + + @JsonProperty("modify_time") + private Long modifyTime; + + @JsonProperty("creator_id") + private String creatorId; + + @JsonProperty("modifier_id") + private String modifierId; +} diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/WpsPermissionCO.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/WpsPermissionCO.java new file mode 100644 index 00000000..8792930f --- /dev/null +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/WpsPermissionCO.java @@ -0,0 +1,26 @@ +package org.qinan.safetyeval.client.co; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * WPS 文档权限 CO(与官方 permission 回调字段一致) + * + * @author safety-eval + */ +@Data +public class WpsPermissionCO { + + @JsonProperty("user_id") + private String userId; + + private Integer read; + private Integer update; + private Integer download; + private Integer rename; + private Integer history; + private Integer copy; + private Integer print; + private Integer saveas; + private Integer comment; +} diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/WpsUserCO.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/WpsUserCO.java new file mode 100644 index 00000000..3c80aee9 --- /dev/null +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/WpsUserCO.java @@ -0,0 +1,19 @@ +package org.qinan.safetyeval.client.co; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * WPS 用户信息 CO + * + * @author safety-eval + */ +@Data +public class WpsUserCO { + + private String id; + private String name; + + @JsonProperty("avatar_url") + private String avatarUrl; +} diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/file/request/QualOnSiteReviewFileAddCmd.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/file/request/QualOnSiteReviewFileAddCmd.java index 5faaf765..77443125 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/file/request/QualOnSiteReviewFileAddCmd.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/file/request/QualOnSiteReviewFileAddCmd.java @@ -32,4 +32,10 @@ public class QualOnSiteReviewFileAddCmd implements Serializable { @NotBlank(message = "文件url不能为空") @Size(max = 1024, message = "文件url不能超过1024个字符") private String fileUrl; + + /** + * 审查意见 + */ + @ApiModelProperty(value = "审查意见") + private String reviewOpinion; } diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/file/request/QualOnSiteReviewFileUpdateCmd.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/file/request/QualOnSiteReviewFileUpdateCmd.java index 4fde4644..153218bb 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/file/request/QualOnSiteReviewFileUpdateCmd.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/file/request/QualOnSiteReviewFileUpdateCmd.java @@ -36,4 +36,10 @@ public class QualOnSiteReviewFileUpdateCmd implements Serializable { @NotBlank(message = "文件url不能为空") @Size(max = 1024, message = "文件url不能超过1024个字符") private String fileUrl; + + /** + * 审查意见 + */ + @ApiModelProperty(value = "审查意见") + private String reviewOpinion; } diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/file/response/QualOnSiteReviewFileCo.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/file/response/QualOnSiteReviewFileCo.java index 1f529a66..5e3bb126 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/file/response/QualOnSiteReviewFileCo.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/file/response/QualOnSiteReviewFileCo.java @@ -31,6 +31,11 @@ public class QualOnSiteReviewFileCo extends ClientObject { */ @ApiModelProperty(value = "文件url") private String fileUrl; + /** + * 审查意见 + */ + @ApiModelProperty(value = "审查意见") + private String reviewOpinion; /** * 环境 */ diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/request/QualOnSiteReviewAddCmd.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/request/QualOnSiteReviewAddCmd.java index 3ce7234b..2f40f706 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/request/QualOnSiteReviewAddCmd.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/request/QualOnSiteReviewAddCmd.java @@ -2,8 +2,10 @@ package org.qinan.safetyeval.client.review.request; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.qinan.safetyeval.domain.constant.QualOnSiteReviewStatusEnum; import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; import java.io.Serializable; import java.time.LocalDateTime; @@ -21,7 +23,14 @@ public class QualOnSiteReviewAddCmd implements Serializable { * 资质类型:add 新增 ,change:变更 */ @ApiModelProperty(value = "资质类型:add 新增 ,change:变更") + @Size(max = 64, message = "资质类型不能超过64个字符") private String bizType; + /** + * 受审查机构ID (关联机构表) + */ + @ApiModelProperty(value = "受审查机构ID (关联机构表)", required = true) + @NotNull(message = "受审查机构ID不能为空") + private Long orgId; /** * 业务id */ @@ -37,11 +46,13 @@ public class QualOnSiteReviewAddCmd implements Serializable { * 审查地点 */ @ApiModelProperty(value = "审查地点") + @Size(max = 512, message = "审查地点不能超过512个字符") private String reviewLocation; /** * 审查组成员名单 */ @ApiModelProperty(value = "审查组成员名单") + @Size(max = 512, message = "审查组成员名单不能超过512个字符") private String reviewMembers; /** * 材料准备要求 @@ -52,22 +63,25 @@ public class QualOnSiteReviewAddCmd implements Serializable { * 监管联系人姓名 */ @ApiModelProperty(value = "监管联系人姓名") + @Size(max = 64, message = "监管联系人姓名不能超过64个字符") private String supervisorContact; /** * 监管联系电话 */ @ApiModelProperty(value = "监管联系电话") + @Size(max = 32, message = "监管联系电话不能超过32个字符") private String contactPhone; /** * 现场审查状态(AGENCY_PENDING_CONFIRMATION机构待确认、AGENCY_CONFIRMED机构已确认、REVIEW_PASSED核查通过、REVIEW_FAILED核查不通过) */ - @ApiModelProperty(value = "现场审查状态(AGENCY_PENDING_CONFIRMATION机构待确认、AGENCY_CONFIRMED机构已确认、REVIEW_PASSED核查通过、REVIEW_FAILED核查不通过)", required = true) - @NotNull(message = "现场审查状态(AGENCY_PENDING_CONFIRMATION机构待确认、AGENCY_CONFIRMED机构已确认、REVIEW_PASSED核查通过、REVIEW_FAILED核查不通过)不能为空") - private Long status; + @ApiModelProperty(value = QualOnSiteReviewStatusEnum.REMARKS, required = true) + @NotNull(message = "现场审查状态不能为空") + @Size(max = 64, message = "现场审查状态不能超过64个字符") + private String status; /** - * 环境 + * 审查意见 */ - @ApiModelProperty(value = "环境") - private String env; - + @ApiModelProperty(value = "审查意见") + @Size(max = 256, message = "审查意见不能超过256个字符") + private String reviewOpinion; } diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/request/QualOnSiteReviewMonitorPageQry.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/request/QualOnSiteReviewMonitorPageQry.java new file mode 100644 index 00000000..d7bac760 --- /dev/null +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/request/QualOnSiteReviewMonitorPageQry.java @@ -0,0 +1,45 @@ +package org.qinan.safetyeval.client.review.request; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.qinan.safetyeval.client.dto.BasePageQuery; + +import java.time.LocalDateTime; + +/** + * 资质现场核查监管端分页查询Qry + * + * @Author: ltq + * @date 2026-07-20 15:17:00 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class QualOnSiteReviewMonitorPageQry extends BasePageQuery { + private static final long serialVersionUID = 1L; + + /** + * 机构名称(模糊查询) + */ + @ApiModelProperty(value = "机构名称(模糊查询)") + private String unitName; + + /** + * 现场审查状态(AGENCY_PENDING_CONFIRMATION机构待确认、AGENCY_CONFIRMED机构已确认、REVIEW_PASSED核查通过、REVIEW_FAILED核查不通过) + */ + @ApiModelProperty(value = "现场审查状态(AGENCY_PENDING_CONFIRMATION机构待确认、AGENCY_CONFIRMED机构已确认、REVIEW_PASSED核查通过、REVIEW_FAILED核查不通过)") + private String status; + + /** + * 现场审查开始时间-起始 + */ + @ApiModelProperty(value = "现场审查开始时间-起始") + private LocalDateTime reviewDateStartBegin; + + /** + * 现场审查开始时间-结束 + */ + @ApiModelProperty(value = "现场审查开始时间-结束") + private LocalDateTime reviewDateStartEnd; + +} diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/request/QualOnSiteReviewOrgPageQry.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/request/QualOnSiteReviewOrgPageQry.java new file mode 100644 index 00000000..35881532 --- /dev/null +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/request/QualOnSiteReviewOrgPageQry.java @@ -0,0 +1,47 @@ +package org.qinan.safetyeval.client.review.request; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.qinan.safetyeval.client.dto.BasePageQuery; + +import java.time.LocalDateTime; + +/** + * 资质现场核查机构端分页查询Qry + * + * @Author: ltq + * @date 2026-07-20 15:17:00 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class QualOnSiteReviewOrgPageQry extends BasePageQuery { + private static final long serialVersionUID = 1L; + + /** + * 机构ID + */ + @ApiModelProperty(value = "机构ID", hidden = true) + @JsonFormat(shape = JsonFormat.Shape.STRING) + private Long orgId; + + /** + * 现场审查状态(AGENCY_PENDING_CONFIRMATION机构待确认、AGENCY_CONFIRMED机构已确认、REVIEW_PASSED核查通过、REVIEW_FAILED核查不通过) + */ + @ApiModelProperty(value = "现场审查状态(AGENCY_PENDING_CONFIRMATION机构待确认、AGENCY_CONFIRMED机构已确认、REVIEW_PASSED核查通过、REVIEW_FAILED核查不通过)") + private String status; + + /** + * 现场审查开始时间-起始 + */ + @ApiModelProperty(value = "现场审查开始时间-起始") + private LocalDateTime reviewDateStartBegin; + + /** + * 现场审查开始时间-结束 + */ + @ApiModelProperty(value = "现场审查开始时间-结束") + private LocalDateTime reviewDateStartEnd; + +} diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/request/QualOnSiteReviewPageQry.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/request/QualOnSiteReviewPageQry.java index e365d97e..741626c8 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/request/QualOnSiteReviewPageQry.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/request/QualOnSiteReviewPageQry.java @@ -50,7 +50,7 @@ public class QualOnSiteReviewPageQry extends PageQuery { * 现场审查状态(AGENCY_PENDING_CONFIRMATION机构待确认、AGENCY_CONFIRMED机构已确认、REVIEW_PASSED核查通过、REVIEW_FAILED核查不通过) */ @ApiModelProperty(value = "现场审查状态(AGENCY_PENDING_CONFIRMATION机构待确认、AGENCY_CONFIRMED机构已确认、REVIEW_PASSED核查通过、REVIEW_FAILED核查不通过)") - private Long status; + private String status; /** * 环境 */ diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/request/QualOnSiteReviewResultUploadCmd.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/request/QualOnSiteReviewResultUploadCmd.java new file mode 100644 index 00000000..dcf03454 --- /dev/null +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/request/QualOnSiteReviewResultUploadCmd.java @@ -0,0 +1,43 @@ +package org.qinan.safetyeval.client.review.request; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.qinan.safetyeval.client.file.request.QualOnSiteReviewFileAddCmd; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.util.List; + +/** + * 资质现场核查-审查结果上传Cmd + * + * @Author: ltq + * @date 2026-07-20 15:17:00 + */ +@Data +public class QualOnSiteReviewResultUploadCmd implements Serializable { + private static final long serialVersionUID = 1L; + + @JsonFormat(shape = JsonFormat.Shape.STRING) + @NotNull(message = "资质现场核查id不能为空") + @ApiModelProperty(value = "资质现场核查id", required = true) + private Long id; + + @NotBlank(message = "审查结论不能为空") + @ApiModelProperty(value = "审查结论:true通过/false不通过", required = true) + @NotNull + private Boolean reviewResult; + + @ApiModelProperty(value = "审查意见") + private String reviewOpinion; + + @ApiModelProperty(value = "审查结果文件") + @NotNull + @Size(max = 100) + @Valid + private List fileList; +} diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/request/QualOnSiteReviewUpdateCmd.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/request/QualOnSiteReviewUpdateCmd.java index b31096ed..ae55cc90 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/request/QualOnSiteReviewUpdateCmd.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/request/QualOnSiteReviewUpdateCmd.java @@ -3,8 +3,10 @@ package org.qinan.safetyeval.client.review.request; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.qinan.safetyeval.domain.constant.QualOnSiteReviewStatusEnum; import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; import java.io.Serializable; import java.time.LocalDateTime; @@ -18,11 +20,13 @@ import java.time.LocalDateTime; public class QualOnSiteReviewUpdateCmd implements Serializable { private static final long serialVersionUID = 1L; @JsonFormat(shape = JsonFormat.Shape.STRING) + @NotNull(message = "id不能为空") private Long id; /** * 资质类型:add 新增 ,change:变更 */ @ApiModelProperty(value = "资质类型:add 新增 ,change:变更") + @Size(max = 64, message = "资质类型不能超过64个字符") private String bizType; /** * 业务id @@ -33,17 +37,20 @@ public class QualOnSiteReviewUpdateCmd implements Serializable { * 现场审查开始时间 */ @ApiModelProperty(value = "现场审查开始时间", required = true) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm") @NotNull(message = "现场审查开始时间不能为空") private LocalDateTime reviewDateStart; /** * 审查地点 */ @ApiModelProperty(value = "审查地点") + @Size(max = 512, message = "审查地点不能超过512个字符") private String reviewLocation; /** * 审查组成员名单 */ @ApiModelProperty(value = "审查组成员名单") + @Size(max = 512, message = "审查组成员名单不能超过512个字符") private String reviewMembers; /** * 材料准备要求 @@ -54,24 +61,25 @@ public class QualOnSiteReviewUpdateCmd implements Serializable { * 监管联系人姓名 */ @ApiModelProperty(value = "监管联系人姓名") + @Size(max = 64, message = "监管联系人姓名不能超过64个字符") private String supervisorContact; /** * 监管联系电话 */ @ApiModelProperty(value = "监管联系电话") + @Size(max = 32, message = "监管联系电话不能超过32个字符") private String contactPhone; /** * 现场审查状态(AGENCY_PENDING_CONFIRMATION机构待确认、AGENCY_CONFIRMED机构已确认、REVIEW_PASSED核查通过、REVIEW_FAILED核查不通过) */ - @ApiModelProperty(value = "现场审查状态(AGENCY_PENDING_CONFIRMATION机构待确认、AGENCY_CONFIRMED机构已确认、REVIEW_PASSED核查通过、REVIEW_FAILED核查不通过)", required = true) - @NotNull(message = "现场审查状态(AGENCY_PENDING_CONFIRMATION机构待确认、AGENCY_CONFIRMED机构已确认、REVIEW_PASSED核查通过、REVIEW_FAILED核查不通过)不能为空") - private Long status; + @ApiModelProperty(value = QualOnSiteReviewStatusEnum.REMARKS, required = true) + @NotNull(message = QualOnSiteReviewStatusEnum.REMARKS + "不能为空") + @Size(max = 64, message = "现场审查状态不能超过64个字符") + private String status; /** - * 环境 + * 审查意见 */ - @ApiModelProperty(value = "环境") - private String env; - @NotNull(message = "version不能为空") - @ApiModelProperty(value = "version") - private Integer version; + @ApiModelProperty(value = "审查意见") + @Size(max = 256, message = "审查意见不能超过256个字符") + private String reviewOpinion; } diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/response/QualOnSiteReviewCo.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/response/QualOnSiteReviewCo.java index 9cfc2363..f1c66112 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/response/QualOnSiteReviewCo.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/response/QualOnSiteReviewCo.java @@ -23,6 +23,12 @@ public class QualOnSiteReviewCo extends ClientObject { */ @ApiModelProperty(value = "资质类型:add 新增 ,change:变更") private String bizType; + /** + * 受审查机构ID (关联机构表) + */ + @ApiModelProperty(value = "受审查机构ID (关联机构表)") + @JsonFormat(shape = JsonFormat.Shape.STRING) + private Long orgId; /** * 业务id */ @@ -63,7 +69,12 @@ public class QualOnSiteReviewCo extends ClientObject { * 现场审查状态(AGENCY_PENDING_CONFIRMATION机构待确认、AGENCY_CONFIRMED机构已确认、REVIEW_PASSED核查通过、REVIEW_FAILED核查不通过) */ @ApiModelProperty(value = "现场审查状态(AGENCY_PENDING_CONFIRMATION机构待确认、AGENCY_CONFIRMED机构已确认、REVIEW_PASSED核查通过、REVIEW_FAILED核查不通过)") - private Long status; + private String status; + /** + * 审查意见 + */ + @ApiModelProperty(value = "审查意见") + private String reviewOpinion; /** * 环境 */ diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/response/QualOnSiteReviewMonitorCo.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/response/QualOnSiteReviewMonitorCo.java new file mode 100644 index 00000000..5716836b --- /dev/null +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/response/QualOnSiteReviewMonitorCo.java @@ -0,0 +1,89 @@ +package org.qinan.safetyeval.client.review.response; + +import com.alibaba.cola.dto.ClientObject; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +/** + * 资质现场核查监管端Co + * + * @Author: ltq + * @date 2026-07-20 15:17:00 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class QualOnSiteReviewMonitorCo extends ClientObject { + private static final long serialVersionUID = 1L; + + @JsonFormat(shape = JsonFormat.Shape.STRING) + private Long id; + /** + * 资质类型:add 新增 ,change:变更 + */ + @ApiModelProperty(value = "资质类型:add 新增 ,change:变更") + private String bizType; + /** + * 业务id + */ + @ApiModelProperty(value = "业务id") + private Long bizId; + /** + * 现场审查开始时间 + */ + @ApiModelProperty(value = "现场审查开始时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private LocalDateTime reviewDateStart; + /** + * 审查地点 + */ + @ApiModelProperty(value = "审查地点") + private String reviewLocation; + /** + * 审查组成员名单 + */ + @ApiModelProperty(value = "审查组成员名单") + private String reviewMembers; + /** + * 材料准备要求 + */ + @ApiModelProperty(value = "材料准备要求") + private String materialRequirements; + /** + * 监管联系人姓名 + */ + @ApiModelProperty(value = "监管联系人姓名") + private String supervisorContact; + /** + * 监管联系电话 + */ + @ApiModelProperty(value = "监管联系电话") + private String contactPhone; + /** + * 现场审查状态(AGENCY_PENDING_CONFIRMATION机构待确认、AGENCY_CONFIRMED机构已确认、REVIEW_PASSED核查通过、REVIEW_FAILED核查不通过) + */ + @ApiModelProperty(value = "现场审查状态(AGENCY_PENDING_CONFIRMATION机构待确认、AGENCY_CONFIRMED机构已确认、REVIEW_PASSED核查通过、REVIEW_FAILED核查不通过)") + private String status; + /** + * 审查意见 + */ + @ApiModelProperty(value = "审查意见") + private String reviewOpinion; + /** + * 环境 + */ + @ApiModelProperty(value = "环境") + private String env; + @ApiModelProperty(value = "version") + private Integer version; + + /** + * 机构名称 + */ + @ApiModelProperty(value = "机构名称") + private String unitName; + +} diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/response/QualOnSiteReviewOrgCo.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/response/QualOnSiteReviewOrgCo.java new file mode 100644 index 00000000..9c2c31a2 --- /dev/null +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/response/QualOnSiteReviewOrgCo.java @@ -0,0 +1,81 @@ +package org.qinan.safetyeval.client.review.response; + +import com.alibaba.cola.dto.ClientObject; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 资质现场核查机构端Co + * + * @Author: ltq + * @date 2026-07-20 15:17:00 + */ +@Data +public class QualOnSiteReviewOrgCo extends ClientObject { + private static final long serialVersionUID = 1L; + + @JsonFormat(shape = JsonFormat.Shape.STRING) + private Long id; + /** + * 资质类型:add 新增 ,change:变更 + */ + @ApiModelProperty(value = "资质类型:add 新增 ,change:变更") + private String bizType; + /** + * 业务id + */ + @ApiModelProperty(value = "业务id") + @JsonFormat(shape = JsonFormat.Shape.STRING) + private Long bizId; + /** + * 现场审查开始时间 + */ + @ApiModelProperty(value = "现场审查开始时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private LocalDateTime reviewDateStart; + /** + * 审查地点 + */ + @ApiModelProperty(value = "审查地点") + private String reviewLocation; + /** + * 审查组成员名单 + */ + @ApiModelProperty(value = "审查组成员名单") + private String reviewMembers; + /** + * 材料准备要求 + */ + @ApiModelProperty(value = "材料准备要求") + private String materialRequirements; + /** + * 监管联系人姓名 + */ + @ApiModelProperty(value = "监管联系人姓名") + private String supervisorContact; + /** + * 监管联系电话 + */ + @ApiModelProperty(value = "监管联系电话") + private String contactPhone; + /** + * 现场审查状态(AGENCY_PENDING_CONFIRMATION机构待确认、AGENCY_CONFIRMED机构已确认、REVIEW_PASSED核查通过、REVIEW_FAILED核查不通过) + */ + @ApiModelProperty(value = "现场审查状态(AGENCY_PENDING_CONFIRMATION机构待确认、AGENCY_CONFIRMED机构已确认、REVIEW_PASSED核查通过、REVIEW_FAILED核查不通过)") + private String status; + /** + * 审查意见 + */ + @ApiModelProperty(value = "审查意见") + private String reviewOpinion; + /** + * 环境 + */ + @ApiModelProperty(value = "环境") + private String env; + @ApiModelProperty(value = "version") + private Integer version; +} diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/response/QualOnSiteReviewStatisticsCo.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/response/QualOnSiteReviewStatisticsCo.java new file mode 100644 index 00000000..df7f9398 --- /dev/null +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/review/response/QualOnSiteReviewStatisticsCo.java @@ -0,0 +1,30 @@ +package org.qinan.safetyeval.client.review.response; + +import com.alibaba.cola.dto.ClientObject; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 资质现场核查统计Co + * + * @Author: ltq + * @Date: 2026-07-21 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class QualOnSiteReviewStatisticsCo extends ClientObject { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "通知总数") + private Integer totalCount; + + @ApiModelProperty(value = "本年度累计") + private Integer annualCumulativeCount; + + @ApiModelProperty(value = "未来30日待开展的审查") + private Integer pendingReviewNextThirtyDaysCount; + + @ApiModelProperty(value = "已完成审查结果已归档") + private Integer completedArchivedCount; +} diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/entity/WpsDocEntity.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/entity/WpsDocEntity.java new file mode 100644 index 00000000..98478d9a --- /dev/null +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/entity/WpsDocEntity.java @@ -0,0 +1,33 @@ +package org.qinan.safetyeval.domain.entity; + +import lombok.Data; + +/** + * WPS 在线文档领域实体 + * + * @author safety-eval + */ +@Data +public class WpsDocEntity { + + private Long id; + private String fileId; + private Long orgId; + private String name; + private Integer docVersion; + private Long size; + private Integer resourceId; + private String downloadUrl; + private String creatorId; + private String modifierId; + private Long createTimeEpoch; + private Long modifyTimeEpoch; + private Long tenantId; + + /** 三阶段上传待确认 filestorage.id */ + private Integer pendingResourceId; + /** 三阶段上传待确认 URL */ + private String pendingDownloadUrl; + /** 三阶段上传待确认大小 */ + private Long pendingSize; +} diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/entity/WpsDocVersionEntity.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/entity/WpsDocVersionEntity.java new file mode 100644 index 00000000..361d8a8f --- /dev/null +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/entity/WpsDocVersionEntity.java @@ -0,0 +1,27 @@ +package org.qinan.safetyeval.domain.entity; + +import lombok.Data; + +/** + * WPS 文档版本领域实体 + * + * @author safety-eval + */ +@Data +public class WpsDocVersionEntity { + + private Long id; + private Long orgId; + private String fileId; + private Integer docVersion; + private String name; + private Long size; + private Integer resourceId; + private String downloadUrl; + private String digestSha1; + private String modifierId; + /** 1手动保存 2自动保存 */ + private Integer manualFlag; + private Long createTimeEpoch; + private Long tenantId; +} diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/exception/ErrorCode.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/exception/ErrorCode.java index afb39128..f31e49e2 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/exception/ErrorCode.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/exception/ErrorCode.java @@ -94,6 +94,15 @@ public enum ErrorCode { FILE_URL_GENERATE_FAILED("03-01-007", "文件地址生成失败"), FILE_SIZE_EXCEEDED("03-01-008", "文件大小超出限制"), + // ---- WPS ---- + WPS_DOC_NOT_FOUND("05-01-001", "WPS文档不存在"), + WPS_USER_NOT_LOGIN("05-01-002", "WPS用户未登录"), + WPS_UPLOAD_PENDING_NOT_FOUND("05-01-003", "WPS上传结果不存在"), + WPS_VERSION_NOT_FOUND("05-01-004", "WPS文档版本不存在"), + WPS_DOC_NAME_INVALID("05-01-005", "WPS文档名称不合法"), + WPS_BLANK_DOCX_URL_EMPTY("05-01-006", "WPS空白模板地址未配置"), + WPS_BLANK_DOCX_DOWNLOAD_FAILED("05-01-007", "WPS空白模板下载失败"), + /** * 短信码不存在 diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/file/model/QualOnSiteReviewFileE.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/file/model/QualOnSiteReviewFileE.java index 101d04ac..cd8ccad6 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/file/model/QualOnSiteReviewFileE.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/file/model/QualOnSiteReviewFileE.java @@ -32,6 +32,10 @@ public class QualOnSiteReviewFileE extends BaseE { * 文件url */ private String fileUrl; + /** + * 审查意见 + */ + private String reviewOpinion; /** * 环境 */ diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/AccountGateway.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/AccountGateway.java index 564727c7..cd4cec76 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/AccountGateway.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/AccountGateway.java @@ -4,6 +4,8 @@ import org.qinan.safetyeval.domain.entity.AccountEntity; import org.qinan.safetyeval.domain.query.AccountQuery; import org.qinan.safetyeval.domain.query.PageResult; +import java.util.List; + /** * 用户Gateway接口(Domain层定义) * @@ -24,4 +26,6 @@ public interface AccountGateway { PageResult page(AccountQuery query); AccountEntity foundByPhone(String phone); + + List listByIds(List ids); } diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/WpsDocGateway.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/WpsDocGateway.java new file mode 100644 index 00000000..e07f85a8 --- /dev/null +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/WpsDocGateway.java @@ -0,0 +1,27 @@ +package org.qinan.safetyeval.domain.gateway; + +import org.qinan.safetyeval.domain.entity.WpsDocEntity; + +/** + * WPS 文档 Gateway + * + * @author safety-eval + */ +public interface WpsDocGateway { + + WpsDocEntity getByFileId(String fileId); + + /** + * 当前用户最近一份文档(按 id 倒序) + */ + WpsDocEntity getLatestByCreatorId(String creatorId); + + WpsDocEntity save(WpsDocEntity entity); + + WpsDocEntity modify(WpsDocEntity entity); + + /** + * 清空三阶段上传 pending 字段(需显式写 null) + */ + void clearPending(Long id); +} diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/WpsDocVersionGateway.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/WpsDocVersionGateway.java new file mode 100644 index 00000000..c590f990 --- /dev/null +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/WpsDocVersionGateway.java @@ -0,0 +1,19 @@ +package org.qinan.safetyeval.domain.gateway; + +import org.qinan.safetyeval.domain.entity.WpsDocVersionEntity; + +import java.util.List; + +/** + * WPS 文档版本 Gateway + * + * @author safety-eval + */ +public interface WpsDocVersionGateway { + + WpsDocVersionEntity save(WpsDocVersionEntity entity); + + WpsDocVersionEntity getByFileIdAndVersion(String fileId, Integer docVersion); + + List listByFileIdDesc(String fileId); +} diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/review/model/QualOnSiteReviewE.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/review/model/QualOnSiteReviewE.java index 6262864b..4501a404 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/review/model/QualOnSiteReviewE.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/review/model/QualOnSiteReviewE.java @@ -57,7 +57,11 @@ public class QualOnSiteReviewE extends BaseE { /** * 现场审查状态(AGENCY_PENDING_CONFIRMATION机构待确认、AGENCY_CONFIRMED机构已确认、REVIEW_PASSED核查通过、REVIEW_FAILED核查不通过) */ - private Long status; + private String status; + /** + * 审查意见 + */ + private String reviewOpinion; /** * 环境 */ diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/service/WpsDocDomainService.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/service/WpsDocDomainService.java new file mode 100644 index 00000000..63634c14 --- /dev/null +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/service/WpsDocDomainService.java @@ -0,0 +1,108 @@ +package org.qinan.safetyeval.domain.service; + +import org.qinan.safetyeval.domain.entity.WpsDocEntity; +import org.qinan.safetyeval.domain.entity.WpsDocVersionEntity; +import org.qinan.safetyeval.domain.exception.BizException; +import org.qinan.safetyeval.domain.exception.ErrorCode; +import org.qinan.safetyeval.domain.gateway.WpsDocGateway; +import org.qinan.safetyeval.domain.gateway.WpsDocVersionGateway; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; + +import javax.annotation.Resource; +import java.util.List; +import java.util.regex.Pattern; + +/** + * WPS 文档领域服务 + * + * @author safety-eval + */ +@Service +public class WpsDocDomainService { + + private static final Pattern INVALID_NAME_CHARS = Pattern.compile("[\\\\/|:\"*?<>]"); + + @Resource + private WpsDocGateway wpsDocGateway; + @Resource + private WpsDocVersionGateway wpsDocVersionGateway; + + public WpsDocEntity getByFileId(String fileId) { + WpsDocEntity entity = wpsDocGateway.getByFileId(fileId); + if (entity == null) { + throw new BizException(ErrorCode.WPS_DOC_NOT_FOUND); + } + return entity; + } + + /** + * 当前用户最近一份文档,没有则返回 null + */ + public WpsDocEntity findLatestByCreatorId(String creatorId) { + return wpsDocGateway.getLatestByCreatorId(creatorId); + } + + /** + * 初始化文档主表 + 首个版本 + */ + @Transactional(rollbackFor = Exception.class) + public WpsDocEntity createInitial(WpsDocEntity doc, WpsDocVersionEntity versionEntity) { + WpsDocEntity saved = wpsDocGateway.save(doc); + versionEntity.setFileId(saved.getFileId()); + versionEntity.setOrgId(saved.getOrgId()); + versionEntity.setTenantId(saved.getTenantId()); + wpsDocVersionGateway.save(versionEntity); + return saved; + } + + public List listVersions(String fileId) { + getByFileId(fileId); + return wpsDocVersionGateway.listByFileIdDesc(fileId); + } + + public WpsDocVersionEntity getVersion(String fileId, Integer docVersion) { + getByFileId(fileId); + WpsDocVersionEntity version = wpsDocVersionGateway.getByFileIdAndVersion(fileId, docVersion); + if (version == null) { + throw new BizException(ErrorCode.WPS_VERSION_NOT_FOUND); + } + return version; + } + + /** + * 三阶段 PUT 上传成功后写入 pending + */ + public WpsDocEntity savePendingUpload(String fileId, Integer resourceId, String downloadUrl, Long size) { + WpsDocEntity doc = getByFileId(fileId); + doc.setPendingResourceId(resourceId); + doc.setPendingDownloadUrl(downloadUrl); + doc.setPendingSize(size); + return wpsDocGateway.modify(doc); + } + + /** + * 保存完成后更新主表、写入版本记录,并清空 pending + */ + @Transactional(rollbackFor = Exception.class) + public WpsDocEntity completeSave(WpsDocEntity latest, WpsDocVersionEntity versionEntity) { + WpsDocEntity updated = wpsDocGateway.modify(latest); + wpsDocVersionGateway.save(versionEntity); + wpsDocGateway.clearPending(updated.getId()); + return wpsDocGateway.getByFileId(updated.getFileId()); + } + + /** + * 重命名文档 + */ + public WpsDocEntity rename(String fileId, String name) { + if (!StringUtils.hasText(name) || name.length() > 240 || INVALID_NAME_CHARS.matcher(name).find()) { + throw new BizException(ErrorCode.WPS_DOC_NAME_INVALID); + } + WpsDocEntity doc = getByFileId(fileId); + doc.setName(name.trim()); + doc.setModifyTimeEpoch(System.currentTimeMillis() / 1000); + return wpsDocGateway.modify(doc); + } +} diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/convertor/WpsDocDoConvertor.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/convertor/WpsDocDoConvertor.java new file mode 100644 index 00000000..e693cc0e --- /dev/null +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/convertor/WpsDocDoConvertor.java @@ -0,0 +1,18 @@ +package org.qinan.safetyeval.infrastructure.convertor; + +import org.mapstruct.Mapper; +import org.qinan.safetyeval.domain.entity.WpsDocEntity; +import org.qinan.safetyeval.infrastructure.dataobject.WpsDocDO; + +/** + * WPS 文档 Entity ↔ DO + * + * @author safety-eval + */ +@Mapper(componentModel = "spring") +public interface WpsDocDoConvertor { + + WpsDocDO toDO(WpsDocEntity entity); + + WpsDocEntity toEntity(WpsDocDO dataObject); +} diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/convertor/WpsDocVersionDoConvertor.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/convertor/WpsDocVersionDoConvertor.java new file mode 100644 index 00000000..b99a7ac9 --- /dev/null +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/convertor/WpsDocVersionDoConvertor.java @@ -0,0 +1,22 @@ +package org.qinan.safetyeval.infrastructure.convertor; + +import org.mapstruct.Mapper; +import org.qinan.safetyeval.domain.entity.WpsDocVersionEntity; +import org.qinan.safetyeval.infrastructure.dataobject.WpsDocVersionDO; + +import java.util.List; + +/** + * WPS 文档版本 Entity ↔ DO + * + * @author safety-eval + */ +@Mapper(componentModel = "spring") +public interface WpsDocVersionDoConvertor { + + WpsDocVersionDO toDO(WpsDocVersionEntity entity); + + WpsDocVersionEntity toEntity(WpsDocVersionDO dataObject); + + List toEntityList(List dataObjects); +} diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/dataobject/WpsDocDO.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/dataobject/WpsDocDO.java new file mode 100644 index 00000000..15ad1e27 --- /dev/null +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/dataobject/WpsDocDO.java @@ -0,0 +1,47 @@ +package org.qinan.safetyeval.infrastructure.dataobject; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * WPS 文档 DO + * + * @author safety-eval + */ +@Data +@TableName("wps_doc") +public class WpsDocDO { + + @TableId(type = IdType.AUTO) + private Long id; + private String fileId; + private Long orgId; + private String name; + private Integer docVersion; + private Long size; + private Integer resourceId; + private String downloadUrl; + private String creatorId; + private String modifierId; + private Long createTimeEpoch; + private Long modifyTimeEpoch; + private String deleteEnum; + private String remarks; + private String createName; + private String updateName; + private Long tenantId; + private Integer version; + private LocalDateTime createTime; + private LocalDateTime updateTime; + private Long createId; + private Long updateId; + private String env; + + private Integer pendingResourceId; + private String pendingDownloadUrl; + private Long pendingSize; +} diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/dataobject/WpsDocVersionDO.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/dataobject/WpsDocVersionDO.java new file mode 100644 index 00000000..c4552d0c --- /dev/null +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/dataobject/WpsDocVersionDO.java @@ -0,0 +1,36 @@ +package org.qinan.safetyeval.infrastructure.dataobject; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * WPS 文档版本 DO + * + * @author safety-eval + */ +@Data +@TableName("wps_doc_version") +public class WpsDocVersionDO { + + @TableId(type = IdType.AUTO) + private Long id; + private Long orgId; + private String fileId; + private Integer docVersion; + private String name; + private Long size; + private Integer resourceId; + private String downloadUrl; + private String digestSha1; + private String modifierId; + private Integer manualFlag; + private Long createTimeEpoch; + private String deleteEnum; + private Long tenantId; + private LocalDateTime createTime; + private LocalDateTime updateTime; +} diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/AccountGatewayImpl.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/AccountGatewayImpl.java index 8c4ea766..c02668a6 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/AccountGatewayImpl.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/AccountGatewayImpl.java @@ -109,6 +109,19 @@ public class AccountGatewayImpl implements AccountGateway { return toEntity(dataObject); } + @Override + public List listByIds(List ids) { + if (ids == null || ids.isEmpty()) { + return java.util.Collections.emptyList(); + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(AccountDO::getId, ids); + wrapper.eq(AccountDO::getDeleteEnum, "false"); + return accountMapper.selectList(wrapper).stream() + .map(this::toEntity) + .collect(Collectors.toList()); + } + private AccountDO toDO(AccountEntity entity) { AccountDO dataObject = new AccountDO(); dataObject.setUserName(entity.getUserName()); diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/QualFilingGatewayImpl.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/QualFilingGatewayImpl.java index ce97cb5f..b7afc931 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/QualFilingGatewayImpl.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/QualFilingGatewayImpl.java @@ -8,8 +8,8 @@ import org.qinan.safetyeval.domain.entity.*; import org.qinan.safetyeval.domain.exception.BizException; import org.qinan.safetyeval.domain.exception.ErrorCode; import org.qinan.safetyeval.domain.gateway.QualFilingGateway; -import org.qinan.safetyeval.domain.query.QualFilingQuery; import org.qinan.safetyeval.domain.query.PageResult; +import org.qinan.safetyeval.domain.query.QualFilingQuery; import org.qinan.safetyeval.infrastructure.dataobject.*; import org.qinan.safetyeval.infrastructure.mapper.*; import org.qinan.safetyeval.infrastructure.support.InsertFieldDefaults; @@ -71,7 +71,8 @@ public class QualFilingGatewayImpl implements QualFilingGateway { QualFilingDO dataObject = qualFilingMapper.selectById(id); return toEntity(dataObject); } -@Override + + @Override public QualFilingEntity getByFilingNo(String filingNo) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(QualFilingDO::getFilingNo, filingNo); @@ -156,11 +157,12 @@ public class QualFilingGatewayImpl implements QualFilingGateway { /** * 聚合保存 - * @param entity 基础信息 - * @param commitmentEntity 备案承诺书 - * @param equipmentEntities 备件 - * @param materialEntities 备案材料 - * @param personnelEntities 备案人员 + * + * @param entity 基础信息 + * @param commitmentEntity 备案承诺书 + * @param equipmentEntities 备件 + * @param materialEntities 备案材料 + * @param personnelEntities 备案人员 * @param personnelCertEntities 备案人员证书 */ @@ -257,12 +259,13 @@ public class QualFilingGatewayImpl implements QualFilingGateway { /** * 备案审核 - * @param filingId 机构id - * @param reviewResult 审核结果(1通过2待定3不通过) + * + * @param filingId 机构id + * @param reviewResult 审核结果(1通过2待定3不通过) * @param reviewResultRemark 审核结果文字描述 - * @param filingExpertId 专家id - * @param filingExpertName 专家名称 - * @param reviewOpinion 审核意见 + * @param filingExpertId 专家id + * @param filingExpertName 专家名称 + * @param reviewOpinion 审核意见 */ @Override public void review(Long filingId, String reviewResult, String reviewResultRemark, Long filingExpertId, String filingExpertName, String reviewOpinion) { @@ -279,6 +282,8 @@ public class QualFilingGatewayImpl implements QualFilingGateway { // 更新备案状态 QualFilingDO filing = new QualFilingDO(); QualFilingStatusEnum qualFilingStatusEnum = QualFilingStatusEnum.ofCode(Integer.valueOf(reviewResult)); + qualFilingStatusEnum = qualFilingStatusEnum == QualFilingStatusEnum.FILED + ? QualFilingStatusEnum.CONDITION_COMPLIANCE_PASS : qualFilingStatusEnum; filing.setFilingStatusCode(qualFilingStatusEnum.getCode()); filing.setFilingStatusName(qualFilingStatusEnum.getName()); filing.setApproveTime(LocalDateTime.now()); diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/WpsDocGatewayImpl.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/WpsDocGatewayImpl.java new file mode 100644 index 00000000..e143236b --- /dev/null +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/WpsDocGatewayImpl.java @@ -0,0 +1,74 @@ +package org.qinan.safetyeval.infrastructure.gatewayimpl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.qinan.safetyeval.domain.entity.WpsDocEntity; +import org.qinan.safetyeval.domain.gateway.WpsDocGateway; +import org.qinan.safetyeval.infrastructure.convertor.WpsDocDoConvertor; +import org.qinan.safetyeval.infrastructure.dataobject.WpsDocDO; +import org.qinan.safetyeval.infrastructure.mapper.WpsDocMapper; +import org.qinan.safetyeval.infrastructure.support.InsertFieldDefaults; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.time.LocalDateTime; + +/** + * WPS 文档 Gateway 实现 + * + * @author safety-eval + */ +@Component +public class WpsDocGatewayImpl implements WpsDocGateway { + + @Resource + private WpsDocMapper wpsDocMapper; + @Resource + private WpsDocDoConvertor wpsDocDoConvertor; + + @Override + public WpsDocEntity getByFileId(String fileId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(WpsDocDO::getFileId, fileId); + wrapper.eq(WpsDocDO::getDeleteEnum, "false"); + return wpsDocDoConvertor.toEntity(wpsDocMapper.selectOne(wrapper)); + } + + @Override + public WpsDocEntity getLatestByCreatorId(String creatorId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(WpsDocDO::getCreatorId, creatorId); + wrapper.eq(WpsDocDO::getDeleteEnum, "false"); + wrapper.orderByDesc(WpsDocDO::getId); + wrapper.last("limit 1"); + return wpsDocDoConvertor.toEntity(wpsDocMapper.selectOne(wrapper)); + } + + @Override + public WpsDocEntity save(WpsDocEntity entity) { + WpsDocDO dataObject = wpsDocDoConvertor.toDO(entity); + InsertFieldDefaults.apply(dataObject); + wpsDocMapper.insert(dataObject); + return wpsDocDoConvertor.toEntity(dataObject); + } + + @Override + public WpsDocEntity modify(WpsDocEntity entity) { + WpsDocDO dataObject = wpsDocDoConvertor.toDO(entity); + dataObject.setId(entity.getId()); + InsertFieldDefaults.applyForUpdate(dataObject); + wpsDocMapper.updateById(dataObject); + return getByFileId(entity.getFileId()); + } + + @Override + public void clearPending(Long id) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(WpsDocDO::getId, id) + .set(WpsDocDO::getPendingResourceId, null) + .set(WpsDocDO::getPendingDownloadUrl, null) + .set(WpsDocDO::getPendingSize, null) + .set(WpsDocDO::getUpdateTime, LocalDateTime.now()); + wpsDocMapper.update(null, wrapper); + } +} diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/WpsDocVersionGatewayImpl.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/WpsDocVersionGatewayImpl.java new file mode 100644 index 00000000..5ac83aab --- /dev/null +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/WpsDocVersionGatewayImpl.java @@ -0,0 +1,62 @@ +package org.qinan.safetyeval.infrastructure.gatewayimpl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.qinan.safetyeval.domain.entity.WpsDocVersionEntity; +import org.qinan.safetyeval.domain.gateway.WpsDocVersionGateway; +import org.qinan.safetyeval.infrastructure.convertor.WpsDocVersionDoConvertor; +import org.qinan.safetyeval.infrastructure.dataobject.WpsDocVersionDO; +import org.qinan.safetyeval.infrastructure.mapper.WpsDocVersionMapper; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.List; + +/** + * WPS 文档版本 Gateway 实现 + * + * @author safety-eval + */ +@Component +public class WpsDocVersionGatewayImpl implements WpsDocVersionGateway { + + @Resource + private WpsDocVersionMapper wpsDocVersionMapper; + @Resource + private WpsDocVersionDoConvertor wpsDocVersionDoConvertor; + + @Override + public WpsDocVersionEntity save(WpsDocVersionEntity entity) { + WpsDocVersionDO dataObject = wpsDocVersionDoConvertor.toDO(entity); + if (dataObject.getDeleteEnum() == null) { + dataObject.setDeleteEnum("false"); + } + LocalDateTime now = LocalDateTime.now(); + if (dataObject.getCreateTime() == null) { + dataObject.setCreateTime(now); + } + if (dataObject.getUpdateTime() == null) { + dataObject.setUpdateTime(now); + } + wpsDocVersionMapper.insert(dataObject); + return wpsDocVersionDoConvertor.toEntity(dataObject); + } + + @Override + public WpsDocVersionEntity getByFileIdAndVersion(String fileId, Integer docVersion) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(WpsDocVersionDO::getFileId, fileId); + wrapper.eq(WpsDocVersionDO::getDocVersion, docVersion); + wrapper.eq(WpsDocVersionDO::getDeleteEnum, "false"); + return wpsDocVersionDoConvertor.toEntity(wpsDocVersionMapper.selectOne(wrapper)); + } + + @Override + public List listByFileIdDesc(String fileId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(WpsDocVersionDO::getFileId, fileId); + wrapper.eq(WpsDocVersionDO::getDeleteEnum, "false"); + wrapper.orderByDesc(WpsDocVersionDO::getDocVersion); + return wpsDocVersionDoConvertor.toEntityList(wpsDocVersionMapper.selectList(wrapper)); + } +} diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/mapper/AccountMapper.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/mapper/AccountMapper.java index 86d23637..127d15dd 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/mapper/AccountMapper.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/mapper/AccountMapper.java @@ -6,5 +6,4 @@ import org.qinan.safetyeval.infrastructure.dataobject.AccountDO; @Mapper public interface AccountMapper extends BaseMapper { - String getWps(int i); } diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/mapper/QualFilingMapper.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/mapper/QualFilingMapper.java index 5880a394..7ca291eb 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/mapper/QualFilingMapper.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/mapper/QualFilingMapper.java @@ -16,4 +16,12 @@ public interface QualFilingMapper extends BaseMapper { List qualificationMonitoringPage(@Param("page") Page page, @Param("query") QualificationMonitoringQuery query); QualFilingStatisticsCO qualificationMonitoringPageStatistics(); + + /** + * 根据机构id查询最新一条资质备案记录 + * + * @param orgId 机构id + * @return 最新一条资质备案记录 + */ + QualFilingDO selectByOrgIdLastOne(@Param("orgId") Long orgId); } diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/mapper/WpsDocMapper.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/mapper/WpsDocMapper.java new file mode 100644 index 00000000..d4d70a1b --- /dev/null +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/mapper/WpsDocMapper.java @@ -0,0 +1,14 @@ +package org.qinan.safetyeval.infrastructure.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.qinan.safetyeval.infrastructure.dataobject.WpsDocDO; + +/** + * WPS 文档 Mapper + * + * @author safety-eval + */ +@Mapper +public interface WpsDocMapper extends BaseMapper { +} diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/mapper/WpsDocVersionMapper.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/mapper/WpsDocVersionMapper.java new file mode 100644 index 00000000..1e6c02ba --- /dev/null +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/mapper/WpsDocVersionMapper.java @@ -0,0 +1,14 @@ +package org.qinan.safetyeval.infrastructure.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.qinan.safetyeval.infrastructure.dataobject.WpsDocVersionDO; + +/** + * WPS 文档版本 Mapper + * + * @author safety-eval + */ +@Mapper +public interface WpsDocVersionMapper extends BaseMapper { +} diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/domainobject/QualOnSiteReviewDO.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/domainobject/QualOnSiteReviewDO.java index ecc26e0b..310c5877 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/domainobject/QualOnSiteReviewDO.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/domainobject/QualOnSiteReviewDO.java @@ -56,7 +56,11 @@ public class QualOnSiteReviewDO extends BaseDO { /** * 现场审查状态(AGENCY_PENDING_CONFIRMATION机构待确认、AGENCY_CONFIRMED机构已确认、REVIEW_PASSED核查通过、REVIEW_FAILED核查不通过) */ - private Long status; + private String status; + /** + * 审查意见 + */ + private String reviewOpinion; /** * 环境 */ diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/domainobject/QualOnSiteReviewFileDO.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/domainobject/QualOnSiteReviewFileDO.java index 3aef3e16..a63596bc 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/domainobject/QualOnSiteReviewFileDO.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/domainobject/QualOnSiteReviewFileDO.java @@ -29,6 +29,10 @@ public class QualOnSiteReviewFileDO extends BaseDO { * 文件url */ private String fileUrl; + /** + * 审查意见 + */ + private String reviewOpinion; /** * 环境 */ diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/mapper/QualOnSiteReviewMapper.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/mapper/QualOnSiteReviewMapper.java index 0c232391..10d12c25 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/mapper/QualOnSiteReviewMapper.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/mapper/QualOnSiteReviewMapper.java @@ -1,9 +1,19 @@ package org.qinan.safetyeval.infrastructure.persistence.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.qinan.safetyeval.client.review.request.QualOnSiteReviewMonitorPageQry; +import org.qinan.safetyeval.client.review.request.QualOnSiteReviewOrgPageQry; +import org.qinan.safetyeval.client.review.response.QualOnSiteReviewCo; +import org.qinan.safetyeval.client.review.response.QualOnSiteReviewMonitorCo; +import org.qinan.safetyeval.client.review.response.QualOnSiteReviewOrgCo; +import org.qinan.safetyeval.client.review.response.QualOnSiteReviewStatisticsCo; import org.qinan.safetyeval.infrastructure.persistence.domainobject.QualOnSiteReviewDO; +import java.util.List; + /** * 资质现场核查Mapper * @@ -12,4 +22,18 @@ import org.qinan.safetyeval.infrastructure.persistence.domainobject.QualOnSiteRe */ @Mapper public interface QualOnSiteReviewMapper extends BaseMapper { + + List monitorPage(@Param("page") Page page, + @Param("query") QualOnSiteReviewMonitorPageQry query); + + List orgPage(@Param("page") Page page, + @Param("query") QualOnSiteReviewOrgPageQry query); + + /** + * 资质现场核查统计(单条SQL聚合) + * + * @param orgId 机构ID(为空时统计全部) + * @return 统计结果 + */ + QualOnSiteReviewStatisticsCo statistics(@Param("orgId") Long orgId); } diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/repository/impl/QualOnSiteReviewFileRepositoryImpl.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/repository/impl/QualOnSiteReviewFileRepositoryImpl.java index 1edda867..ff820029 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/repository/impl/QualOnSiteReviewFileRepositoryImpl.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/repository/impl/QualOnSiteReviewFileRepositoryImpl.java @@ -40,12 +40,7 @@ public class QualOnSiteReviewFileRepositoryImpl extends BaseRepositoryImpl listQualOnSiteReviewPage(IPage iPage, QualOnSiteReviewPageQry qualOnSiteReviewPageQry) { QueryWrapper qualOnSiteReviewDoQueryWrapper = new QueryWrapper<>(); - if (ObjectUtil.isNotEmpty(qualOnSiteReviewPageQry.getBizType())) { - qualOnSiteReviewDoQueryWrapper.eq("biz_type", qualOnSiteReviewPageQry.getBizType()); - } - if (ObjectUtil.isNotEmpty(qualOnSiteReviewPageQry.getBizId())) { - qualOnSiteReviewDoQueryWrapper.eq("biz_id", qualOnSiteReviewPageQry.getBizId()); - } if (ObjectUtil.isNotEmpty(qualOnSiteReviewPageQry.getReviewDateStart())) { qualOnSiteReviewDoQueryWrapper.eq("review_date_start", qualOnSiteReviewPageQry.getReviewDateStart()); } diff --git a/safety-eval-infrastructure/src/main/resources/mapper/AccountMapper.xml b/safety-eval-infrastructure/src/main/resources/mapper/AccountMapper.xml index 5c2dab3a..3a68f2cf 100644 --- a/safety-eval-infrastructure/src/main/resources/mapper/AccountMapper.xml +++ b/safety-eval-infrastructure/src/main/resources/mapper/AccountMapper.xml @@ -28,8 +28,5 @@ `id`, `user_name`, `account`, `phone`, `password`, `profile_url`, `type`, `delete_enum`, `remarks`, `create_name`, `update_name`, `tenant_id`, `version`, `create_time`, `update_time`, `create_id`, `update_id`, `env` - diff --git a/safety-eval-infrastructure/src/main/resources/mapper/QualFilingMapper.xml b/safety-eval-infrastructure/src/main/resources/mapper/QualFilingMapper.xml index a286b0a5..586ba606 100644 --- a/safety-eval-infrastructure/src/main/resources/mapper/QualFilingMapper.xml +++ b/safety-eval-infrastructure/src/main/resources/mapper/QualFilingMapper.xml @@ -84,4 +84,14 @@ where info.delete_enum = 'false'; + + diff --git a/safety-eval-infrastructure/src/main/resources/mapper/QualOnSiteReviewMapper.xml b/safety-eval-infrastructure/src/main/resources/mapper/QualOnSiteReviewMapper.xml index d4ce42f5..5088a511 100644 --- a/safety-eval-infrastructure/src/main/resources/mapper/QualOnSiteReviewMapper.xml +++ b/safety-eval-infrastructure/src/main/resources/mapper/QualOnSiteReviewMapper.xml @@ -16,6 +16,7 @@ + @@ -41,6 +42,7 @@ supervisor_contact, contact_phone, status, + review_opinion, delete_enum, remarks, create_name, @@ -54,4 +56,70 @@ env from qual_on_site_review + + + + + + + + \ No newline at end of file diff --git a/safety-eval-start/src/main/resources/nacos/config-spring.yml b/safety-eval-start/src/main/resources/nacos/config-spring.yml index 3b3aac81..2f5ff8f0 100644 --- a/safety-eval-start/src/main/resources/nacos/config-spring.yml +++ b/safety-eval-start/src/main/resources/nacos/config-spring.yml @@ -171,3 +171,8 @@ def: password: a123456 publicKey: 0402df2195296d4062ac85ad766994d73e871b887e18efb9a9a06b4cebc72372869b7da6c347c129dee2b46a0f279ff066b01c76208c2a052af75977c722a2ccee reviewEnable: false + +wps: + upload-base-url: ${WPS_UPLOAD_BASE_URL:https://gbs-gateway.qhdsafety.com/safetyEval-h5/wsp} + def-docx-url: https://test-dragon-yf-pub.oss-cn-hangzhou.aliyuncs.com/jjb/6a59d83ee4b0b4541389511f.docx +