Skip to content

Commit faeae71

Browse files
song-cc-rockfit2-zhao
authored andcommitted
fix: Source ref detail
--task=1021145@tapd-34675357 --user=宋昌昌 【bug转需求】后端-数据源字段填充到子表格后无法展示配置的显示字段 https://www.tapd.cn/34675357/s/1860263
1 parent 778bc87 commit faeae71

File tree

5 files changed

+142
-0
lines changed

5 files changed

+142
-0
lines changed

backend/crm/src/main/java/cn/cordys/common/constants/LinkScenarioKey.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ public enum LinkScenarioKey {
1111
* 线索转客户
1212
*/
1313
CLUE_TO_CUSTOMER,
14+
/**
15+
* 线索转联系人
16+
*/
17+
CLUE_TO_CONTACT,
1418
/**
1519
* 线索转商机
1620
*/

backend/crm/src/main/java/cn/cordys/crm/system/controller/ModuleFieldController.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@
4242
import cn.cordys.crm.product.dto.response.ProductPriceResponse;
4343
import cn.cordys.crm.product.service.ProductPriceService;
4444
import cn.cordys.crm.product.service.ProductService;
45+
import cn.cordys.crm.system.dto.DatasourceRefDTO;
46+
import cn.cordys.crm.system.dto.request.DatasourceRefQueryRequest;
4547
import cn.cordys.crm.system.dto.request.FieldRepeatCheckRequest;
4648
import cn.cordys.crm.system.dto.request.FieldResolveRequest;
4749
import cn.cordys.crm.system.dto.response.FieldRepeatCheckResponse;
@@ -223,4 +225,10 @@ public Pager<List<BusinessTitleListResponse>> sourceBusinessTitlePage(@Valid @Re
223225
return businessTitleService.list(request, SessionUtils.getUserId(), OrganizationContext.getOrganizationId());
224226
}
225227

228+
@PostMapping("/source/ref-detail")
229+
@Operation(summary = "批量获取数据源引用详情")
230+
public List<DatasourceRefDTO> getDatasourceRefDetail(@Valid @RequestBody DatasourceRefQueryRequest request) {
231+
return moduleFieldService.getSourceRefDetail(request);
232+
}
233+
226234
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package cn.cordys.crm.system.dto;
2+
3+
import cn.cordys.common.domain.BaseModuleFieldValue;
4+
import cn.cordys.common.dto.OptionDTO;
5+
import io.swagger.v3.oas.annotations.media.Schema;
6+
import lombok.Data;
7+
8+
import java.util.ArrayList;
9+
import java.util.List;
10+
import java.util.Map;
11+
12+
/**
13+
* 数据源引用详情信息
14+
* @author song-cc-rock
15+
*/
16+
@Data
17+
public class DatasourceRefDTO {
18+
19+
@Schema(description = "数据源ID")
20+
private String id;
21+
22+
@Schema(description = "自定义字段集合")
23+
private List<BaseModuleFieldValue> moduleFields;
24+
25+
@Schema(description = "产品子列表")
26+
private List<Map<String, Object>> products;
27+
28+
@Schema(description = "选项集合")
29+
private Map<String, List<OptionDTO>> optionMap;
30+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package cn.cordys.crm.system.dto.request;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import jakarta.validation.constraints.NotEmpty;
5+
import jakarta.validation.constraints.NotNull;
6+
import lombok.Data;
7+
8+
import java.util.List;
9+
10+
/**
11+
* 数据源引用请求对象
12+
* @author song-cc-rock
13+
*/
14+
@Data
15+
public class DatasourceRefQueryRequest {
16+
17+
@NotNull
18+
@Schema(description = "数据源ID集合")
19+
private List<String> sourceIds;
20+
@NotEmpty
21+
@Schema(description = "数据源类型")
22+
private String dataSourceType;
23+
}

backend/crm/src/main/java/cn/cordys/crm/system/service/ModuleFieldService.java

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,41 +2,57 @@
22

33
import cn.cordys.common.constants.BusinessModuleField;
44
import cn.cordys.common.constants.FormKey;
5+
import cn.cordys.common.domain.BaseModuleFieldValue;
56
import cn.cordys.common.dto.BaseTreeNode;
7+
import cn.cordys.common.dto.OptionDTO;
68
import cn.cordys.common.exception.GenericException;
79
import cn.cordys.common.mapper.CommonMapper;
10+
import cn.cordys.common.util.CommonBeanFactory;
811
import cn.cordys.common.util.JSON;
912
import cn.cordys.common.util.Translator;
13+
import cn.cordys.crm.product.service.ProductPriceService;
14+
import cn.cordys.crm.product.service.ProductService;
15+
import cn.cordys.crm.system.constants.FieldSourceType;
1016
import cn.cordys.crm.system.constants.FieldType;
1117
import cn.cordys.crm.system.domain.ModuleField;
1218
import cn.cordys.crm.system.domain.ModuleFieldBlob;
19+
import cn.cordys.crm.system.dto.DatasourceRefDTO;
1320
import cn.cordys.crm.system.dto.field.DatasourceField;
1421
import cn.cordys.crm.system.dto.field.DateTimeField;
22+
import cn.cordys.crm.system.dto.request.DatasourceRefQueryRequest;
1523
import cn.cordys.crm.system.dto.request.FieldRepeatCheckRequest;
1624
import cn.cordys.crm.system.dto.response.FieldRepeatCheckResponse;
1725
import cn.cordys.mybatis.BaseMapper;
1826
import cn.cordys.mybatis.lambda.LambdaQueryWrapper;
1927
import jakarta.annotation.Resource;
28+
import lombok.extern.slf4j.Slf4j;
2029
import org.apache.commons.collections4.CollectionUtils;
2130
import org.apache.commons.lang3.StringUtils;
2231
import org.apache.commons.lang3.Strings;
2332
import org.springframework.stereotype.Service;
2433

34+
import java.lang.reflect.Field;
35+
import java.lang.reflect.Method;
36+
import java.util.ArrayList;
2537
import java.util.HashMap;
2638
import java.util.List;
2739
import java.util.Map;
40+
import java.util.stream.Stream;
2841

2942
/**
3043
* @author song-cc-rock
3144
*/
3245
@Service
46+
@Slf4j
3347
public class ModuleFieldService {
3448

3549
/**
3650
* 表单表格映射
3751
*/
3852
private static final Map<String, String> FORM_TABLE = new HashMap<>(8);
3953

54+
private static final Map<String, Class<?>> SOURCE_REF_CLASS = new HashMap<>();
55+
4056
static {
4157
FORM_TABLE.put(FormKey.CLUE.getKey(), "clue");
4258
FORM_TABLE.put(FormKey.CUSTOMER.getKey(), "customer");
@@ -51,6 +67,9 @@ public class ModuleFieldService {
5167
FORM_TABLE.put(FormKey.CONTRACT_PAYMENT_PLAN.getKey(), "contract_payment_plan");
5268
FORM_TABLE.put(FormKey.CONTRACT_PAYMENT_RECORD.getKey(), "contract_payment_record");
5369
FORM_TABLE.put(FormKey.INVOICE.getKey(), "contract_invoice");
70+
71+
SOURCE_REF_CLASS.put(FieldSourceType.PRODUCT.name(), ProductService.class);
72+
SOURCE_REF_CLASS.put(FieldSourceType.PRICE.name(), ProductPriceService.class);
5473
}
5574

5675
@Resource
@@ -125,6 +144,39 @@ public FieldRepeatCheckResponse checkRepeat(FieldRepeatCheckRequest request, Str
125144
return FieldRepeatCheckResponse.builder().name(repeatName).repeat(StringUtils.isNotBlank(repeatName)).build();
126145
}
127146

147+
@SuppressWarnings("unchecked")
148+
public List<DatasourceRefDTO> getSourceRefDetail(DatasourceRefQueryRequest request) {
149+
List<String> sourceIds = request.getSourceIds().stream().distinct().toList();
150+
Class<?> sourceClass = SOURCE_REF_CLASS.get(request.getDataSourceType());
151+
if (sourceClass == null) {
152+
return new ArrayList<>();
153+
}
154+
155+
Object service = CommonBeanFactory.getBean(sourceClass);
156+
List<DatasourceRefDTO> result = new ArrayList<>();
157+
try {
158+
Method executeMethod = sourceClass.getMethod("get", String.class);
159+
for (String id : sourceIds) {
160+
Object res = executeMethod.invoke(service, id);
161+
if (res == null) {
162+
continue;
163+
}
164+
DatasourceRefDTO dto = new DatasourceRefDTO();
165+
dto.setId(id);
166+
dto.setModuleFields((List<BaseModuleFieldValue>) getField(res, "moduleFields", List.class));
167+
dto.setProducts((List<Map<String, Object>>) getField(res, "products", List.class));
168+
dto.setOptionMap((Map<String, List<OptionDTO>>) getField(res, "optionMap", Map.class));
169+
170+
result.add(dto);
171+
}
172+
} catch (Exception e) {
173+
log.error("获取数据源引用详细失败, {}", e.getMessage());
174+
return new ArrayList<>();
175+
}
176+
177+
return result;
178+
}
179+
128180
public void modifyInvoiceShowFields() {
129181
LambdaQueryWrapper<ModuleField> queryWrapper = new LambdaQueryWrapper<>();
130182
queryWrapper.eq(ModuleField::getInternalKey, BusinessModuleField.INVOICE_CONTRACT_ID.getKey());
@@ -165,4 +217,29 @@ public ModuleField selectFieldsByInternalKey(String internalKey) {
165217
field.setInternalKey(internalKey);
166218
return moduleFieldMapper.selectOne(field);
167219
}
220+
221+
@SuppressWarnings("unchecked")
222+
private <T> T getField(Object obj, String fieldName, Class<T> type) {
223+
Class<?> clazz = obj.getClass();
224+
225+
while (clazz != null) {
226+
try {
227+
Field field = clazz.getDeclaredField(fieldName);
228+
field.setAccessible(true);
229+
230+
Object value = field.get(obj);
231+
if (type.isInstance(value)) {
232+
return (T) value;
233+
}
234+
235+
return null;
236+
} catch (NoSuchFieldException e) {
237+
clazz = clazz.getSuperclass();
238+
} catch (IllegalAccessException e) {
239+
return null;
240+
}
241+
}
242+
243+
return null;
244+
}
168245
}

0 commit comments

Comments
 (0)