dadiyang
|
9573a6156a
|
fix(crm):回款/回款计划操作日志合同名函数改后置相取值,修 SpEL EL1007E(A29)
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,原写法后置相仍会空引用。
|
2026-09-25 09:09:17 +08:00 |
|
dadiyang
|
7c29bf220b
|
fix(bpm):动态表单必填字段后端补校验,缺必填不再建成脏实例
接口发起动态表单(formType=10 流程表单)流程时,必填字段未填也能
code=0 发起成功(前后端均漏校验,A51),建成变量缺失的脏实例。
在管理端 API 发起入口(VO 路径)补动态表单必填校验:按表单字段
定义(兼容 field/key 两种字段标识、数组/对象两种 required 标记)
逐一检查变量,缺失即抛新增业务错误 1_009_004_009。
仅校验 VO 路径:内部业务链路(DTO 路径,如 OA 请假只传部分变量)
不经过本校验,避免误伤。
|
2026-09-24 21:47:40 +08:00 |
|
dadiyang
|
e85fcd8bd7
|
fix(erp):A39修正——inCount展示只统计已审核,超订单数量校验单独统计全部入库单(含未审核)
原A39修复把 selectListByOrderId 过滤成只查已审核,导致同方法内的超订单数量校验
(inCount>count 抛错)也只算已审核——未审核的超额入库单不再触发拦截,ERP-22 复验时
超额入库被误放行(回归)。现拆成两条口径:inCount 展示用已审核(反审核自然回退),
超量校验用新增 selectListAllByOrderId 查全部入库单,二者互不影响。
|
2026-09-24 21:47:38 +08:00 |
|
dadiyang
|
1349796945
|
fix(erp):采购订单入库进度 inCount 只统计已审核入库单,且状态变更(审核/反审核)后触发重算——反审核后 inCount 自然回退(A39)
|
2026-09-24 21:47:38 +08:00 |
|
dadiyang
|
9b991488c2
|
fix(crm,erp):产品删除前校验业务单据引用,被引用拒绝删除(A35)
原删除链路只校验产品存在,不校验引用即软删:被引用产品删除后,
引用方明细(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 软删过滤,已删明细不阻断。
|
2026-09-24 21:47:37 +08:00 |
|
dadiyang
|
bc349d2e8b
|
fix(crm):合同金额负值校验+无明细合同金额按传入值落库(A24)
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,无明细早返回不引入新空值路径。
|
2026-09-24 21:47:36 +08:00 |
|
dadiyang
|
a83a9e0429
|
fix(product):多规格商品空规格列表保存 500 改为明确参数拒绝
新建商品开多规格开关(specType=true)但不传规格列表时,validateSkuList
收集到的 propertyIds 为空集合,getPropertyList 走 selectByIds 生成
IN() 非法 SQL 直接 500(A33)。
补空集合短路:propertyIds 为空时抛新增业务错误 SKU_PROPERTIES_EMPTY
(1_008_006_005) 明确拒绝,不再崩到 SQL 层。
|
2026-09-24 21:27:51 +08:00 |
|
dadiyang
|
3cde11921b
|
fix(erp):采购入库数量补 >0 校验,0/负数量不再落库;审核链路 0 量防护
采购入库单数量填 0 或负数也能保存(count 仅 @NotNull、无 >0 约束),
数量为 0 的入库单审核时 updateCountIncrement 生成空 SET 的 UPDATE,
MyBatis-Plus 直接抛异常 500(A23)。
两层修复:
1. 建单/改单入口:items 补 @Valid 级联 + count 补
@DecimalMin(0, inclusive=false),0/负数量建单返回参数校验错误;
2. 审核链路:updateCountIncrement 对 count=0 直接跳过(无库存增量),
历史已落库的 0 数量单审核不再 500。
|
2026-09-24 21:27:50 +08:00 |
|
dadiyang
|
bf15494975
|
fix(product):SKU 价格字段补 @Min(0) 后端防线,拒绝负价格写入
商品/SKU 允许填负价格并保存成功(A19):ProductSkuSaveReqVO 的
price/marketPrice/costPrice/firstBrokeragePrice/secondBrokeragePrice
均无下限校验,管理端前端 el-input-number min=0 恰好掩盖后端缺口,
绕过前端(直接接口/H5/第三方)即可写入负价。
给五个价格字段补 @Min(0),后端校验层统一拒绝非正价格(SPU 创建/
更新经 skus 的 @Valid 级联一并生效)。
|
2026-09-24 21:27:50 +08:00 |
|
dadiyang
|
28c266f922
|
fix(product):类目父级设置成自身(循环层级)明确拒绝
更新类目时把 parentId 设成分类自身的 id 可保存成功(一级类目自身
通过'父分类不能是二级分类'校验后放行),形成循环层级(A53);
创建路径父级必须是已存在分类,天然挡死。
updateCategory 补环检测:parentId==id 时抛新增业务错误
CATEGORY_PARENT_IS_SELF (1_008_001_006)。
|
2026-09-24 18:16:12 +08:00 |
|
dadiyang
|
68af46ddc7
|
fix(product):C 端商品分页缺 sortAsc 参数 NPE 500 改空安全
GET /app-api/product/spu/page 只带 sortField、缺 sortAsc(合法但参数
不完整)时,getSortAsc()(Boolean)在 orderBy/三目拆箱处 null 直接
NPE 500(A52),旧版 App/第三方/爬虫都会踩空。
排序逻辑处统一取空安全默认(缺省按升序),三个排序分支共用,
缺参/显式 null 均不再崩。
|
2026-09-24 08:35:00 +08:00 |
|
dadiyang
|
8c0a19613e
|
fix(crm):数据权限切面对无登录用户的系统调用放行,修公海自动掉落 Null key(A34)
公海自动掉落定时任务(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 只可能是系统内部可信调用,切面入口直接放行;
用户发起路径行为不变。
|
2026-09-23 21:26:48 +08:00 |
|
dadiyang
|
85a63467dd
|
fix(crm):回款计划创建查最大期次改单表查询,修 Unknown column 't.contract_id'(A6)
MPJLambdaWrapperX 会给列拼表别名前缀 t.,但 BaseMapper.selectOne 生成的
FROM 不带别名,单表查询直接 SQL 语法错误(2026-09-21 23:50:39 实抓堆栈:
CrmReceivablePlanMapper.selectMaxPeriodByContractId:27 → createReceivablePlan:65
→ 500 系统异常)。同文件 selectCount+MPJ 走 MPJ 自带 FROM 别名不受影响,
仅 selectOne 路径改 LambdaQueryWrapperX。
|
2026-09-23 20:05:28 +08:00 |
|
dadiyang
|
002172af5f
|
fix(excel):A43第二处根因——AreaConvert 补 convertToExcelData(写方向)
导入模板下载恒500有两处独立根因:(1)空字典下拉拼出 $F$1:$F$0 非法区间致
FormulaParseException(已由 SelectSheetWriteHandler 跳过空字典修复);(2)修复(1)后暴露
第二处——bankAreaId 列用 AreaConvert,但 AreaConvert 只实现了 convertToJavaData(读),
未实现 convertToExcelData(写),生成模板写示例数据时抛 UnsupportedOperationException。
现补 convertToExcelData:地区编号经 AreaUtils.format(id,"/") 转全路径,与读方向
parseArea 的 "/" 分隔一致可往返。
|
2026-09-23 20:03:55 +08:00 |
|
dadiyang
|
fa99e9658b
|
fix(excel):导入模板下拉框对空字典/空选项源整列跳过数据验证——不再拼出 $F$1:$F$0 非法区间致 POI FormulaParseException 500(A43,框架层单点修复惠及所有模板)
|
2026-09-23 20:03:55 +08:00 |
|
dadiyang
|
8a96d60f60
|
fix(hrm):候选人转员工(convert)携带 candidateId 时豁免 channelId 的隐藏字段校验——服务端回填的招聘渠道不再撞「员工字段未显示」互斥(1050100034)(A41)
|
2026-09-23 19:36:33 +08:00 |
|
dadiyang
|
8040cd1510
|
fix(promotion):C端拼团列表按 id 倒序——app 面 selectPage(PageParam,status) 缺 orderBy,MyBatis-Plus 按主键升序致最旧在前,新上架活动被挤后页 C 端首页不可见;对齐 admin 面 orderByDesc(id)(A56)
|
2026-09-23 16:12:52 +08:00 |
|
dadiyang
|
016e3df57a
|
fix(job):@EnableAsync 显式 proxyTargetClass=true
仅含 @Async 而无 CGLIB 触发器(如 @Transactional)的 bean(如 ImWebSocketServiceImpl)
被 JDK 动态代理后,getSelf()=SpringUtil.getBean(getClass()) 按实现类取 bean 必抛
NoSuchBeanDefinitionException,致 IM 模块全部写操作事务内通知发送回滚整体 500。
与 @EnableTransactionManagement(proxyTargetClass = true) 口径对齐根治。
验证:修复后 IM 域回归 7 例两轮全绿(jobs 1422-1425/1427-1431);
诊断实证 proxyClass=jdk.proxy2.$Proxy926 仅接口型。
|
2026-09-14 01:47:58 +08:00 |
|