Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,10 @@ public enum BusinessModuleField {
* 计划回款时间
*/
CONTRACT_PAYMENT_PLAN_PLAN_END_TIME("contractPaymentPlanPlanEndTime", "planEndTime", Set.of("rules.required", "dateType", "mobile", "readable"), FormKey.CONTRACT_PAYMENT_PLAN.getKey()),
/**
* 回款计划名称
*/
CONTRACT_PAYMENT_PLAN_NAME("contractPaymentPlanName", "name", Set.of("rules.required", "mobile", "readable"), FormKey.CONTRACT_PAYMENT_PLAN.getKey()),
/*------ end: CONTRACT_PAYMENT_PLAN ------*/


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@


import cn.cordys.common.util.OnceInterface;
import cn.cordys.common.util.OnceInterfaceAction;
import cn.cordys.crm.clue.service.ClueService;
import cn.cordys.crm.system.domain.Parameter;
import cn.cordys.crm.system.service.ModuleFieldService;
Expand All @@ -17,6 +18,7 @@
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

/**
* @author jianxing
Expand Down Expand Up @@ -54,6 +56,7 @@ public void initOneTime() {
initOneTime(clueService::processTransferredCluePlanAndRecord, "process.transferred.clue");
initOneTime(moduleFormService::initUpgradeForm, "init.upgrade.form.v1.4.0");
initOneTime(moduleFormService::initUpgradeForm, "init.upgrade.form.v1.5.0");
initOneTime(moduleFormService::initExtFieldsByVer, "1.5.0", "init.ext.fields.v1.5.0");
} finally {
lock.unlock();
}
Expand All @@ -73,6 +76,27 @@ private void initOneTime(OnceInterface onceFunc, final String key) {
}
}

/**
* 执行单次接口 (带参数)
* @param onceFunc 执行函数
* @param param 参数
* @param key 执行Key
* @param <P> 参数类型
*/
private <P> void initOneTime(OnceInterfaceAction<P> onceFunc, P param, final String key) {
try {
LambdaQueryWrapper<Parameter> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Parameter::getParamKey, key);
List<Parameter> parameters = parameterMapper.selectListByLambda(queryWrapper);
if (CollectionUtils.isEmpty(parameters)) {
onceFunc.execute(param);
insertParameterOnceKey(key);
}
} catch (Throwable e) {
log.error(e.getMessage(), e);
}
}

private void insertParameterOnceKey(String key) {
Parameter parameter = new Parameter();
parameter.setParamKey(key);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@
@Table(name = "contract_payment_plan")
public class ContractPaymentPlan extends BaseModel {

@Schema(description = "回款计划名称")
private String name;

@Schema(description = "合同ID")
private String contractId;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
@Table(name = "contract_payment_record")
public class ContractPaymentRecord extends BaseModel {

@Schema(description = "回款名称")
@Schema(description = "回款记录名称")
private String name;

@Schema(description = "回款编号")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,12 @@
*/
@Data
public class ContractPaymentPlanAddRequest {

@NotBlank
@Size(max = 255)
@Schema(description = "回款计划名称", requiredMode = Schema.RequiredMode.REQUIRED)
private String name;

@Size(max = 32)
@NotBlank
@Schema(description = "合同ID", requiredMode = Schema.RequiredMode.REQUIRED)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@
@Data
public class ContractPaymentPlanUpdateRequest {

@NotBlank
@Size(max = 255)
@Schema(description = "回款计划名称", requiredMode = Schema.RequiredMode.REQUIRED)
private String name;

@NotBlank
@Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED)
@Size(max = 32)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public class ContractPaymentRecordAddRequest {

@NotBlank
@Size(max = 255)
@Schema(description = "回款名称", requiredMode = Schema.RequiredMode.REQUIRED)
@Schema(description = "回款记录名称", requiredMode = Schema.RequiredMode.REQUIRED)
private String name;

@NotBlank
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public class ContractPaymentRecordUpdateRequest {

@NotBlank
@Size(max = 255)
@Schema(description = "回款名称", requiredMode = Schema.RequiredMode.REQUIRED)
@Schema(description = "回款记录名称", requiredMode = Schema.RequiredMode.REQUIRED)
private String name;

@NotBlank
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

<mapper namespace="cn.cordys.crm.contract.mapper.ExtContractPaymentPlanMapper">
<select id="list" resultType="cn.cordys.crm.contract.dto.response.ContractPaymentPlanListResponse">
select cpp.id, cpp.owner, cpp.create_time, cpp.update_time, cpp.create_user, cpp.update_user,
select cpp.id, cpp.name, cpp.owner, cpp.create_time, cpp.update_time, cpp.create_user, cpp.update_user,
cpp.plan_end_time, cpp.plan_amount, cpp.plan_status, cpp.contract_id,
c.name as contract_name
from contract_payment_plan cpp
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ public ContractPaymentPlanGetResponse get(String id, String orgId) {
return contractPaymentPlanGetResponse;
}

@OperationLog(module = LogModule.CONTRACT_PAYMENT, type = LogType.ADD)
@OperationLog(module = LogModule.CONTRACT_PAYMENT, type = LogType.ADD, resourceName = "{#request.name}", operator = "{#userId}")
public ContractPaymentPlan add(ContractPaymentPlanAddRequest request, String userId, String orgId) {
ContractPaymentPlan contractPaymentPlan = BeanUtils.copyBean(new ContractPaymentPlan(), request);
if (StringUtils.isBlank(request.getOwner())) {
Expand All @@ -225,19 +225,11 @@ public ContractPaymentPlan add(ContractPaymentPlanAddRequest request, String use
contractPaymentPlan.setCreateUser(userId);
contractPaymentPlan.setOrganizationId(orgId);
contractPaymentPlan.setId(IDGenerator.nextStr());

//保存自定义字段
// 保存自定义字段
contractPaymentPlanFieldService.saveModuleField(contractPaymentPlan, orgId, userId, request.getModuleFields(), false);

contractPaymentPlanMapper.insert(contractPaymentPlan);

Contract contract = contractMapper.selectByPrimaryKey(contractPaymentPlan.getContractId());

String resourceName = contract == null ? contractPaymentPlan.getContractId() : contract.getName();

// 日志
baseService.handleAddLog(contractPaymentPlan, request.getModuleFields());
OperationLogContext.getContext().setResourceName(resourceName);
OperationLogContext.getContext().setResourceId(contractPaymentPlan.getId());
return contractPaymentPlan;
}

Expand Down Expand Up @@ -266,11 +258,8 @@ public ContractPaymentPlan update(ContractPaymentPlanUpdateRequest request, Stri
contractPaymentPlanMapper.update(contractPaymentPlan);

contractPaymentPlan = contractPaymentPlanMapper.selectByPrimaryKey(request.getId());
Contract contract = contractMapper.selectByPrimaryKey(contractPaymentPlan.getContractId());

String resourceName = contract == null ? originContractPaymentPlan.getContractId() : contract.getName();

baseService.handleUpdateLog(originContractPaymentPlan, contractPaymentPlan, originContractPaymentPlanFields, request.getModuleFields(), originContractPaymentPlan.getId(), resourceName);
baseService.handleUpdateLog(originContractPaymentPlan, contractPaymentPlan, originContractPaymentPlanFields, request.getModuleFields(), originContractPaymentPlan.getId(), originContractPaymentPlan.getName());
return contractPaymentPlan;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,11 @@ public interface ExtModuleFieldMapper {
* @param mobile 移动端显示
*/
void batchUpdateMobile(@Param("ids") List<String> ids, @Param("mobile") Boolean mobile);

/**
* 获取表单字段最大位次
* @param formId 表单ID
* @return 位置下标
*/
Long getMaxFieldPosByFormId(String formId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@
</foreach>
</update>

<select id="getMaxFieldPosByFormId" resultType="java.lang.Long">
select pos from sys_module_field where form_id = #{formId} order by pos desc limit 1
</select>

<select id="getSourceOptionsByIds" resultType="cn.cordys.common.dto.OptionDTO">
select id, name from ${tableName} where id in
<foreach collection="ids" item="id" open="(" separator="," close=")">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -801,6 +801,45 @@ public void initUpgradeForm() {
initFormAndFields(allKeys);
}

@SuppressWarnings("unchecked")
public void initExtFieldsByVer(String version) {
try {
List<ModuleField> fields = new ArrayList<>();
List<ModuleFieldBlob> fieldBlobs = new ArrayList<>();
Map<String, List<Map<String, Object>>> fieldMap = JSON.parseObject(fieldResource.getInputStream(), Map.class);
fieldMap.forEach((formKey, formFields) -> {
boolean existExtVerField = formFields.stream().anyMatch(f -> f.containsKey("ext_ver") && Strings.CS.equals(version, f.get("ext_ver").toString()));
if (!existExtVerField) {
return;
}
ModuleForm example = new ModuleForm();
example.setFormKey(formKey);
ModuleForm form = moduleFormMapper.selectOne(example);
if (form == null) {
log.error("未找到表单 {}, 无法初始化扩展字段", formKey);
return;
}
Long maxPos = extModuleFieldMapper.getMaxFieldPosByFormId(form.getId());
List<Map<String, Object>> extFields = formFields.stream().filter(f -> f.containsKey("ext_ver") && Strings.CS.equals(version, f.get("ext_ver").toString())).toList();
AtomicLong pos = new AtomicLong(maxPos + 1);
extFields.forEach(initField -> {
ModuleField field = supplyFieldInfo(initField, form.getId(), pos.getAndIncrement(), new HashMap<>(2));
initField.put("id", field.getId());
fields.add(field);
ModuleFieldBlob fieldBlob = new ModuleFieldBlob();
fieldBlob.setId(field.getId());
fieldBlob.setProp(JSON.toJSONString(initField));
fieldBlobs.add(fieldBlob);
});
moduleFieldMapper.batchInsert(fields);
moduleFieldBlobMapper.batchInsert(fieldBlobs);
});
} catch (Exception e) {
log.error("表单扩展字段初始化失败: {}", e.getMessage());
throw new GenericException("表单扩展字段初始化失败", e);
}
}

/**
* 表单及字段初始化 (升级)
*
Expand Down Expand Up @@ -855,18 +894,7 @@ public void initFormFields(Map<String, String> formKeyMap) {
// 显隐规则Key-ID映射
Map<String, String> controlKeyPreMap = new HashMap<>(2);
initFields.forEach(initField -> {
ModuleField field = new ModuleField();
field.setFormId(formId);
field.setInternalKey(initField.get("internalKey").toString());
field.setId(controlKeyPreMap.containsKey(field.getInternalKey()) ? controlKeyPreMap.get(field.getInternalKey()) : IDGenerator.nextStr());
field.setType(initField.get("type").toString());
field.setName(initField.get("name").toString());
field.setMobile((Boolean) initField.getOrDefault("mobile", false));
field.setPos(pos.getAndIncrement());
field.setCreateTime(System.currentTimeMillis());
field.setCreateUser(InternalUser.ADMIN.getValue());
field.setUpdateTime(System.currentTimeMillis());
field.setUpdateUser(InternalUser.ADMIN.getValue());
ModuleField field = supplyFieldInfo(initField, formId, pos.getAndIncrement(), controlKeyPreMap);
initField.put("id", field.getId());
fields.add(field);
if (initField.containsKey(CONTROL_RULES_KEY)) {
Expand Down Expand Up @@ -902,6 +930,30 @@ public void initFormFields(Map<String, String> formKeyMap) {
}
}

/**
* 组装字段基础信息
* @param fieldMap 字段集合
* @param formId 表单ID
* @param pos 字段位置
* @param controlKeyPreMap 显隐规则Key-ID映射
* @return 字段
*/
private ModuleField supplyFieldInfo(Map<String, Object> fieldMap, String formId, Long pos, Map<String, String> controlKeyPreMap) {
ModuleField field = new ModuleField();
field.setId(controlKeyPreMap.containsKey(field.getInternalKey()) ? controlKeyPreMap.get(field.getInternalKey()) : IDGenerator.nextStr());
field.setFormId(formId);
field.setInternalKey(fieldMap.get("internalKey").toString());
field.setType(fieldMap.get("type").toString());
field.setName(fieldMap.get("name").toString());
field.setMobile((Boolean) fieldMap.getOrDefault("mobile", false));
field.setPos(pos);
field.setCreateTime(System.currentTimeMillis());
field.setCreateUser(InternalUser.ADMIN.getValue());
field.setUpdateTime(System.currentTimeMillis());
field.setUpdateUser(InternalUser.ADMIN.getValue());
return field;
}

/**
* 初始化数据类型-数据源映射
*
Expand Down
18 changes: 17 additions & 1 deletion backend/crm/src/main/resources/form/field.json
Original file line number Diff line number Diff line change
Expand Up @@ -1541,6 +1541,22 @@
}
],
"contractPaymentPlan": [
{
"name": "回款计划名称",
"internalKey": "contractPaymentPlanName",
"type": "INPUT",
"showLabel": true,
"readable": true,
"editable": true,
"fieldWidth": 1,
"rules": [
{
"key": "required"
}
],
"mobile": true,
"ext_ver": "1.5.0"
},
{
"name": "合同",
"internalKey": "contractPaymentPlanContract",
Expand Down Expand Up @@ -2000,7 +2016,7 @@
"titleColor": "#323535"
},
{
"name": "回款名称",
"name": "回款记录名称",
"internalKey": "contractPaymentRecordName",
"type": "INPUT",
"showLabel": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ CREATE INDEX idx_invoice_id ON contract_invoice_snapshot (invoice_id ASC);
CREATE TABLE contract_payment_record
(
`id` VARCHAR(32) NOT NULL COMMENT 'id',
`name` VARCHAR(255) NOT NULL COMMENT '回款名称',
`name` VARCHAR(255) NOT NULL COMMENT '回款记录名称',
`no` VARCHAR(50) COMMENT '回款编号',
`owner` VARCHAR(32) NOT NULL COMMENT '负责人',
`contract_id` VARCHAR(32) NOT NULL COMMENT '合同ID',
Expand Down Expand Up @@ -186,6 +186,8 @@ CREATE INDEX idx_resource_id ON contract_payment_record_field_blob (resource_id

-- modify form_key length to 50
ALTER TABLE sys_module_form MODIFY COLUMN form_key VARCHAR (50);
-- add payment plan name field
ALTER TABLE contract_payment_plan ADD COLUMN name VARCHAR(255) NOT NULL COMMENT '回款计划名称' AFTER id;

-- set innodb lock wait timeout to default
SET SESSION innodb_lock_wait_timeout = DEFAULT;
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ void testTab() throws Exception {
void testAdd() throws Exception {
// 请求成功
ContractPaymentPlanAddRequest request = new ContractPaymentPlanAddRequest();
request.setName("test");
request.setPlanAmount(BigDecimal.valueOf(111));
request.setOwner(InternalUser.ADMIN.getValue());
request.setPlanStatus(ContractPaymentPlanStatus.PENDING.name());
Expand All @@ -91,6 +92,7 @@ void testUpdate() throws Exception {
// 请求成功
ContractPaymentPlanUpdateRequest request = new ContractPaymentPlanUpdateRequest();
request.setId(addContractPaymentPlan.getId());
request.setName("test");
request.setPlanAmount(BigDecimal.valueOf(222));
this.requestPostWithOk(DEFAULT_UPDATE, request);
// 校验请求成功数据
Expand All @@ -100,6 +102,7 @@ void testUpdate() throws Exception {
// 不修改信息
ContractPaymentPlanUpdateRequest emptyRequest = new ContractPaymentPlanUpdateRequest();
emptyRequest.setId(addContractPaymentPlan.getId());
emptyRequest.setName("test");
this.requestPostWithOk(DEFAULT_UPDATE, emptyRequest);

// 校验权限
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ void saveNotice() {

ContractPaymentPlan contractPaymentPlan = new ContractPaymentPlan();
contractPaymentPlan.setId("SDDFDJJND");
contractPaymentPlan.setName("test");
contractPaymentPlan.setOrganizationId("100001");
contractPaymentPlan.setContractId("SDDFDJJND");
contractPaymentPlan.setPlanStatus(ContractPaymentPlanStatus.PENDING.name());
Expand All @@ -104,6 +105,7 @@ void saveNotice() {

contractPaymentPlan = new ContractPaymentPlan();
contractPaymentPlan.setId("SgDFDJJND");
contractPaymentPlan.setName("test");
contractPaymentPlan.setOrganizationId("100001");
contractPaymentPlan.setContractId("SDDFDJJND");
contractPaymentPlan.setPlanStatus(ContractPaymentPlanStatus.PENDING.name());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package cn.cordys.common.util;

/**
* 执行单次接口
* @author song-cc-rock
*/
@FunctionalInterface
public interface OnceInterface {

Expand Down
Loading
Loading