# -*- coding: utf-8 -*- """票 07 商机侧接线脚本(常量 + intake + detail 单表缝 + 测试构造点)""" import io, sys sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') # 1) OpportunityConstants p = 'crm-opportunity/src/main/java/com/crm/opportunity/constant/OpportunityConstants.java' txt = open(p, encoding='utf-8').read() old = 'public interface OpportunityConstants {\n\n /*-------- 业务错误码' new = ('public interface OpportunityConstants {\n\n' ' /*-------- 字典分组编码(crm-dict 字段-分组绑定,202609 引用计数接线)--------*/\n\n' ' String DICT_GROUP_OPP_SOURCE = "opp_source";\n\n' ' String DICT_GROUP_INDUSTRY = "industry";\n\n' ' /*-------- 业务错误码') assert old in txt, 'constants anchor' open(p, 'w', encoding='utf-8').write(txt.replace(old, new, 1)) print('OpportunityConstants ok') # 2) OpportunityIntakeImpl p = 'crm-opportunity/src/main/java/com/crm/opportunity/intake/impl/OpportunityIntakeImpl.java' txt = open(p, encoding='utf-8').read() old = (' private final OpportunityMapper oppMapper;\n' ' private final OpportunityCustomerMapper customerMapper;\n' ' private final OpportunityOplogWriter oplogWriter;\n' ' private final OpportunityTeamMapper teamMapper;\n' ' private final IOpportunityStageTemplateService stageTemplateService;\n') new = old + ' private final com.crm.dict.service.DictReferenceService dictReferenceService;\n' assert old in txt, 'intake fields anchor' txt = txt.replace(old, new, 1) old = ' // 票 13:customerId 非空 → 建主要意向客户子表 + 刷主表冗余(走法甲:可空则跳过)\n if (spec.customerId() != null) {' new = (' // 字典编码引用计数随迁(202609 拍板 1):建档两字典字段入账,与建档同一事务\n' ' dictReferenceService.applyFieldChange(\n' ' com.crm.opportunity.constant.OpportunityConstants.DICT_GROUP_OPP_SOURCE, null, opp.getOppSource());\n' ' dictReferenceService.applyFieldChange(\n' ' com.crm.opportunity.constant.OpportunityConstants.DICT_GROUP_INDUSTRY, null, opp.getIndustryCode());\n\n' ' // 票 13:customerId 非空 → 建主要意向客户子表 + 刷主表冗余(走法甲:可空则跳过)\n if (spec.customerId() != null) {') assert old in txt, 'intake open anchor' open(p, 'w', encoding='utf-8').write(txt.replace(old, new, 1)) print('OpportunityIntakeImpl ok') # 3) OpportunityDetailServiceImpl p = 'crm-opportunity/src/main/java/com/crm/opportunity/service/impl/OpportunityDetailServiceImpl.java' txt = open(p, encoding='utf-8').read() old = (' record EditField(String key, SFunction column,\n' ' Function dtoGet,\n' ' Function existGet) {}') new = (' record EditField(String key, SFunction column,\n' ' Function dtoGet,\n' ' Function existGet,\n' ' String dictGroup) {}') assert old in txt, 'record anchor' txt = txt.replace(old, new, 1) pairs = [ ('new EditField("oppName", Opportunity::getOppName, OpportunityDTO::getOppName, Opportunity::getOppName),', 'new EditField("oppName", Opportunity::getOppName, OpportunityDTO::getOppName, Opportunity::getOppName, null),'), ('new EditField("oppSource", Opportunity::getOppSource, OpportunityDTO::getOppSource, Opportunity::getOppSource),', 'new EditField("oppSource", Opportunity::getOppSource, OpportunityDTO::getOppSource, Opportunity::getOppSource,\n' ' OpportunityConstants.DICT_GROUP_OPP_SOURCE),'), ('new EditField("oppType", Opportunity::getOppType, OpportunityDTO::getOppType, Opportunity::getOppType),', 'new EditField("oppType", Opportunity::getOppType, OpportunityDTO::getOppType, Opportunity::getOppType, null),'), ('new EditField("industryCode", Opportunity::getIndustryCode, OpportunityDTO::getIndustryCode, Opportunity::getIndustryCode),', 'new EditField("industryCode", Opportunity::getIndustryCode, OpportunityDTO::getIndustryCode, Opportunity::getIndustryCode,\n' ' OpportunityConstants.DICT_GROUP_INDUSTRY),'), ('new EditField("bidForm", Opportunity::getBidForm, OpportunityDTO::getBidForm, Opportunity::getBidForm),', 'new EditField("bidForm", Opportunity::getBidForm, OpportunityDTO::getBidForm, Opportunity::getBidForm, null),'), ('new EditField("localityType", Opportunity::getLocalityType, OpportunityDTO::getLocalityType, Opportunity::getLocalityType),', 'new EditField("localityType", Opportunity::getLocalityType, OpportunityDTO::getLocalityType, Opportunity::getLocalityType, null),'), ('new EditField("partyAClear", Opportunity::getPartyAClear, OpportunityDTO::getPartyAClear, Opportunity::getPartyAClear),', 'new EditField("partyAClear", Opportunity::getPartyAClear, OpportunityDTO::getPartyAClear, Opportunity::getPartyAClear, null),'), ('new EditField("partyA", Opportunity::getPartyA, OpportunityDTO::getPartyA, Opportunity::getPartyA),', 'new EditField("partyA", Opportunity::getPartyA, OpportunityDTO::getPartyA, Opportunity::getPartyA, null),'), ('new EditField("provinceCode", Opportunity::getProvinceCode, OpportunityDTO::getProvinceCode, Opportunity::getProvinceCode),', 'new EditField("provinceCode", Opportunity::getProvinceCode, OpportunityDTO::getProvinceCode, Opportunity::getProvinceCode, null),'), ('new EditField("cityCode", Opportunity::getCityCode, OpportunityDTO::getCityCode, Opportunity::getCityCode),', 'new EditField("cityCode", Opportunity::getCityCode, OpportunityDTO::getCityCode, Opportunity::getCityCode, null),'), ('new EditField("remark", Opportunity::getRemark, OpportunityDTO::getRemark, Opportunity::getRemark),', 'new EditField("remark", Opportunity::getRemark, OpportunityDTO::getRemark, Opportunity::getRemark, null),'), ('new EditField("projectAmount", Opportunity::getProjectAmount, OpportunityDTO::getProjectAmount, Opportunity::getProjectAmount));', 'new EditField("projectAmount", Opportunity::getProjectAmount, OpportunityDTO::getProjectAmount, Opportunity::getProjectAmount, null));'), ] for old, new in pairs: assert old in txt, 'EDIT_FIELDS anchor: ' + old[:60] txt = txt.replace(old, new, 1) old = (' if (!Objects.equals(incoming, current)) {\n' ' audits.add(new FieldAudit(field.key(), current, incoming));\n' ' }\n' ' }') new = (' if (!Objects.equals(incoming, current)) {\n' ' audits.add(new FieldAudit(field.key(), current, incoming));\n' ' }\n' ' if (field.dictGroup() != null) {\n' ' // 字典编码引用计数随迁(202609 拍板 1):与 SET/审计同一字段表同源,相等时缝内自然 no-op\n' ' dictReferenceService.applyFieldChange(field.dictGroup(), (String) current, (String) incoming);\n' ' }\n' ' }') assert old in txt, 'edit loop anchor' txt = txt.replace(old, new, 1) old = ' private final OpportunityOplogWriter oplogWriter;\n' new = (' private final OpportunityOplogWriter oplogWriter;\n' ' private final com.crm.dict.service.DictReferenceService dictReferenceService;\n') assert old in txt, 'detail fields anchor' open(p, 'w', encoding='utf-8').write(txt.replace(old, new, 1)) print('OpportunityDetailServiceImpl ok') # 4) 测试构造点 p = 'crm-opportunity/src/test/java/com/crm/opportunity/service/impl/OpportunityDetailServiceImplTest.java' txt = open(p, encoding='utf-8').read() old = (' service = new OpportunityDetailServiceImpl(oppMapper,\n' ' new OpportunityActionGuard(oppMapper, poolRuleMatcher),\n' ' focusMapper, followMapper, schemeCardMapper,\n' ' stageHistoryMapper, stageTemplateService, oplogWriter);') new = (' service = new OpportunityDetailServiceImpl(oppMapper,\n' ' new OpportunityActionGuard(oppMapper, poolRuleMatcher),\n' ' focusMapper, followMapper, schemeCardMapper,\n' ' stageHistoryMapper, stageTemplateService, oplogWriter,\n' ' org.mockito.Mockito.mock(com.crm.dict.service.DictReferenceService.class));') assert old in txt, 'detail test anchor' open(p, 'w', encoding='utf-8').write(txt.replace(old, new, 1)) print('OpportunityDetailServiceImplTest ok')