You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

236 lines
28 KiB

2 weeks ago
��diff --git a/crm-dict/src/main/java/com/crm/dict/config/DictDataInitializer.java b/crm-dict/src/main/java/com/crm/dict/config/DictDataInitializer.java
index 1d622f1..44490c0 100644
--- a/crm-dict/src/main/java/com/crm/dict/config/DictDataInitializer.java
+++ b/crm-dict/src/main/java/com/crm/dict/config/DictDataInitializer.java
@@ -42,6 +42,7 @@ public class DictDataInitializer implements CommandLineRunner {
/*-------- �h(h�XP�oT�up@iT�~�]�t�Wxcel Ǔc2]Y�O�}YtzO�� Z)1tV�? * Z�r�N/]�zO�X/Ǖ� �Y�P��]�?Ǖ� �Y�P�nœ�� Y 0Y�,h�V���o�{X��q7p A2-1-2-2 “g���~荨Pt%1]�RWrontend-integration �~&1A] 02�Y1}
+ * _��U�nÕ5���Y�,h�VX��q7p A7-3-2-1 Õ5����Y!�o^g)1�Ne��pqrn6[}_��U�n�Y3 ao�~?06�k[PP_STAGE_05 �m�TPm9p3l�Y�pt���~>�r�Y1}
* X��q7pZ�r�NZmT]�m`��kW��r�}“�Vpn��}\�Wt)1 01���] {O��01|��?-------*/
private static final List<GroupSeed> SEED_GROUPS = List.of(
@@ -148,7 +149,14 @@ public class DictDataInitializer implements CommandLineRunner {
new ItemSeed("energy", "s���.|", "energy", 15, null, false),
new ItemSeed("park", "e�^�/\", "park", 16, null, false),
new ItemSeed("cultural_tourism", "“�V�h", "cultural_tourism", 17, null, false),
- new ItemSeed("exhibition_hall", "^p�f�]", "exhibition_hall", 18, null, false))));
+ new ItemSeed("exhibition_hall", "^p�f�]", "exhibition_hall", 18, null, false))),
+ new GroupSeed("opp_stage", "_��U�nÕ5���", 7, "_��U�nÕ5����Y!�oz��PcP�[�fde�X+^h�?A7-3-2-1 ^g)1�Ne��pqrn6[1}OPP_STAGE_05=�[6�Fm$i-W0me��T~uz��PcP�}\bfȓ�pg�Ci�0 06�?,
+ List.of(
+ new ItemSeed("OPP_STAGE_01", "9p!2�Wf�X~u", "OPP_STAGE_01", 1, null, false),
+ new ItemSeed("OPP_STAGE_02", "O�]����JT^", "OPP_STAGE_02", 2, null, false),
+ new ItemSeed("OPP_STAGE_03", "�t�R�g���V�l", "OPP_STAGE_03", 3, null, false),
+ new ItemSeed("OPP_STAGE_04", "“ĉ �W�?, "OPP_STAGE_04", 4, null, false),
+ new ItemSeed("OPP_STAGE_05", "�[6�Fm$i-W0m", "OPP_STAGE_05", 5, null, false))));
@Override
public void run(String... args) {
diff --git a/crm-dict/src/test/java/com/crm/dict/config/DictDataInitializerTest.java b/crm-dict/src/test/java/com/crm/dict/config/DictDataInitializerTest.java
index 7a34dab..16b8e10 100644
--- a/crm-dict/src/test/java/com/crm/dict/config/DictDataInitializerTest.java
+++ b/crm-dict/src/test/java/com/crm/dict/config/DictDataInitializerTest.java
@@ -31,24 +31,24 @@ class DictDataInitializerTest extends AbstractDictH2Test {
}
@Test
- @DisplayName("�h,h���? �mD�4U���W?+ 92 �mD�4U�� 0O�)14Q�[�T1|��[ef_count �h�R��\R�p0a�|�t�0 0"��qef")
+ @DisplayName("�h,h���? �mD�4U���W?+ 97 �mD�4U�� 0O�)14Q�[�T1|��[ef_count �h�R��\R�p0a�|�t�0 0"��qef")
void firstRun_createsBuiltinDictsWithDefaults() {
initializer.run();
List<DictGroup> groups = dictGroupMapper.selectList(null);
- assertThat(groups).hasSize(6);
+ assertThat(groups).hasSize(7);
assertThat(groups).extracting(DictGroup::getCode)
.containsExactlyInAnyOrder("lead_source", "customer_status", "industry",
- "brand", "product", "scene");
+ "brand", "product", "scene", "opp_stage");
assertThat(groups).allMatch(g -> Boolean.TRUE.equals(g.getBuiltin()));
assertThat(groups).allMatch(g -> g.getStatus() == DictConstants.STATUS_ENABLED);
List<DictItem> items = dictItemMapper.selectList(null);
- assertThat(items).hasSize(92); // 38 Z�r�N + 3 9p!2�W�5�� ?+ 8 t|\{ + 9 ]�zO�X + 16 Ǖ� �Y�P��]�?+ 18 Ǖ� �Y�P�nœ?+ assertThat(items).hasSize(97); // 38 Z�r�N + 3 9p!2�W�5�� ?+ 8 t|\{ + 9 ]�zO�X + 16 Ǖ� �Y�P��]�?+ 18 Ǖ� �Y�P�nœ?+ 5 _��U�nÕ5���
assertThat(items).allMatch(i -> Boolean.TRUE.equals(i.getBuiltin()));
// �[�fde�t!�ft�\i��[4s}�m�^�g�[�p4^Y�E��`Y�E��}�?- assertThat(dictRefCountMapper.selectCount(null)).isEqualTo(92);
+ assertThat(dictRefCountMapper.selectCount(null)).isEqualTo(97);
DictGroup statusGroup = groups.stream()
.filter(g -> g.getCode().equals("customer_status")).findFirst().orElseThrow();
DictItem potential = dictItemMapper.selectList(null).stream()
@@ -69,9 +69,9 @@ class DictDataInitializerTest extends AbstractDictH2Test {
initializer.run();
initializer.run();
- assertThat(dictGroupMapper.selectCount(null)).isEqualTo(6);
- assertThat(dictItemMapper.selectCount(null)).isEqualTo(92);
- assertThat(dictRefCountMapper.selectCount(null)).isEqualTo(92);
+ assertThat(dictGroupMapper.selectCount(null)).isEqualTo(7);
+ assertThat(dictItemMapper.selectCount(null)).isEqualTo(97);
+ assertThat(dictRefCountMapper.selectCount(null)).isEqualTo(97);
assertThat(dictGroupDefaultMapper.selectCount(null)).isEqualTo(1);
}
@@ -194,12 +194,12 @@ class DictDataInitializerTest extends AbstractDictH2Test {
assertThat(dictGroupMapper.selectById(userGroup.getId()).getBuiltin()).isFalse();
assertThat(dictItemMapper.selectList(null).stream()
.filter(i -> i.getGroupId().equals(userGroup.getId()))).isEmpty();
- // �~�]�tO�5g�|R��U�|�m�]H_0�^S7d�"X7b_��/u?z��O��0}�]kustomer_status + industry + brand + product + scene
- assertThat(dictGroupMapper.selectCount(null)).isEqualTo(6); // lead_source("�&1�W) + O�5g�} 5 �mD�4U���W?+ // �~�]�tO�5g�|R��U�|�m�]H_0�^S7d�"X7b_��/u?z��O��0}�]kustomer_status + industry + brand + product + scene + opp_stage
+ assertThat(dictGroupMapper.selectCount(null)).isEqualTo(7); // lead_source("�&1�W) + O�5g�} 6 �mD�4U���W? assertThat(dictGroupMapper.selectList(null).stream()
.filter(g -> g.getCode().equals("industry"))).hasSize(1);
- assertThat(dictItemMapper.selectCount(null)).isEqualTo(54); // 92 - Z�r�N 38�"Xde���\�W�R�f�R�pig�V}
- assertThat(dictRefCountMapper.selectCount(null)).isEqualTo(54);
+ assertThat(dictItemMapper.selectCount(null)).isEqualTo(59); // 97 - Z�r�N 38�"Xde���\�W�R�f�R�pig�V}
+ assertThat(dictRefCountMapper.selectCount(null)).isEqualTo(59);
assertThat(dictGroupDefaultMapper.selectCount(null)).isEqualTo(1); // customer_status �i?j{�$i? }
diff --git a/crm-opportunity/src/main/java/com/crm/opportunity/constant/OpportunityConstants.java b/crm-opportunity/src/main/java/com/crm/opportunity/constant/OpportunityConstants.java
index cbbbba8..27fe7f7 100644
--- a/crm-opportunity/src/main/java/com/crm/opportunity/constant/OpportunityConstants.java
+++ b/crm-opportunity/src/main/java/com/crm/opportunity/constant/OpportunityConstants.java
@@ -13,6 +13,8 @@ public interface OpportunityConstants {
int CODE_OPP_NOT_EXIST = 66002; // _��U�n�m�]�tf�&1�W�[6�f�R��r�j
int CODE_STATUS_NOT_ALLOWED = 66003; // 0��d�X�5�� wO {O�}O���Y�07dcm�n}9pX<]S��]�u�? int CODE_CAS_FAIL = 66004; // �m/aG翕?�5�� ?CAS P�,�Js�WDR-0021�?+ int CODE_STAGE_NOT_ALLOWED = 66005; // 0��d�X�5�� wO {O�}O��Õ5���R��V2]�"X�0 06�+l�|��(1X~�m^�r_R��V}
+ int CODE_STAGE_NODE_INVALID = 66006; // )���#rÕ5���z��PcPȕ�pvx�X {^p�p�|9p-lɓ荗Xȓ?e��T~uz��PcP/�m�]�tf���}�~?06�?
/*-------- ig�m�SO��ccX��qm pool_reason�%WRD d3.5 ˓+l�Y�}\mJ�Nq�v•h�1}varchar(32) p?j���m Yr�?-------
* E3 �m Yܑɓ�0.|J���qe�t�Qde“xv}Service� Y�[���]�}f��p�j|m�r�S�fl10 �tnTane��pye"�?executeRecycle P�k4ᆒ?diff --git a/crm-opportunity/src/main/java/com/crm/opportunity/port/inbound/impl/OpportunityConvertPortImpl.java b/crm-opportunity/src/main/java/com/crm/opportunity/port/inbound/impl/OpportunityConvertPortImpl.java
index 5c1d908..f8485d0 100644
--- a/crm-opportunity/src/main/java/com/crm/opportunity/port/inbound/impl/OpportunityConvertPortImpl.java
+++ b/crm-opportunity/src/main/java/com/crm/opportunity/port/inbound/impl/OpportunityConvertPortImpl.java
@@ -8,6 +8,7 @@ import com.crm.opportunity.mapper.OpportunityMapper;
import com.crm.opportunity.port.inbound.ConvertToProjectCmd;
import com.crm.opportunity.port.inbound.OpportunityConvertException;
import com.crm.opportunity.port.inbound.OpportunityConvertPort;
+import com.crm.opportunity.stage.OpportunityStageService;
import com.crm.opportunity.state.OpportunityTransition;
import com.crm.opportunity.state.OpportunityTransitionCmd;
import lombok.RequiredArgsConstructor;
@@ -21,6 +22,9 @@ import org.springframework.transaction.annotation.Transactional;
* ���P�t�,l�QX� ?5) 9pYdo�t�[C~ig�em��mjo��(1X~�m?�m�]�tf�&1�Y {@link OpportunityConvertException}�? * ����B_�~@i[_�"X�Y��yO�n CAS �o�����
Y�S�o�]aqX� rO� �e� �e߂Y�&bxV�o�]m�t�Q�}���P�t[�bQ�9pYdo�t�[C~�? * O�5g�} CAS P�,�Js^g�'v�m�T�`�m� �~�[_�[�P6r�|\Z~��xO���o'h]�m� �[�P6r�o b�[�HWode review 20260824 t�0�z�Y� ?/p>
+ *
+ * <p>^g?2 q��e�Y�"X�0 06��}\m���]}�5k8 ��,a�YZ��^�`�Y�0 %T�?current_stage_id +�?b~u�Y!�o�Xpne��T~uz��PcP
+ * ��}\�Q^g� 0)���� �]߂P�kjZ�W9^ig�m�]Y���1}���P�t[�bQ��t��}�m�]xV�o�] %T���}�h(h��^g�2]Ó���Q���e}��?/p>
*/
@Service
@RequiredArgsConstructor
@@ -31,6 +35,7 @@ public class OpportunityConvertPortImpl implements OpportunityConvertPort {
private final OpportunityMapper oppMapper;
private final OpportunityTransition transition;
+ private final OpportunityStageService stageService;
@Override
@Transactional(rollbackFor = Exception.class)
@@ -50,6 +55,8 @@ public class OpportunityConvertPortImpl implements OpportunityConvertPort {
transition.execute(cmd.opportunityId(),
new OpportunityTransitionCmd.ConvertToProjectCmd(
SYSTEM_OPERATOR, cmd.projectId(), cmd.schemeCardId()));
+ // ^g?2 q��e�Y�"X�0 06��}\m���]}�5k8 ��,a�Y +�?Õ5���9i^S�Yw��QPm9p3l�Y�^� }\�Q^g� 0)���� ?+ stageService.onConvertedToProject(opp);
} catch (BusinessErrorException e) {
// ����B_���P�tt�0�z�3kAS �o����Y��XQē�߂Y�&bxV�o�]m�t�Q}5pĉ�g\m*[�Y�[�c�S9p~\�W E8�Y}�o�]aqX� xO�W0��d�{�~
Y�a�m? Opportunity latest = oppMapper.selectById(cmd.opportunityId());
diff --git a/crm-opportunity/src/test/java/com/crm/opportunity/port/inbound/OpportunityConvertPortImplTest.java b/crm-opportunity/src/test/java/com/crm/opportunity/port/inbound/OpportunityConvertPortImplTest.java
index 317e163..01d9532 100644
--- a/crm-opportunity/src/test/java/com/crm/opportunity/port/inbound/OpportunityConvertPortImplTest.java
+++ b/crm-opportunity/src/test/java/com/crm/opportunity/port/inbound/OpportunityConvertPortImplTest.java
@@ -6,6 +6,7 @@ import com.crm.opportunity.domain.entity.Opportunity;
import com.crm.opportunity.domain.enums.OpportunityStatus;
import com.crm.opportunity.mapper.OpportunityMapper;
import com.crm.opportunity.port.inbound.impl.OpportunityConvertPortImpl;
+import com.crm.opportunity.stage.OpportunityStageService;
import com.crm.opportunity.state.OpportunityTransition;
import com.crm.opportunity.state.OpportunityTransitionCmd;
import org.junit.jupiter.api.DisplayName;
@@ -40,6 +41,7 @@ class OpportunityConvertPortImplTest {
@Mock private OpportunityMapper oppMapper;
@Mock private OpportunityTransition transition;
+ @Mock private OpportunityStageService stageService;
@InjectMocks
private OpportunityConvertPortImpl port;
@@ -73,6 +75,8 @@ class OpportunityConvertPortImplTest {
.doesNotThrowAnyException();
verify(transition, never()).execute(anyLong(), any());
+ // ���P�t[�bQ��t��}�m�]xV�o�] %T�)1jZCO�NT���}�h(h��^g�2]���Q���e}�~?06��}\m���]}
+ verify(stageService, never()).onConvertedToProject(any());
}
@Test
@@ -89,14 +93,17 @@ class OpportunityConvertPortImplTest {
}
@Test
- @DisplayName("��(1X~�m?2) +�?�t�Q�Y��yO�n E8�"X���q��`m?0L + projectId/schemeCardId ��Ʌ�c�M}")
+ @DisplayName("��(1X~�m?2) +�?�t�Q�Y��yO�n E8�"X���q��`m?0L + projectId/schemeCardId ��Ʌ�c�M}+ Õ5���q��e�Y9i^S�Ye��T~uz��PcP")
void convert_advancing_invokesTransitionWithSystemOperator() {
- when(oppMapper.selectById(OPP_ID)).thenReturn(oppAt(OpportunityStatus.STATUS_ADVANCING));
+ Opportunity opp = oppAt(OpportunityStatus.STATUS_ADVANCING);
+ when(oppMapper.selectById(OPP_ID)).thenReturn(opp);
port.convert(new ConvertToProjectCmd(OPP_ID, SCHEME_CARD_ID, PROJECT_ID));
verify(transition).execute(eq(OPP_ID), eq(
new OpportunityTransitionCmd.ConvertToProjectCmd(0L, PROJECT_ID, SCHEME_CARD_ID)));
+ // ^g?2 q��e�Y�"X�0 06��}\m���]}�5k8 ��,a�YZ��^ %T�)1jZCO�Ve��T~uz��PcP��}\�Q^g� 0)���� ?+ verify(stageService).onConvertedToProject(opp);
}
@Test
diff --git a/crm-rule/src/main/java/com/crm/rule/constant/OpportunityRuleConstants.java b/crm-rule/src/main/java/com/crm/rule/constant/OpportunityRuleConstants.java
index 50a902a..88e9c52 100644
--- a/crm-rule/src/main/java/com/crm/rule/constant/OpportunityRuleConstants.java
+++ b/crm-rule/src/main/java/com/crm/rule/constant/OpportunityRuleConstants.java
@@ -1,10 +1,11 @@
package com.crm.rule.constant;
/**
- * _��U�nYt�R�W�Y3 ao/udzV�X�S4Z�uI�R�k�S��}�~?05 / PRD d5�?+ * _��U�nYt�R�W�Y3 ao/udzV�X�S4Z�uI�R�k�S?�~?05 + Õ5����Y!�o �~?06 / PRD d5-d6�? *
* <p>�m?{@link RuleConstants}�"X�V�~#2I�R�k�ti��q}R��UYqX[�Y��mbfȓ?�I�R�k{T���Je�t�rZ�~\�� 64xxx $i�T"k
- * �?4008 �t�Q}R��V�X B �Xpn�5�� yO�n͓��YsÓ���`"���}��?/p>
+ * �?4008-64012 O��ccYt�R�W�?4013 �t�pjZ�Wɓ!S}���P�Xȓ��Y��?���Pde|��Q?m/ē��`͓�V���my��0 05/06/07 O��S��(�?+ * ���\�Xȓ��[���]�u���]�SO����[9p?V-CONFIG J�NqYq�"X�0 06���\Bm���]}��?/p>
*/
public interface OpportunityRuleConstants {
@@ -36,6 +37,17 @@ public interface OpportunityRuleConstants {
String RULE_CODE_PREFIX = "POOL_RULE_";
+ /*-------- Õ5����Y!�o�"X�0 06�Y0}+hrS��]} + e��T~uz��PcP ---------*/
+
+ /** Õ5����Y!�o+hrS��]}�"X���qSe��6a}4d�__$i�T"k�w[-CONFIG 1�?*/
+ String TEMPLATE_CODE_PREFIX = "OPP_STAGE_TPL_";
+
+ /** ��}\�Q^g� 0)���� �]Pm9p3l�Y�pt�tO�?code�"X�0 06��}\m���]0}�Y�_ɓV/u:�� wO {Y���W��wO�|“ĉ �W��Fm$i-W0m9i^S�YR��b�c�?*/
+ String FIXED_STAGE_DICT_CODE = "OPP_STAGE_05";
+
+ /** ��}\�Q^g� 0)���� �]Pm9p3l�Y�ptMw�~�T�`�HWustom_node_name �my�%ÓAR�kp@iTZ��]�S4d�f} */
+ String FIXED_STAGE_NAME = "�[6�Fm$i-W0m";
+
/*-------- �m,l�Y��k��.��O}64xxx�~\4^ RuleConstants 64007 $i�T"k�?--------*/
/** Yt�R�WY��P�f/�5�� yONr`i}\Q0�t?*/
@@ -52,4 +64,21 @@ public interface OpportunityRuleConstants {
/** Y�b�zÓX� �Pde��)1�h�m�^�S9p�QB_/u�QQ�Yt�R�W���]T_�%X4Q•(1��)�'hne�m� �?*/
int CODE_OPP_RULE_DEPT_CONFLICT = 64012;
+
+ /*-------- Õ5����Y!�o�m,l�Y��k��.��O}�~?06�?4013 �t�p0�[��} --------*/
+
+ /** �Y!�oY��P�f/�5�� yONr`i}\Q0�t?*/
+ int CODE_STAGE_TPL_INVALID = 64013;
+
+ /** �Y!�o�Xpn�m�]�tf�?*/
+ int CODE_STAGE_TPL_NOT_EXIST = 64014;
+
+ /** `mpT]�~�Wr_R��r}Y�b�z�m\�� xO�QK��nde�m�]r_)�X[4^R��r} */
+ int CODE_STAGE_TPL_NOT_DRAFT = 64015;
+
+ /** Z�~\ɓ��*}.�xO�Qp:jjn}� Y���"X*}HgbB_/u�QQ�/K��nde�XpnÓ5g {P��]Se��-a�g}� Y���?*/
+ int CODE_STAGE_TPL_DRAFT_EXISTS = 64016;
+
+ /** Y�b�z͓��Ys�o�����6ljZCO�Y�R_�S�� {9p~\�f�X�hœ��� 3l�Y�?p@iT code �TQ0�?*/
+ int CODE_STAGE_TPL_NODE_INVALID = 64017;
}