diff --git a/src/main/java/com/nbport/zgwl/contractlaunch/controller/ContractLaunchController.java b/src/main/java/com/nbport/zgwl/contractlaunch/controller/ContractLaunchController.java index 753d316..a8d1f08 100644 --- a/src/main/java/com/nbport/zgwl/contractlaunch/controller/ContractLaunchController.java +++ b/src/main/java/com/nbport/zgwl/contractlaunch/controller/ContractLaunchController.java @@ -326,6 +326,30 @@ public class ContractLaunchController { return R.success(contractLaunchService.saveCollectInfo(id, collectDto)); } + /** + * 获取相对方签署确认状态。 + */ + @GetMapping("/{id}/counterparty-confirm") + public R> getCounterpartyConfirm(@PathVariable("id") Long id) { + return R.success(contractLaunchService.getCounterpartyConfirmMap(id)); + } + + /** + * 相对方确认已签署完成。 + * + * 请求体:{"companyName": "四川德鑫矿业资源有限公司"} + * 后端自动获取当前登录用户信息写入确认记录。 + */ + @PostMapping("/{id}/counterparty-confirm") + public R> confirmCounterparty(@PathVariable("id") Long id, + @RequestBody Map body) { + String companyName = body.get("companyName"); + if (companyName == null || companyName.isBlank()) { + return R.error("companyName 不能为空"); + } + return R.success(contractLaunchService.confirmCounterparty(id, companyName)); + } + /** * 合同归档。 * diff --git a/src/main/java/com/nbport/zgwl/contractlaunch/dto/ContractLaunchDto.java b/src/main/java/com/nbport/zgwl/contractlaunch/dto/ContractLaunchDto.java index 1d1fcc9..d3e40bd 100644 --- a/src/main/java/com/nbport/zgwl/contractlaunch/dto/ContractLaunchDto.java +++ b/src/main/java/com/nbport/zgwl/contractlaunch/dto/ContractLaunchDto.java @@ -373,6 +373,11 @@ public class ContractLaunchDto implements Serializable { /** 备注 */ private String remark; + // ==================== 相对方签署确认 ==================== + + /** 相对方签署确认状态JSON:{"公司名": {"confirmed":true, "method":"self"/"manual", "confirmedBy":"xxx", "confirmedAt":"..."}} */ + private String counterpartyConfirmJson; + // ==================== 子表数据(非数据库字段) ==================== /** diff --git a/src/main/java/com/nbport/zgwl/contractlaunch/service/ContractLaunchService.java b/src/main/java/com/nbport/zgwl/contractlaunch/service/ContractLaunchService.java index 964b11b..315354f 100644 --- a/src/main/java/com/nbport/zgwl/contractlaunch/service/ContractLaunchService.java +++ b/src/main/java/com/nbport/zgwl/contractlaunch/service/ContractLaunchService.java @@ -10,6 +10,8 @@ import com.nbport.zgwl.contractlaunch.dto.ContractLaunchLawCallbackSampleDto; import com.nbport.zgwl.contractlaunch.dto.ContractLaunchQueryDto; import com.nbport.zgwl.contractlaunch.dto.ContractLaunchSealDto; +import java.util.Map; + public interface ContractLaunchService { /** 分页查询合同列表 */ @@ -54,6 +56,12 @@ public interface ContractLaunchService { /** 保存采集信息(用印+签订信息),用于采集弹窗保存草稿 */ ContractLaunchDto saveCollectInfo(Long id, ContractLaunchCollectSaveDto collectDto); + /** 获取相对方签署确认状态 Map */ + Map getCounterpartyConfirmMap(Long id); + + /** 相对方确认已签署完成 */ + Map confirmCounterparty(Long id, String companyName); + /** 模拟合同采集(调用数据采集 collectContract 接口,TODO:替换为真实调用) */ ContractLaunchDto mockCollect(Long id); diff --git a/src/main/java/com/nbport/zgwl/contractlaunch/service/ContractLaunchServiceImpl.java b/src/main/java/com/nbport/zgwl/contractlaunch/service/ContractLaunchServiceImpl.java index 8e6bceb..02962ed 100644 --- a/src/main/java/com/nbport/zgwl/contractlaunch/service/ContractLaunchServiceImpl.java +++ b/src/main/java/com/nbport/zgwl/contractlaunch/service/ContractLaunchServiceImpl.java @@ -597,6 +597,46 @@ public class ContractLaunchServiceImpl implements ContractLaunchService { return getDetail(id); } + @Override + public Map getCounterpartyConfirmMap(Long id) { + ContractLaunchDto contract = getDetail(id); + String raw = contract.getCounterpartyConfirmJson(); + if (raw == null || raw.isBlank()) { + return new LinkedHashMap<>(); + } + return JsonUtils.parseMap(raw); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Map confirmCounterparty(Long id, String companyName) { + ContractLaunchDto contract = getDetail(id); + SysUserEntity currentUser = adminSecurityManage.getUser(); + String orgName = currentUser.getSysOrgEntity() == null ? "" : currentUser.getSysOrgEntity().getOrgName(); + String username = currentUser.getUsername(); + String mobile = currentUser.getMobilePhone(); + + Map confirmMap = getCounterpartyConfirmMap(id); + + Map entry = new LinkedHashMap<>(); + entry.put("confirmed", true); + boolean isSelf = companyName.equals(orgName); + entry.put("method", isSelf ? "self" : "manual"); + entry.put("confirmedBy", username); + entry.put("confirmedMobile", mobile); + entry.put("confirmedAt", LocalDateTime.now().toString()); + if (!isSelf) { + entry.put("remark", "非本组织相对方,由 " + username + " 代为确认"); + } + confirmMap.put(companyName, entry); + + contract.setCounterpartyConfirmJson(JsonUtils.toJson(confirmMap)); + contract.setUpdateBy(username); + contract.setUpdateTime(LocalDateTime.now()); + contractLaunchMapper.updateContract(contract); + return confirmMap; + } + /** * 【测试按钮】模拟合同采集。 */ diff --git a/src/main/java/com/nbport/zgwl/contractlaunch/utils/JsonUtils.java b/src/main/java/com/nbport/zgwl/contractlaunch/utils/JsonUtils.java index 1ea4b05..b4131b6 100644 --- a/src/main/java/com/nbport/zgwl/contractlaunch/utils/JsonUtils.java +++ b/src/main/java/com/nbport/zgwl/contractlaunch/utils/JsonUtils.java @@ -29,8 +29,19 @@ public class JsonUtils { try { return OBJECT_MAPPER.writeValueAsString(obj); } catch (Exception e) { - // 序列化失败时返回 toString,保证不报错 return obj.toString(); } } + + @SuppressWarnings("unchecked") + public static java.util.Map parseMap(String json) { + if (json == null || json.isBlank()) { + return new java.util.LinkedHashMap<>(); + } + try { + return OBJECT_MAPPER.readValue(json, java.util.LinkedHashMap.class); + } catch (Exception e) { + return new java.util.LinkedHashMap<>(); + } + } } \ No newline at end of file diff --git a/src/main/java/com/nbport/zgwl/controller/AdminDictController.java b/src/main/java/com/nbport/zgwl/controller/AdminDictController.java index ecb027d..ddddbed 100644 --- a/src/main/java/com/nbport/zgwl/controller/AdminDictController.java +++ b/src/main/java/com/nbport/zgwl/controller/AdminDictController.java @@ -57,7 +57,10 @@ public class AdminDictController { new DictDataItem("合同方摘要", "counterpartySummary", "模板变量值,由用户自行维护"), new DictDataItem("附件情况", "attachmentSummary", "模板变量值,由用户自行维护"), new DictDataItem("模板名称", "templateLabel", "模板变量值,由用户自行维护"), - new DictDataItem("签署日期", "signDate", "模板变量值,由用户自行维护") + new DictDataItem("签署日期", "signDate", "模板变量值,由用户自行维护"), + new DictDataItem("A的TAx", "partyATaxNo", "模板变量值,由用户自行维护"), + new DictDataItem("B的TAx", "partyBTaxNo", "模板变量值,由用户自行维护") + ); } diff --git a/src/main/resources/mapper/contractlaunch/ContractLaunchMapper.xml b/src/main/resources/mapper/contractlaunch/ContractLaunchMapper.xml index 95fbe20..c0a3287 100644 --- a/src/main/resources/mapper/contractlaunch/ContractLaunchMapper.xml +++ b/src/main/resources/mapper/contractlaunch/ContractLaunchMapper.xml @@ -92,6 +92,7 @@ + @@ -211,6 +212,7 @@ SIGNED_FILE_NAME, SIGNED_FILE_PATH, SIGNED_FILE_TYPE, SIGNED_FILE_SIZE, SIGNED_FILE_URL, SIGNED_OFFLINE_REASON, SIGN_DATE, SEAL_DATE, SEAL_IS_SEAL, SEAL_APPROVE_SAME, ACTIVE_DATE, ARCHIVE_DATE, ARCHIVE_RECEIVE_DEPT, ARCHIVE_TRANSFEROR, ARCHIVE_KEEPER, ARCHIVE_KEEPER_UNIT, ARCHIVE_KEEPER_UNIT_CODE, INVOICE_DATE, RECEIVE_DATE, REMIND_DAYS, + COUNTERPARTY_CONFIRM_JSON, INITIATOR, INITIATOR_DEPT, COMPANY_NAME, ORG_ID, QUERY_SCOPE, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, IS_DELETED, REMARK from SEAL_CONTRACT_LAUNCH_MAIN @@ -500,6 +502,7 @@ INVOICE_DATE = #{invoiceDate}, RECEIVE_DATE = #{receiveDate}, REMIND_DAYS = #{remindDays}, + COUNTERPARTY_CONFIRM_JSON = #{counterpartyConfirmJson}, INITIATOR = #{initiator}, INITIATOR_DEPT = #{initiatorDept}, COMPANY_NAME = #{companyName}, diff --git a/zgwl_contract_launch_archive_v3_patch_oracle.sql b/zgwl_contract_launch_archive_v3_patch_oracle.sql index 25ffbaf..fac66a0 100644 --- a/zgwl_contract_launch_archive_v3_patch_oracle.sql +++ b/zgwl_contract_launch_archive_v3_patch_oracle.sql @@ -224,3 +224,19 @@ BEGIN COMMIT; END; / + +DECLARE + v_count NUMBER; +BEGIN + SELECT COUNT(1) + INTO v_count + FROM USER_TAB_COLUMNS + WHERE TABLE_NAME = 'SEAL_CONTRACT_LAUNCH_MAIN' + AND COLUMN_NAME = 'COUNTERPARTY_CONFIRM_JSON'; + IF v_count = 0 THEN + EXECUTE IMMEDIATE 'ALTER TABLE SEAL_CONTRACT_LAUNCH_MAIN ADD COUNTERPARTY_CONFIRM_JSON VARCHAR2(2000 CHAR)'; + END IF; +END; +/ + +COMMENT ON COLUMN SEAL_CONTRACT_LAUNCH_MAIN.COUNTERPARTY_CONFIRM_JSON IS '相对方签署确认状态JSON';