Commit Graph
10977 Commits
Author SHA1 Message Date
芋道源码 a486d4fa0b Merge pull request #1226 from dadiyang/fix/product-spu-app-page-sort-nullsafe
[BUG] 商品:C 端商品列表只传 sortField 不传 sortAsc 恒 500——Boolean 对 null 拆箱
2026-09-26 11:06:58 +08:00
芋道源码 56a608a88f Merge pull request #1227 from dadiyang/fix/promotion-combination-app-page-orderby
[BUG] 拼团:C 端活动列表无排序,新上架活动被挤到后页——app 面 selectPage 缺 orderBy
2026-09-26 11:06:19 +08:00
芋道源码 330fa3a297 Merge pull request #1234 from dadiyang/fix/product-sku-empty-properties
[ENHANCE]
2026-09-26 10:42:05 +08:00
芋道源码 9b5241dd7f Merge pull request #1241 from dadiyang/fix/crm-contract-total-price-validation
[BUG] CRM:合同金额边界缺口——无明细合同的填写金额被重算覆盖为 0;合同金额字段无负值校验
2026-09-26 10:41:11 +08:00
芋道源码 e6a3a14f47 Merge pull request #1217 from dadiyang/fix/hrm-import-template-empty-dict-skip
[FIX] Excel 框架:导入模板下拉对空字典/空选项源整列跳过+AreaConvert 补写方向(A43,惠及所有模板)
2026-09-26 10:40:02 +08:00
芋道源码 052c8f5dda Merge pull request #1221 from dadiyang/fix/crm-permission-aspect-system-context
[FIX] CRM:数据权限切面对无登录用户的系统调用放行,修公海自动掉落 Null key 恒失败(A34)
2026-09-26 10:37:50 +08:00
芋道源码 1572855ba2 Merge pull request #1229 from dadiyang/fix/product-category-parent-self
[BUG] 商品分类:编辑一级类目把"上级分类"选成自己,保存成功且该类目从分类树消失
2026-09-26 10:36:54 +08:00
芋道源码 1afc774be4 Merge pull request #1211 from dadiyang/fix/hrm-convert-employee-channel-field-exempt
[BUG] HRM:管理端「候选人转员工」恒失败——服务端回填 channelId 与 createEmployee 隐藏字段校验互斥(1050100034)
2026-09-26 10:34:45 +08:00
芋道源码 256280e8ba Merge pull request #1242 from dadiyang/fix/product-delete-reference-check
[BUG] CRM/ERP:产品删除无引用校验——被业务单据引用的产品可被直接软删,留下悬空引用
2026-09-26 10:19:33 +08:00
芋道源码 1acee0630c Merge pull request #1243 from dadiyang/fix/erp-purchase-in-count-audit-status
[BUG] ERP:采购入库单反审批后订单入库进度不回退——inCount 汇总不按审核状态过滤
2026-09-26 10:12:14 +08:00
芋道源码 678e747575 Merge pull request #1245 from dadiyang/fix/bpm-dynamic-form-required
[BUG] BPM:动态表单必填字段可绕过——OA 请假必填项全留空仍可发起成功,脏单审批时 500
2026-09-26 10:07:23 +08:00
芋道源码 9ed3c5444c Merge pull request #1247 from dadiyang/fix/crm-receivable-plan-logrecord-spel
CRM:修改回款(改金额)保存成功,但操作日志没有这次修改的记录
2026-09-26 10:05:10 +08:00
芋道源码 1f18b1009a Merge pull request #1233 from dadiyang/fix/erp-purchase-in-count-positive
[ENHANCE]
2026-09-26 09:59:03 +08:00
芋道源码 b09de98c93 Merge pull request #1223 from dadiyang/fix/im-getself-enableasync-proxytargetclass
[FIX] 框架:@EnableAsync 显式 proxyTargetClass=true,修 IM 写操作 getSelf() NoSuchBean 全量 500(ISSUE-001)
2026-09-26 09:56:55 +08:00
芋道源码 3870f2fcbf Merge pull request #1235 from dadiyang/fix/product-sku-price-min
[ENHANCE] 商城:商品 SKU 五个金额字段补接口层下限校验(>=0)
2026-09-26 09:53:40 +08:00
芋道源码 9d2e98af8e Merge pull request #1219 from dadiyang/fix/crm-receivable-plan-max-period-wrapper
[FIX] CRM:回款计划创建查最大期次改单表查询,修 Unknown column 't.contract_id'(A6)
2026-09-26 09:51:45 +08:00
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
YunaiV 7cab3a7241 SQL:同步最新 2026-09-20 13:33:42 +08:00
YunaiV ae122450c2 feat(oa):README 2026-09-19 11:08:00 +08:00
YunaiV 5871789dd9 feat(oa):README 2026-09-19 10:59:09 +08:00
YunaiV 58a1c1d5fd feat(oa):README 2026-09-19 10:59:00 +08:00
YunaiV 09cf3017e1 feat(oa): add office automation 2026-09-19 10:11:41 +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
YunaiV 8e43004cf6 README:增加 PMS 说明(期待 AGI ing) 2026-09-04 08:48:54 +08:00
YunaiV 9655ee72c6 feat:同步最新 sql 2026-09-04 08:45:41 +08:00
YunaiV 31aded61d8 feat(pms): add project and knowledge management 2026-09-04 00:37:08 +08:00
YunaiV 6aa235e493 (〃'▽'〃)_v2026_08_发布:新增 HRM 人力资源管理系统、FMS 财务管理系统,支持独立手机端操作 2026-08-30 20:37:22 +08:00
YunaiV 6188a22c0d feat:增强对 JDK8 的兼容性 2026-08-30 20:23:32 +08:00
YunaiV bebbad3c46 feat:同步最新 sql 2026-08-30 18:00:35 +08:00
YunaiV 922c8b834e fix(bpm): 使用流程变量发起人 ID计算部门负责人
- 新增 FlowableUtils 发起人 ID 变量读取方法
- 发起人部门负责人策略优先使用 PROCESS_START_USER_ID
- 补充流程变量优先场景单测
2026-08-30 17:23:01 +08:00
YunaiV 605e11bf5f fix(pay): 修复微信支付证书临时文件失效问题
使用 weixin-java-pay 的内存证书配置,替代临时文件路径,避免系统清理临时文件后导致微信支付不可用;同时使用 Hutool 的 UTF-8 字节转换方法,保持 JDK8 兼容性。
2026-08-30 16:56:54 +08:00
YunaiV af361b4359 Merge remote-tracking branch 'origin/master-jdk17' into master-jdk17 2026-08-30 15:57:01 +08:00
YunaiV 856953352f fix(iot): 修正设备消息发送权限标识
- 将 iot:device:message-end 改为 iot:device:message-send
- 与各数据库菜单 SQL 保持一致
2026-08-30 15:56:53 +08:00
YunaiV 02482a3a88 fix:清理过期 URL 2026-08-30 15:27:23 +08:00