• getContractById 原 executeBefore=true:模板在方法执行前解析,
    #receivable/#receivablePlan 等 LogRecordContext 变量此时尚未绑定(方法
    内部末尾才 putVariable),取值为 null 抛 SpelEvaluationException
    EL1007E(2026-09-21 23:50:39 实抓:LogRecordInterceptor:75 log record
    parse before function exception)。函数只用于日志展示合同名、无前置对比
    需求,改后置相取值(与 getAdminUserById 同相,其 #clue 上下文变量后置相
    解析正常)。
    同修 CRM_RECEIVABLE_UPDATE_SUCCESS 模板变量名:updateReceivable 绑定的
    是 oldReceivable 而非 receivable,原写法后置相仍会空引用。
    dadiyang authored
     
    Browse Dir »

  • 原删除链路只校验产品存在,不校验引用即软删:被引用产品删除后,
    引用方明细(product_id)成悬空引用,订单/合同明细数据不一致
    (2026-09-21 23:50:36 实抓:被销售单明细引用产品 DELETE 仍 code=0 放行,
    载体 CRM-07/ERP-01 翻用例后预期拒绝)。
    - CRM:crm_contract_product / crm_business_product 存在未删引用即拒绝,
      新增错误码 1_020_008_003/004。
    - ERP:采购订单/入库/退货 + 销售订单/出库/退货 共 6 张业务明细表存在
      未删引用即拒绝(库存表为派生数据不纳入),新增错误码 1_030_500_002~007。
    引用计数走 @TableLogic 软删过滤,已删明细不阻断。
    dadiyang authored
     
    Browse Dir »
  • 1) CrmContractSaveReqVO.totalPrice 加 @DecimalMin(0):负金额原可直接建单
       (2026-09-21 23:50:39 实抓:totalPrice=-100 code=0 放行,载体 CRM-24)。
    2) calculateTotalPrice 无产品明细时不再重算覆盖:原逻辑恒以
       明细合计-折扣 覆盖 totalPrice,无明细合同(服务类/总额类交易)手工
       填写的合同金额被覆写为 0(同实证:10000000.01 落库回显 0)。
       有明细路径行为不变(明细合计-折扣)。
       discountPercent 本身 @NotNull,无明细早返回不引入新空值路径。
    dadiyang authored
     
    Browse Dir »

  • 公海自动掉落定时任务(crmCustomerAutoPutPoolJob,ForkJoinPool 线程无登录
    用户)→ putCustomerPool → contactService.updateOwnerUserIdByCustomerId
    (@CrmPermission)→ CrmPermissionAspect.validatePermission →
    isCrmAdmin() → hasAnyRoles(null) → @Cacheable(user_role_ids, key=#userId)
    取值为 null,Spring 6 抛 IllegalArgumentException: Null key,事务回滚,
    客户永远掉不进公海(job 日志恒"掉入公海客户 0 个",2026-09-21 23:50:36
    实抓全链路堆栈:CrmCustomerServiceImpl:459/476 → CrmPermissionAspect:70
    → CrmPermissionUtils:36 → PermissionServiceImpl:261)。
    数据权限是按登录用户的访问控制:/admin-api 外部请求必有登录用户,
    登录用户为 null 只可能是系统内部可信调用,切面入口直接放行;
    用户发起路径行为不变。
    dadiyang authored
     
    Browse Dir »
  • MPJLambdaWrapperX 会给列拼表别名前缀 t.,但 BaseMapper.selectOne 生成的
    FROM 不带别名,单表查询直接 SQL 语法错误(2026-09-21 23:50:39 实抓堆栈:
    CrmReceivablePlanMapper.selectMaxPeriodByContractId:27 → createReceivablePlan:65
    → 500 系统异常)。同文件 selectCount+MPJ 走 MPJ 自带 FROM 别名不受影响,
    仅 selectOne 路径改 LambdaQueryWrapperX。
    dadiyang authored
     
    Browse Dir »

  • - 新增客户公海、销售漏斗、产品销售、合同汇总等统计分析
    - 新增业绩目标设置与业绩达成统计
    - 新增客户负责人变更记录能力,并用于公海客户分析
    - 完善销售漏斗阶段统计、商机转化率和明细筛选
    - 补充产品分类、时间范围、空金额等统计边界处理
    - 新增相关前端页面、API 与数据库菜单配置
    YunaiV authored
     
    Browse Dir »

  • - 新增客户公海、销售漏斗、产品销售、合同汇总等统计分析
    - 新增业绩目标设置与业绩达成统计
    - 新增客户负责人变更记录能力,并用于公海客户分析
    - 完善销售漏斗阶段统计、商机转化率和明细筛选
    - 补充产品分类、时间范围、空金额等统计边界处理
    - 新增相关前端页面、API 与数据库菜单配置
    YunaiV authored
     
    Browse Dir »

  • 升级 Spring Boot 3.5.15、Netty、Redisson、Tika、Hutool、jsch、AWS SDK、Alipay、weixin-java 等依赖。
    
    - easy-trans 迁移到 org.dromara 并同步 Java import
    - 新增 system 侧 WxJava 配置类,绕过 httpclient4 provided 依赖问题
    - 将 WxJava http-client-type 切换为 HttpComponents
    - 移除显式 httpclient4 依赖
    YunaiV authored
     
    Browse Dir »