diff --git a/backend/crm/src/main/java/cn/cordys/common/constants/BusinessModuleField.java b/backend/crm/src/main/java/cn/cordys/common/constants/BusinessModuleField.java index 75bfbbd49..2f212e838 100644 --- a/backend/crm/src/main/java/cn/cordys/common/constants/BusinessModuleField.java +++ b/backend/crm/src/main/java/cn/cordys/common/constants/BusinessModuleField.java @@ -193,8 +193,50 @@ public enum BusinessModuleField { /*------ start: PRODUCT ------*/ PRODUCT_NAME("productName", "name", Set.of("rules.required", "mobile"), FormKey.PRODUCT.getKey()), PRODUCT_PRICE("productPrice", "price", Set.of(), FormKey.PRODUCT.getKey()), - PRODUCT_STATUS("productStatus", "status", Set.of("rules.required", "mobile"), FormKey.PRODUCT.getKey()); + PRODUCT_STATUS("productStatus", "status", Set.of("rules.required", "mobile"), FormKey.PRODUCT.getKey()), /*------ end: PRODUCT ------*/ + + /** + * 价格表单 + */ + PRICE_NAME("priceName", "name", Set.of("rules.required", "mobile"), FormKey.PRICE.getKey()), + PRICE_STATUS("priceStatus", "status", Set.of("rules.required", "mobile"), FormKey.PRICE.getKey()), + PRICE_PRODUCT_TABLE("priceProducts", "products", Set.of("mobile"), FormKey.PRICE.getKey()), + PRICE_PRODUCT("priceProduct", "product", Set.of("rules.required", "mobile", "dataSourceType"), FormKey.PRICE.getKey()), + PRICE_PRODUCT_AMOUNT("priceProductAmount", "amount", Set.of("rules.required", "mobile"), FormKey.PRICE.getKey()), + + /** + * 报价单表单 + */ + QUOTATION_NAME("quotationName", "name", Set.of("rules.required", "mobile"), FormKey.QUOTATION.getKey()), + QUOTATION_OPPORTUNITY("quotationOpportunity", "opportunityId", Set.of("rules.required", "mobile"), FormKey.QUOTATION.getKey()), + QUOTATION_PRODUCT_TABLE("quotationProducts", "products", Set.of("mobile"), FormKey.QUOTATION.getKey()), + QUOTATION_PRODUCT("quotationProduct", "product", Set.of("rules.required", "mobile", "dataSourceType"), FormKey.QUOTATION.getKey()), + QUOTATION_PRODUCT_AMOUNT("quotationAmount", "amount", Set.of("rules.required", "mobile"), FormKey.QUOTATION.getKey()), + + /** + * 合同回款计划 + */ + /*------ start: CONTRACT_PAYMENT_PLAN ------*/ + /** + * 负责人 + */ + CONTRACT_PAYMENT_PLAN_OWNER("contractPaymentPlanOwner", "owner", Set.of("rules.required", "mobile"), FormKey.CONTRACT_PAYMENT_PLAN.getKey()), + /** + * 合同 + */ + CONTRACT_PAYMENT_PLAN_CONTRACT("contractPaymentPlanContract", "contractId", Set.of(), FormKey.CONTRACT_PAYMENT_PLAN.getKey()), + /** + * 计划回款金额 + */ + CONTRACT_PAYMENT_PLAN_PLAN_AMOUNT("contractPaymentPlanPlanAmount", "plan_amount", Set.of(), FormKey.CONTRACT_PAYMENT_PLAN.getKey()), + /** + * 计划回款时间 + */ + CONTRACT_PAYMENT_PLAN_PLAN_END_TIME("contractPaymentPlanPlanEndTime", "plan_end_time", Set.of(), FormKey.CONTRACT_PAYMENT_PLAN.getKey()); + /*------ end: CONTRACT_PAYMENT_PLAN ------*/ + + /** * 业务字段缓存 */ diff --git a/backend/crm/src/main/java/cn/cordys/common/constants/FormKey.java b/backend/crm/src/main/java/cn/cordys/common/constants/FormKey.java index 5200e8693..2643ec8fa 100644 --- a/backend/crm/src/main/java/cn/cordys/common/constants/FormKey.java +++ b/backend/crm/src/main/java/cn/cordys/common/constants/FormKey.java @@ -52,7 +52,11 @@ public enum FormKey { /** * 合同 */ - CONTRACT("contract"); + CONTRACT("contract"), + /** + * 合同回款计划 + */ + CONTRACT_PAYMENT_PLAN("contractPaymentPlan"); private final String key; diff --git a/backend/crm/src/main/java/cn/cordys/common/service/DataInitService.java b/backend/crm/src/main/java/cn/cordys/common/service/DataInitService.java index aec3f128e..a979f2924 100644 --- a/backend/crm/src/main/java/cn/cordys/common/service/DataInitService.java +++ b/backend/crm/src/main/java/cn/cordys/common/service/DataInitService.java @@ -50,7 +50,7 @@ public void initOneTime() { initOneTime(moduleFormService::processOldLinkData, "process.old.link.data"); initOneTime(moduleFormService::initFormScenarioProp, "init.record.form.scenario"); initOneTime(clueService::processTransferredCluePlanAndRecord, "process.transferred.clue"); - initOneTime(moduleFormService::initUpgradeForm, "init.upgrade.form.v1.3.4"); + initOneTime(moduleFormService::initUpgradeForm, "init.upgrade.form.v1.4.0"); } finally { lock.unlock(); } diff --git a/backend/crm/src/main/java/cn/cordys/crm/product/controller/ProductPriceController.java b/backend/crm/src/main/java/cn/cordys/crm/product/controller/ProductPriceController.java index b948da10e..0e0b88058 100644 --- a/backend/crm/src/main/java/cn/cordys/crm/product/controller/ProductPriceController.java +++ b/backend/crm/src/main/java/cn/cordys/crm/product/controller/ProductPriceController.java @@ -1,5 +1,6 @@ package cn.cordys.crm.product.controller; +import cn.cordys.common.constants.FormKey; import cn.cordys.common.constants.PermissionConstants; import cn.cordys.common.pager.PagerWithOption; import cn.cordys.context.OrganizationContext; @@ -10,6 +11,8 @@ import cn.cordys.crm.product.dto.response.ProductPriceGetResponse; import cn.cordys.crm.product.dto.response.ProductPriceResponse; import cn.cordys.crm.product.service.ProductPriceService; +import cn.cordys.crm.system.dto.response.ModuleFormConfigDTO; +import cn.cordys.crm.system.service.ModuleFormCacheService; import cn.cordys.security.SessionUtils; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -30,6 +33,15 @@ public class ProductPriceController { @Resource private ProductPriceService priceService; + @Resource + private ModuleFormCacheService moduleFormCacheService; + + @GetMapping("/module/form") + @RequiresPermissions(PermissionConstants.PRICE_READ) + @Operation(summary = "获取表单配置") + public ModuleFormConfigDTO getModuleFormConfig() { + return moduleFormCacheService.getBusinessFormConfig(FormKey.PRICE.getKey(), OrganizationContext.getOrganizationId()); + } @PostMapping("/page") @RequiresPermissions(PermissionConstants.PRICE_READ) diff --git a/backend/crm/src/main/java/cn/cordys/crm/system/constants/FieldType.java b/backend/crm/src/main/java/cn/cordys/crm/system/constants/FieldType.java index ba7fecef4..f8af6885f 100644 --- a/backend/crm/src/main/java/cn/cordys/crm/system/constants/FieldType.java +++ b/backend/crm/src/main/java/cn/cordys/crm/system/constants/FieldType.java @@ -95,5 +95,14 @@ public enum FieldType { /** * 行业 */ - INDUSTRY + INDUSTRY, + /** + * 公式 + */ + FORMULA, + /** + * 子表-产品, 子表-价格 + */ + SUB_PRODUCT, + SUB_PRICE; } diff --git a/backend/crm/src/main/java/cn/cordys/crm/system/dto/field/FormulaField.java b/backend/crm/src/main/java/cn/cordys/crm/system/dto/field/FormulaField.java new file mode 100644 index 000000000..fd2f62090 --- /dev/null +++ b/backend/crm/src/main/java/cn/cordys/crm/system/dto/field/FormulaField.java @@ -0,0 +1,20 @@ +package cn.cordys.crm.system.dto.field; + +import cn.cordys.crm.system.dto.field.base.BaseField; +import com.fasterxml.jackson.annotation.JsonTypeName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 公式字段 + * @author song-cc-rock + */ +@Data +@JsonTypeName(value = "FORMULA") +@EqualsAndHashCode(callSuper = true) +public class FormulaField extends BaseField { + + @Schema(description = "公式") + private String formula; +} diff --git a/backend/crm/src/main/java/cn/cordys/crm/system/dto/field/PriceSubField.java b/backend/crm/src/main/java/cn/cordys/crm/system/dto/field/PriceSubField.java new file mode 100644 index 000000000..69a8b7116 --- /dev/null +++ b/backend/crm/src/main/java/cn/cordys/crm/system/dto/field/PriceSubField.java @@ -0,0 +1,13 @@ +package cn.cordys.crm.system.dto.field; + +import cn.cordys.crm.system.dto.field.base.SubField; +import com.fasterxml.jackson.annotation.JsonTypeName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@JsonTypeName("SUB_PRICE") +@EqualsAndHashCode(callSuper = true) +public class PriceSubField extends SubField { + +} diff --git a/backend/crm/src/main/java/cn/cordys/crm/system/dto/field/ProductSubField.java b/backend/crm/src/main/java/cn/cordys/crm/system/dto/field/ProductSubField.java new file mode 100644 index 000000000..1da6c1501 --- /dev/null +++ b/backend/crm/src/main/java/cn/cordys/crm/system/dto/field/ProductSubField.java @@ -0,0 +1,21 @@ +package cn.cordys.crm.system.dto.field; + +import cn.cordys.crm.system.dto.field.base.BaseField; +import cn.cordys.crm.system.dto.field.base.SubField; +import com.fasterxml.jackson.annotation.JsonTypeName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +/** + * 产品子表字段 + * @author song-cc-rock + */ +@Data +@JsonTypeName(value = "SUB_PRODUCT") +@EqualsAndHashCode(callSuper = true) +public class ProductSubField extends SubField { + +} diff --git a/backend/crm/src/main/java/cn/cordys/crm/system/dto/field/base/BaseField.java b/backend/crm/src/main/java/cn/cordys/crm/system/dto/field/base/BaseField.java index 6e6f84ca2..23aca14fc 100644 --- a/backend/crm/src/main/java/cn/cordys/crm/system/dto/field/base/BaseField.java +++ b/backend/crm/src/main/java/cn/cordys/crm/system/dto/field/base/BaseField.java @@ -13,6 +13,9 @@ import java.util.List; import java.util.Set; +/** + * @author song-cc-rock + */ @Data @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "type", visible = true) @JsonSubTypes({ @@ -38,7 +41,10 @@ @JsonSubTypes.Type(value = SerialNumberField.class, name = "SERIAL_NUMBER"), @JsonSubTypes.Type(value = AttachmentField.class, name = "ATTACHMENT"), @JsonSubTypes.Type(value = LinkField.class, name = "LINK"), - @JsonSubTypes.Type(value = IndustryField.class, name = "INDUSTRY") + @JsonSubTypes.Type(value = IndustryField.class, name = "INDUSTRY"), + @JsonSubTypes.Type(value = ProductSubField.class, name = "SUB_PRODUCT"), + @JsonSubTypes.Type(value = PriceSubField.class, name = "SUB_PRICE"), + @JsonSubTypes.Type(value = FormulaField.class, name = "FORMULA"), }) public abstract class BaseField { @@ -138,7 +144,7 @@ public boolean hasOptions() { @JsonIgnore public boolean canImport() { - return !Strings.CS.equalsAny(type, FieldType.SERIAL_NUMBER.name()) + return !Strings.CS.equalsAny(type, FieldType.SERIAL_NUMBER.name()) && !Strings.CS.equalsAny(type, FieldType.ATTACHMENT.name()) && !Strings.CS.equalsAny(type, FieldType.PICTURE.name()) && !Strings.CS.equalsAny(type, FieldType.DIVIDER.name()) && readable; } diff --git a/backend/crm/src/main/java/cn/cordys/crm/system/dto/field/base/SubField.java b/backend/crm/src/main/java/cn/cordys/crm/system/dto/field/base/SubField.java new file mode 100644 index 000000000..6b9c452f9 --- /dev/null +++ b/backend/crm/src/main/java/cn/cordys/crm/system/dto/field/base/SubField.java @@ -0,0 +1,25 @@ +package cn.cordys.crm.system.dto.field.base; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +/** + * 通用子表格字段(兼容子表格) + * @author song-cc-rock + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class SubField extends BaseField{ + + @Schema(description = "固定宽度") + private Integer fixedColumn; + + @Schema(description = "表格子字段") + private List subFields; + + @Schema(description = "汇总列") + private String sumColumn; +} diff --git a/backend/crm/src/main/java/cn/cordys/crm/system/service/ModuleFormCacheService.java b/backend/crm/src/main/java/cn/cordys/crm/system/service/ModuleFormCacheService.java index 6635076f8..4b665a19f 100644 --- a/backend/crm/src/main/java/cn/cordys/crm/system/service/ModuleFormCacheService.java +++ b/backend/crm/src/main/java/cn/cordys/crm/system/service/ModuleFormCacheService.java @@ -63,23 +63,11 @@ public ModuleFormConfigDTO getBusinessFormConfig(String formKey, String organiza ModuleFormConfigDTO businessModuleFormConfig = new ModuleFormConfigDTO(); businessModuleFormConfig.setFormProp(config.getFormProp()); - // 获取特殊的业务字段 - Map businessModuleFieldMap = Arrays.stream(BusinessModuleField.values()). - collect(Collectors.toMap(BusinessModuleField::getKey, Function.identity())); - - businessModuleFormConfig.setFields( - config.getFields() - .stream() - .peek(moduleFieldDTO -> { - BusinessModuleField businessModuleFieldEnum = businessModuleFieldMap.get(moduleFieldDTO.getInternalKey()); - if (businessModuleFieldEnum != null) { - // 设置特殊的业务字段 key - moduleFieldDTO.setBusinessKey(businessModuleFieldEnum.getBusinessKey()); - moduleFieldDTO.setDisabledProps(businessModuleFieldEnum.getDisabledProps()); - } - }) - .collect(Collectors.toList()) - ); + // 设置业务字段参数 + businessModuleFormConfig.setFields(config.getFields().stream() + .peek(moduleFormService::setFieldBusinessParam) + .collect(Collectors.toList()) + ); return businessModuleFormConfig; } } diff --git a/backend/crm/src/main/java/cn/cordys/crm/system/service/ModuleFormService.java b/backend/crm/src/main/java/cn/cordys/crm/system/service/ModuleFormService.java index c436cebf7..247350ac5 100644 --- a/backend/crm/src/main/java/cn/cordys/crm/system/service/ModuleFormService.java +++ b/backend/crm/src/main/java/cn/cordys/crm/system/service/ModuleFormService.java @@ -63,6 +63,7 @@ public class ModuleFormService { public static final Map TYPE_SOURCE_MAP; private static final String DEFAULT_ORGANIZATION_ID = "100001"; private static final String CONTROL_RULES_KEY = "showControlRules"; + private static final String SUB_FIELDS = "subFields"; static { TYPE_SOURCE_MAP = Map.of(FieldType.MEMBER.name(), "sys_user", @@ -132,23 +133,10 @@ public ModuleFormConfigDTO getBusinessFormConfig(String formKey, String organiza ModuleFormConfigDTO config = getConfig(formKey, organizationId); ModuleFormConfigDTO businessModuleFormConfig = new ModuleFormConfigDTO(); businessModuleFormConfig.setFormProp(config.getFormProp()); - - // 获取特殊的业务字段 - Map businessModuleFieldMap = Arrays.stream(BusinessModuleField.values()). - collect(Collectors.toMap(BusinessModuleField::getKey, Function.identity())); - - businessModuleFormConfig.setFields( - config.getFields() - .stream() - .peek(moduleFieldDTO -> { - BusinessModuleField businessModuleFieldEnum = businessModuleFieldMap.get(moduleFieldDTO.getInternalKey()); - if (businessModuleFieldEnum != null) { - // 设置特殊的业务字段 key - moduleFieldDTO.setBusinessKey(businessModuleFieldEnum.getBusinessKey()); - moduleFieldDTO.setDisabledProps(businessModuleFieldEnum.getDisabledProps()); - } - }) - .toList() + // 设置业务字段参数 + businessModuleFormConfig.setFields(config.getFields().stream() + .peek(this::setFieldBusinessParam) + .collect(Collectors.toList()) ); return businessModuleFormConfig; } @@ -424,6 +412,25 @@ public List resolveSourceNames(String type, List nameList) { return extModuleFieldMapper.resolveIdsByName(TYPE_SOURCE_MAP.get(type), nameList); } + /** + * 设置自定义字段业务参数 + * @param field 自定义字段 + */ + public void setFieldBusinessParam(BaseField field) { + // 获取特殊的业务字段 + Map businessModuleFieldMap = Arrays.stream(BusinessModuleField.values()). + collect(Collectors.toMap(BusinessModuleField::getKey, Function.identity())); + if (field instanceof SubField subField) { + subField.getSubFields().forEach(this::setFieldBusinessParam); + } + BusinessModuleField businessEnum = businessModuleFieldMap.get(field.getInternalKey()); + if (businessEnum != null) { + // 设置特殊的业务字段 key + field.setBusinessKey(businessEnum.getBusinessKey()); + field.setDisabledProps(businessEnum.getDisabledProps()); + } + } + /** * OptionProp转OptionDTO * @@ -547,6 +554,11 @@ public void initFormFields(Map formKeyMap) { }); initField.put(CONTROL_RULES_KEY, controlRules); } + if (initField.containsKey(SUB_FIELDS)) { + List subFields = JSON.parseArray(JSON.toJSONString(initField.get(SUB_FIELDS)), BaseField.class); + subFields.forEach(subField -> subField.setId(IDGenerator.nextStr())); + initField.put(SUB_FIELDS, subFields); + } ModuleFieldBlob fieldBlob = new ModuleFieldBlob(); fieldBlob.setId(field.getId()); fieldBlob.setProp(JSON.toJSONString(initField)); @@ -556,6 +568,7 @@ public void initFormFields(Map formKeyMap) { moduleFieldMapper.batchInsert(fields); moduleFieldBlobMapper.batchInsert(fieldBlobs); } catch (Exception e) { + LogUtils.error("表单字段初始化失败: {}", e.getMessage()); throw new GenericException("表单字段初始化失败", e); } } diff --git a/backend/crm/src/main/resources/form/field.json b/backend/crm/src/main/resources/form/field.json index 0a70e2089..41ee09f40 100644 --- a/backend/crm/src/main/resources/form/field.json +++ b/backend/crm/src/main/resources/form/field.json @@ -949,7 +949,8 @@ "rules": [ {"key": "required"}, {"key": "unique"} - ] + ], + "mobile": true }, { "name": "状态", @@ -966,7 +967,8 @@ ], "rules": [ {"key": "required"} - ] + ], + "mobile": true }, { "name": "产品信息", @@ -980,7 +982,7 @@ "fixedColumn": 1, "subFields": [ { - "name": "选择产品", + "name": "产品名称", "internalKey": "priceProduct", "type": "DATA_SOURCE", "dataSourceType": "PRODUCT", @@ -991,8 +993,7 @@ "rules": [ {"key": "required"} ], - "mobile": true, - "disabledProps": ["dataSourceType", "rules.required"] + "mobile": true }, { "name": "产品SKU", @@ -1014,7 +1015,11 @@ "numberFormat": "currency", "decimalPlaces": true, "precision": 2, - "showThousandsSeparator": true + "showThousandsSeparator": true, + "mobile": true, + "rules": [ + {"key": "required"} + ] }, { "name": "税点", @@ -1040,7 +1045,7 @@ { "name": "备注", "internalKey": "priceRemark", - "type": "TEXT_AREA", + "type": "TEXTAREA", "showLabel": true, "readable": true, "editable": true, @@ -1096,9 +1101,6 @@ "readable": true, "editable": true, "fieldWidth": 1, - "rules": [ - {"key": "required"} - ], "mobile": true }, { @@ -1163,10 +1165,7 @@ "editable": true, "fieldWidth": 1, "mobile": true, - "rules": [ - {"key": "required"} - ], - "disabledProps": ["dataSourceType", "rules.required"] + "disabledProps": ["dataSourceType"] }, { "name": "产品定价", @@ -1208,13 +1207,69 @@ "showLabel": true, "readable": true, "editable": true, - "fieldWidth": 1, - "numberFormat": "number", - "formula": "(quotationProductAmount - quotationDiscount) * (1 + quotationTax)" + "fieldWidth": 1 } ] } ], + "contractPaymentPlan": [ + { + "name": "合同", + "internalKey": "contractPaymentPlanContract", + "type": "DATA_SOURCE", + "dataSourceType": "CONTRACT", + "showLabel": true, + "readable": true, + "editable": true, + "fieldWidth": 1, + "rules": [ + {"key": "required"} + ], + "mobile": true + }, + { + "name": "负责人", + "internalKey": "contractPaymentPlanOwner", + "type": "MEMBER", + "hasCurrentUser": true, + "showLabel": true, + "readable": true, + "editable": true, + "fieldWidth": 1, + "rules": [ + {"key": "required"} + ] + }, + { + "name": "计划回款金额", + "internalKey": "contractPaymentPlanPlanAmount", + "type": "INPUT_NUMBER", + "showLabel": true, + "readable": true, + "editable": true, + "fieldWidth": 1, + "numberFormat": "number", + "showThousandsSeparator": true, + "rules": [ + {"key": "required"} + ], + "mobile": true + }, + { + "name": "计划回款时间", + "internalKey": "contractPaymentPlanPlanEndTime", + "type": "DATE_TIME", + "dateType": "date", + "showLabel": true, + "readable": true, + "editable": true, + "fieldWidth": 1, + "rules": [ + {"key": "required"} + ], + "mobile": true + } + ], "contract": [ { "name": "基本信息", diff --git a/backend/crm/src/main/resources/i18n/cordys-crm_en_US.properties b/backend/crm/src/main/resources/i18n/cordys-crm_en_US.properties index e9f6c36d3..e7c8d77e7 100644 --- a/backend/crm/src/main/resources/i18n/cordys-crm_en_US.properties +++ b/backend/crm/src/main/resources/i18n/cordys-crm_en_US.properties @@ -166,6 +166,7 @@ permission.opportunity_management.opportunity.name=Opportunity permission.opportunity_management.opportunity_quotation.name=Quotation permission.product_management.name=Product permission.product_management.product.name=Product +permission.product_management.price.name=Price permission.dashboard_management.name=Dashboard permission.dashboard.name=Dashboard permission.personal_info.name=Personal Info diff --git a/backend/crm/src/main/resources/i18n/cordys-crm_zh_CN.properties b/backend/crm/src/main/resources/i18n/cordys-crm_zh_CN.properties index fc82b1cf3..7e53a4149 100644 --- a/backend/crm/src/main/resources/i18n/cordys-crm_zh_CN.properties +++ b/backend/crm/src/main/resources/i18n/cordys-crm_zh_CN.properties @@ -166,6 +166,7 @@ permission.opportunity_management.opportunity.name=商机 permission.opportunity_management.opportunity_quotation.name=报价单 permission.product_management.name=产品管理 permission.product_management.product.name=产品 +permission.product_management.price.name=价格表 permission.dashboard_management.name=仪表板 permission.dashboard.name=仪表板 permission.personal_info.name=个人信息 diff --git a/backend/crm/src/main/resources/migration/1.4.0/dml/V1.4.0_2_2__permission.sql b/backend/crm/src/main/resources/migration/1.4.0/dml/V1.4.0_2_2__permission.sql index b2d132d91..dc3f0c642 100644 --- a/backend/crm/src/main/resources/migration/1.4.0/dml/V1.4.0_2_2__permission.sql +++ b/backend/crm/src/main/resources/migration/1.4.0/dml/V1.4.0_2_2__permission.sql @@ -8,5 +8,12 @@ INSERT INTO sys_role_permission (id, role_id, permission_id) VALUES (UUID_SHORT( INSERT INTO sys_role_permission (id, role_id, permission_id) VALUES (UUID_SHORT(), 'org_admin', 'OPPORTUNITY_QUOTATION:EXPORT'); INSERT INTO sys_role_permission (id, role_id, permission_id) VALUES (UUID_SHORT(), 'org_admin', 'OPPORTUNITY_QUOTATION:APPROVAL'); +-- init price permissions +INSERT INTO sys_role_permission (id, role_id, permission_id) VALUES (UUID_SHORT(), 'org_admin', 'PRICE:READ'); +INSERT INTO sys_role_permission (id, role_id, permission_id) VALUES (UUID_SHORT(), 'org_admin', 'PRICE:ADD'); +INSERT INTO sys_role_permission (id, role_id, permission_id) VALUES (UUID_SHORT(), 'org_admin', 'PRICE:UPDATE'); +INSERT INTO sys_role_permission (id, role_id, permission_id) VALUES (UUID_SHORT(), 'org_admin', 'PRICE:DELETE'); +INSERT INTO sys_role_permission (id, role_id, permission_id) VALUES (UUID_SHORT(), 'org_admin', 'PRICE:IMPORT'); +INSERT INTO sys_role_permission (id, role_id, permission_id) VALUES (UUID_SHORT(), 'org_admin', 'PRICE:EXPORT'); SET SESSION innodb_lock_wait_timeout = DEFAULT; \ No newline at end of file diff --git a/backend/crm/src/main/resources/permission.json b/backend/crm/src/main/resources/permission.json index 5ce6458a7..e12a8eebe 100644 --- a/backend/crm/src/main/resources/permission.json +++ b/backend/crm/src/main/resources/permission.json @@ -361,6 +361,30 @@ "id": "PRODUCT_MANAGEMENT:IMPORT" } ] + }, + { + "id": "PRODUCT_MANAGEMENT_PRICE", + "name": "permission.product_management.price.name", + "permissions": [ + { + "id": "PRICE:READ" + }, + { + "id": "PRICE:ADD" + }, + { + "id": "PRICE:UPDATE" + }, + { + "id": "PRICE:DELETE" + }, + { + "id": "PRICE:IMPORT" + }, + { + "id": "PRICE:EXPORT" + } + ] } ] },