Compare commits

573 Commits

Author SHA1 Message Date
002ac3f3ab refactor(crm): 统一配卷查询接口并增加筛选功能
- 将所有配卷查询接口统一为POST + Body BO方式
- 为配卷查询添加钢卷号、材料类型、质量状态、发货状态筛选条件
- 在合同详情页面为生产成果和发货配卷添加筛选表单
- 在订单页面为发货配卷添加筛选功能
- 在销售员页面为生产成果和计划发货添加筛选功能
- 更新异议管理页面的配卷查询参数结构
- 增加订单ID参数用于合同ID相关查询的兼容性处理
2026-07-09 19:01:36 +08:00
朱昊天
2d44ebaaed Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-07-09 17:46:47 +08:00
朱昊天
ccbbcb79bc git合并后丢失已排产拖拽修复 2026-07-09 17:46:00 +08:00
王文昊
9b1b9511cd style(wms/aps/requirement): 拆分需求列表项的信息行
将原单行的生产日期、客户和业务员信息拆分为两行展示,优化页面布局可读性
2026-07-09 17:43:23 +08:00
jhd
e79a1efb78 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-09 17:41:31 +08:00
朱昊天
f42798cf2c Merge remote-tracking branch 'origin/0.8.X' into 0.8.X
# Conflicts:
#	klp-ui/src/views/wms/post/aps/schedule.vue
2026-07-09 17:40:15 +08:00
jhd
d49017d33c Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-09 17:39:33 +08:00
jhd
41ca57896b feat(cost): 添加折线图统计功能
- 在综合成本页面添加折线图统计按钮
- 实现折线图弹窗组件和相关图表展示功能
- 集成 echarts 库进行数据可视化
- 添加图表渲染和销毁逻辑
- 实现按列数据生成对应的折线图选项
- 添加全屏图表样式和响应式布局支持
- 扩展表格数据显示逻辑以支持图表数据提取
2026-07-09 17:38:03 +08:00
王文昊
60168cc0da Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-09 17:15:27 +08:00
王文昊
e7d96e2c3d feat(wms): 新增APS排产相关页面及产需单跳转排产功能
1. 新增/aps/requirement和/aps/schedule路由页面
2. 实现产需单列表跳转排产单功能
3. 为排产页面添加参数接收与自动查询逻辑
4. 新增弹窗组件间传递APS页面参数的能力
5. 优化产需单列表UI布局与绑定状态展示
2026-07-09 17:15:24 +08:00
朱昊天
a0c7da8fe0 排产模块优化 / 排产单页面优化,排产模块优化 / 订单跟踪页面优化 2026-07-09 17:13:46 +08:00
4b28eb7d4b feat(perf): 查询月度薪资记录时关联员工信息
- 引入 WmsEmployeeInfo 和 WmsEmployeeInfoMapper 依赖
- 在 PerfSalaryVo 中添加 wmsEmployeeInfo 字段
- 实现 attachEmployeeInfo 方法批量填充员工信息
- 避免 N+1 查询问题,通过员工ID批量获取员工信息
- 更新查询方法以返回包含员工信息的完整数据
- 在 pom.xml 中添加 klp-wms 模块依赖
2026-07-09 16:41:30 +08:00
cd82231ebb Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-07-09 15:02:54 +08:00
950d9cf614 feat(perf): 查询岗位绩效考核模板时返回维度明细数据
- 添加 PerfTemplateDimensionVo 和 PerfTemplateDimension 实体类引用
- 注入 PerfTemplateDimensionMapper 数据访问层实例
- 修改 queryById 方法查询模板详情时关联查询维度明细
- 修改 queryPageList 方法分页查询时批量附加维度明细数据
- 修改 queryList 方法列表查询时批量附加维度明细数据
- 新增 attachDimensionList 私有方法实现批量填充维度明细逻辑
- 在 PerfPositionTemplateVo 中新增 dimensionList 字段存储维度明细列表
- 更新方法注释明确标识查询操作包含维度明细信息
2026-07-09 15:00:01 +08:00
王文昊
2150fa1fda Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-09 14:41:43 +08:00
王文昊
c1a9d36199 refactor(wms,mes): 优化流程节点配置与流程图
1. 移除生产流程中按工序绑定钢卷节点,调整流程走向
2. 重构检验流程节点与流程图,拆分检验类型与审批流程
3. 统一调整样式类定义与节点样式
2026-07-09 14:41:39 +08:00
39dae0b357 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-07-09 14:28:34 +08:00
20f4b24546 refactor(perf): 将员工绩效薪资信息整合到WMS员工模块中
- 删除独立的员工绩效薪资信息相关文件(接口、实体类、业务对象、控制器、映射器)
- 在WMS员工信息实体中新增底薪、岗位绩效基数和岗位系数字段
- 在WMS员工信息业务对象中添加对应的薪资相关属性
- 更新数据库映射文件,增加薪资字段的映射关系
- 修改WMS员工服务实现,添加对新增薪资字段的查询条件支持
- 在WMS员工信息视图对象中增加薪资相关字段并配置Excel导出属性
2026-07-09 14:28:23 +08:00
朱昊天
2cd141262b Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-07-09 14:18:04 +08:00
朱昊天
3a8d2cfa9a 首页普适优化 2026-07-09 14:17:20 +08:00
jhd
25b34ec82e Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-09 14:16:39 +08:00
王文昊
8a028d9896 feat(wms/flow): 新增多个业务流程并优化排产流程配置
1.  新增批量调拨、发货、检验、质量评审、收货5个业务流程的菜单与流程图配置
2.  优化排产流程的节点名称和逻辑描述,调整节点ID与对应页面路径
3.  移除冗余的样式定义,统一流程图的样式规范
2026-07-09 14:16:18 +08:00
jhd
2c5bf09053 refactor(wms): 重构工艺流程页面为表格展示模式
- 将左侧工艺列表改为表格展示,新增工序方案功能
- 实现工序步骤拖拽排序和编辑功能
- 添加新建和编辑工序方案弹窗界面
- 集成用户选择和工序步骤管理功能
- 优化页面布局和交互体验
- 更新数据展示格式和空状态处理
2026-07-09 14:16:08 +08:00
137a13606b refactor(perf): 重构车间考核参数配置实体类结构
- 移除 JsonFormat 注解依赖
- 将 createdAt 和 updatedAt 字段替换为 createTime、createBy、updateTime、updateBy 字段
- 添加 delFlag 删除标志字段并配置 TableLogic 注解
- 更新备注字段的注释说明
- 修改查询条件构建逻辑以适配新字段结构
- 更新数据映射配置以匹配数据库表结构变化
2026-07-09 14:09:18 +08:00
4e916ccbdc refactor(WmsFurnaceBo): 移除批操作ID字段校验注解
- 移除了furnaceIds字段上的@NotNull注解
- 删除了EditGroup校验组相关配置
- 简化了批量操作ID参数的验证逻辑
2026-07-09 14:03:40 +08:00
310a22560d feat(perf): 添加量化指标字段支持
- 在 PerfAppraisalDetail 实体类中新增 quantitativeIndicator 字段
- 在 PerfAppraisalDetailBo 中添加对应的量化指标属性
- 更新数据库映射文件,添加量化指标字段映射配置
- 在查询条件构建器中增加量化指标的筛选逻辑
- 在 PerfAppraisalDetailVo 中添加量化指标并配置 Excel 导出映射
2026-07-09 14:00:48 +08:00
451c7afcfd feat(performance): 新增分组绩效统计功能
- 在性能监控页面添加菜单分类总览模块,显示各模块操作量对比
- 实现菜单分组柱状图可视化,支持点击筛选功能
- 添加分类模块明细折叠面板,展示具体模块统计数据
- 集成后端菜单分组绩效接口,支持按一级菜单路径过滤
- 添加当前分类筛选标签显示,增强用户体验
- 优化图表渲染逻辑,增加空数据情况下的图表清理
- 完善响应式布局,适配不同屏幕尺寸调整
2026-07-09 11:44:04 +08:00
砂糖
49bb8e116f feat(wms/menu): 添加异常钢卷导出功能并优化菜单导出功能
1. 新增单行/多行异常钢卷导出按钮,带权限控制
2. 优化菜单导出Excel,新增路由地址和完整路由地址列
2026-07-08 17:16:58 +08:00
砂糖
d0a85c6d65 feat(wms/coil/stock, wms/post/aps): 添加快捷筛选和表格内状态编辑功能
1. 为卷材库存页面添加快捷品质筛选按钮,支持全选、AB/CD/O/CDO模式快速筛选
2. 为排产页面添加表格内快捷修改排产状态功能,支持行内编辑并加载状态提示
3. 新增排产状态4"已排产"的枚举值和对应样式
4. 禁用排产编辑弹窗的工序类型选择框,优化表单交互
2026-07-08 16:49:58 +08:00
砂糖
212b79be56 feat(qc): 新增检化验申请单相关API,优化检验项模板接口并清理冗余页面
1. 将检验项模板查询接口从POST改为GET请求
2. 新增检化验申请单的增删改查、批量保存检验数据API
3. 删除多个冗余的质检历史、检验项、检验任务页面
2026-07-08 16:49:22 +08:00
朱昊天
d630920c06 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-07-08 16:05:33 +08:00
朱昊天
41e640c8d1 订单追踪 2026-07-08 16:05:21 +08:00
35d739d183 fix(inspection): 修复检验申请流程状态更新问题
- 在拉伸检验详情服务中添加状态字段更新逻辑
- 在主检验服务中同时修改状态字段为6
- 确保检验申请的状态同步更新到数据库
- 修复了流程状态不一致的数据问题
2026-07-08 15:33:04 +08:00
dc2baadcae Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-07-08 14:45:50 +08:00
1258456a81 模型tab修改 2026-07-08 14:45:43 +08:00
a95bdb5d57 feat(log): 添加页面路由记录功能到操作日志
- 在 OperLogEvent 中新增 operPage 字段用于存储页面路由信息
- 在 SysOperLog 实体类中添加 operPage 属性并配置 Excel 导出
- 修改 LogAspect 切面类从请求头获取 X-Page-Route 并设置到操作日志
- 在前端请求拦截器中添加当前路由路径到请求头 X-Page-Route
- 更新 SysOperLogMapper.xml 映射文件包含 operPage 字段映射
2026-07-08 14:35:50 +08:00
547b045dd4 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X
# Conflicts:
#	klp-ui/src/views/micro/pages/acid/components/Model.vue
#	klp-ui/src/views/micro/pages/acid/index.vue
2026-07-08 14:00:20 +08:00
9ce8807ed6 feat(micro/acid): 酸轧新增「模型」tab,对接六机架轧制模型服务
- 新增/mill-api代理(dev+nginx),指向klp-ml-mill FastAPI服务
- Model.vue:当前卷/下一卷,L2实测 vs 我们模型预测,逐机架对照
- 鉴权Key通过VUE_APP_MILL_API_KEY环境变量注入,不写死在源码里
2026-07-08 13:54:30 +08:00
c87418e4ba Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-07-08 13:43:52 +08:00
7cf9f4eca4 feat(qc): 新增批量检验功能并优化数据处理流程
- 添加 BatchInspectionMainBo 和 BatchInspectionTensileBo 数据传输对象
- 集成检验明细列表到 WmsInspectionMainBo 和 WmsInspectionTensileDetailBo
- 在 inspectionMain 控制器中实现批量插入检验主数据接口
- 在 inspectionTensileDetail 控制器中实现批量插入拉伸试验明细接口
- 重构前端检验样品页面,合并主表和明细表的保存操作
- 优化前端拉伸试验页面的批量新增逻辑,统一使用批量插入接口
- 更新服务层实现以支持批量插入并更新申请单关联ID列表
- 移除前端页面中单独的明细表增删改操作接口调用
2026-07-08 13:43:31 +08:00
朱昊天
6e8028c1a0 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-07-08 13:10:56 +08:00
朱昊天
1be7612eb5 设备维保调整字段和操作逻辑,预计开始时间,结束时间调整 2026-07-08 13:10:43 +08:00
砂糖
6e28ba0342 fix(wms/coil/stock, wms/report): 修复两处功能问题
1. 补充卷库存查询的质检状态参数
2. 修复自定义导出列重复添加和缓存解析重复数据的问题
2026-07-08 13:07:50 +08:00
jhd
682b939cb9 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-08 11:37:58 +08:00
jhd
3acb6d7f54 feat(erp): 为请购单增加审批意见功能
- 在ErpPurchaseRequisition实体类中添加一审和二审审批意见字段
- 在ErpPurchaseRequisitionBo和ErpPurchaseRequisitionVo中同步添加审批意见字段
- 修改approve和reject方法接口,支持传递审批意见参数
- 在服务实现层将审批意见保存到对应字段中
- 更新前端控制器接收审批意见参数并传递给服务层
- 在前端页面显示审批意见,并调整审批进度布局样式
- 添加数据库表结构变更SQL脚本,增加审批意见字段
2026-07-08 11:37:35 +08:00
朱昊天
51b27cf536 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-07-08 11:25:53 +08:00
朱昊天
cc42108d4f 设备维保调整字段和操作逻辑 2026-07-08 11:25:13 +08:00
jhd
dde1ade8b9 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-08 11:05:10 +08:00
jhd
ae928692d3 feat(erp): 实现请购单双层审批流程
- 在提交审批接口中新增指定一审审批人的参数
- 实现一审和二审的两级审批逻辑,一审为管理层审批,二审固定为陈清鑫
- 添加审批人身份验证,确保只有指定审批人才能进行审批操作
- 在前端界面中增加提交审批选择审批人弹窗
- 更新请购单状态显示,新增一审通过待二审状态(状态值6)
- 添加审批进度展示,显示一审人和二审人的审批情况
- 实现基于角色的审批权限控制,管理层可进行一审,特定人员可进行二审
- 新增查询审批人列表的API接口,支持按角色筛选审批人
- 优化审批按钮显示逻辑,根据不同状态和用户身份显示相应操作按钮
2026-07-08 11:03:50 +08:00
87dd154114 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-07-08 10:57:03 +08:00
3e36d41176 feat(wms): 添加钢卷报表导出功能的多行合并选项
- 在异常报表页面添加导出产出钢卷(多行合并)和导出消耗钢卷(多行合并)菜单项
- 新增 mergeCoilCells 工具函数实现 Excel 单元格合并功能
- 实现 exportWithMerge 通用方法处理带合并的 Excel 导出
- 添加导出时的加载提示和错误处理机制
- 优化 MES 质检样本详情加载逻辑,移除不必要的异步请求
2026-07-08 10:56:50 +08:00
朱昊天
1a3de775c8 Revert "设备维保调整字段和操作逻辑"
This reverts commit d1af1c28a6.
2026-07-08 10:49:00 +08:00
朱昊天
eadac22094 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X
# Conflicts:
#	klp-ui/src/utils/enum.js
2026-07-08 10:45:10 +08:00
朱昊天
d1af1c28a6 设备维保调整字段和操作逻辑 2026-07-08 10:43:27 +08:00
王文昊
91bd71f2f7 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-08 10:34:14 +08:00
王文昊
eef375cc2a feat(wms/move): 新增调拨单记忆输入并优化权限与功能
1. 新增MemoInput组件的maxSuggestions配置,限制下拉提示条数
2. 为调拨单相关页面替换输入框为带记忆功能的MemoInput
3. 移除冗余的regrade_quality_type字典依赖
4. 给删除按钮增加glc角色权限控制
5. 简化删除操作的Promise链式调用逻辑
6. 新增调拨单号、名称的枚举存储key
2026-07-08 10:34:10 +08:00
f0a74c1e1c feat(wms): 添加检化验申请单功能模块
- 创建检化验申请单实体类 WmsInspectionApplication
- 定义检化验申请单服务接口 IWmsInspectionApplicationService
- 实现检化验申请单服务业务逻辑 WmsInspectionApplicationServiceImpl
- 添加检化验申请单控制器 WmsInspectionApplicationController
- 创建检化验申请单数据访问层 WmsInspectionApplicationMapper
- 设计检化验申请单业务对象 WmsInspectionApplicationBo 和视图对象 WmsInspectionApplicationVo
- 配置检化验申请单 MyBatis 映射文件
- 实现检化验申请单的增删改查功能
- 添加检化验申请单列表查询和导出功能
2026-07-08 10:25:41 +08:00
af7b73d29c feat(wms): 添加检验主数据关联明细查询功能
- 引入 WmsInspectionDetail 相关依赖和映射器
- 在 WmsInspectionMainVo 中添加 detailList 字段存储明细列表
- 实现 fillDetailList 方法批量填充检验明细数据
- 优化查询方法在分页和列表查询时自动关联明细信息
- 使用流式处理和分组操作提升数据关联性能
2026-07-08 10:22:58 +08:00
砂糖
72a9371f5f Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-07 18:07:23 +08:00
砂糖
c0e06b6fad feat(acid页面): 添加模型管理菜单与基础API接口
新增侧边栏模型菜单入口,注册模型组件与路由映射,新建厚度/宽度分类等模型相关的后端API调用接口
2026-07-07 18:07:18 +08:00
朱昊天
4278c4eb26 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-07-07 17:05:25 +08:00
朱昊天
a4e889cfaa 首页优化(自加组件) 2026-07-07 16:48:55 +08:00
a56a0008b9 refactor(perf): 将ID字段从String类型改为Long类型
- 修改所有实体类中的ID字段类型从String改为Long
- 更新所有服务接口和实现类的方法参数类型
- 调整控制器中的路径变量类型以匹配新的ID类型
- 修正查询条件判断逻辑,从字符串非空检查改为数值非空检查
- 更新数据传输对象中的ID字段类型保持一致性
2026-07-07 16:39:37 +08:00
50a62bc201 feat(perf): 添加绩效系统部门管理功能
- 创建 PerfDept 实体类定义部门基本信息字段
- 实现 IPerfDeptService 接口提供部门增删改查方法
- 开发 PerfDeptController 控制器支持 RESTful API 操作
- 集成 MyBatis Plus 完成数据库映射与分页查询
- 添加部门信息的导入导出 Excel 功能
- 实现部门状态校验与批量删除验证逻辑
- 配置部门 VO 视图对象支持 Excel 数据转换
2026-07-07 15:58:06 +08:00
砂糖
bbf2831cc6 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-07 15:31:06 +08:00
砂糖
e4d0422c40 refactor(wms/transfer): 简化调拨子表数据预处理逻辑
移除冗余的isEmpty判断分支,改用空值合并运算符统一处理前后字段赋值,优化代码可读性和维护性
2026-07-07 15:31:01 +08:00
822e635dc2 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-07-07 15:24:19 +08:00
9b3c39f28f feat(perf): 添加绩效考核相关服务接口和实体类
- 创建了考核维度评分明细服务接口及实现类
- 添加了月度绩效考核记录服务接口及实现类
- 实现了绩效系数换算、车间考核参数配置等相关服务
- 定义了绩效考核相关的实体类和业务对象
- 创建了绩效考核控制器提供CRUD操作接口
- 配置了数据库映射文件和结果集映射
- 实现了数据校验和分页查询功能
2026-07-07 15:24:11 +08:00
砂糖
93816d5406 feat(CoilSelector,base): 将业务员输入框改为可创建选择器
将两处页面的业务员输入组件替换为带筛选和自定义创建的下拉选择器,并新增对应的业务员字典配置
2026-07-07 15:09:14 +08:00
砂糖
5a2fe5c519 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-07 13:25:03 +08:00
jhd
abfd5e2ee6 feat(file): 优化文件管理页面显示用户昵称
- 将文件列表中的上传人字段从用户名改为用户昵称显示
- 在文件详情页面同时支持显示昵称或用户名作为上传人信息
- 扩展表格列宽度并添加溢出提示功能提升用户体验
- 实现批量查询用户昵称的功能提高数据加载性能
- 新增 createByName 字段用于存储用户昵称信息
- 优化文件服务层代码结构添加用户映射器依赖
2026-07-07 13:22:13 +08:00
jhd
52be3be1f2 refactor(file): 重构文件管理页面布局和功能
- 将左右分栏布局改为侧边栏+主区域布局
- 移除拖拽调节宽度功能和相关代码
- 重构文件类型筛选为垂直列表形式
- 移除顶部标签页切换功能
- 合并文件预览和详情功能到单一详情弹窗
- 详情弹窗中集成文件预览和元数据展示
- 优化表格列显示,增加文件大小、所属部门、订单编号等字段
- 调整操作按钮位置和样式
- 优化评论功能的显示和交互
- 简化文件上传和编辑流程
- 移除不再使用的变量和方法
2026-07-07 12:59:43 +08:00
砂糖
16533ae664 fix(wms/move): 修复调拨单搜索和批量执行的参数问题
1. 将调拨单号搜索的绑定值从transferNo改为transferId,匹配后端接口参数
2. 给批量执行按钮添加加载状态防止重复提交
3. 新增批量执行完成后的回调刷新列表并关闭加载状态
2026-07-07 11:22:43 +08:00
砂糖
f617bb884d refactor(crm/contract): 重构合同页面布局与Tab组件
1.  移除合同页面的拖拽拆分面板功能,合并预览区到Tab页签
2.  将原生el-tabs替换为自定义Tab头部,新增合同信息页签
3.  调整产品类型列表列宽,优化页面展示效果
4.  精简冗余代码与样式,提升页面性能与可维护性
2026-07-07 11:22:17 +08:00
jhd
70251cd9d1 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-07 09:42:36 +08:00
jhd
ad6eef9543 refactor(wms): 优化库存详情页钢材品类匹配逻辑
- 调整镀锌管材匹配规则,支持更多镀锌相关品类
- 新增仓库特定品类匹配配置,不同仓库使用不同的品类优先级
- 扩展品质等级匹配逻辑,支持以字母开头和特定等级标识
- 修改数据获取方式,按仓库分别请求并去重合并数据
- 优化钢材品类匹配算法,按仓库限制的品类范围进行匹配
- 更新数据加载逻辑,使用Promise.all并行请求提升性能
2026-07-07 09:42:15 +08:00
砂糖
6a79bbf0fe Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-06 17:47:15 +08:00
砂糖
f55bb42557 fix(wms/coil/materialWarning): 优化标签打印逻辑,格式化更新时间
重构打印标签的处理流程,直接调用子组件打印方法替代手动操作DOM,同时将更新时间格式化为年月日格式
2026-07-06 17:47:08 +08:00
bcdecc5b01 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-07-06 17:34:36 +08:00
038e8544a0 feat(pltcm): 新增设备启用状态管理功能
- 创建 ModDeviceEnable 实体类定义设备启用状态数据结构
- 实现 IModDeviceEnableService 接口及 ModDeviceEnableServiceImpl 业务逻辑
- 添加 ModDeviceEnableController 提供 REST API 接口支持增删改查操作
- 配置 ModDeviceEnableMapper 和 MyBatis XML 映射文件
- 定义 ModDeviceEnableBo 和 ModDeviceEnableVo 数据传输对象
- 集成 Excel 导出功能支持设备数据批量导出
- 实现分页查询、条件筛选和排序功能
2026-07-06 17:34:25 +08:00
王文昊
b49209bc1a style(crm/contract/detail): 给业务员下拉框添加自定义样式
新增了业务员选择框的专属样式,设置了默认背景色、边框样式,聚焦时切换为白色背景并恢复文本正常展示
2026-07-06 17:32:56 +08:00
王文昊
93bb094566 feat: 新增合同、订单明细导出功能,补充业务员字段展示
1.  新增crm订单主、订单明细的导出接口,支持业务精简字段导出
2.  为订单明细VO新增业务员字段,关联查询订单表填充数据
3.  在订单列表页新增业务员表格列展示
4.  为合同编辑页、订单明细页添加导出按钮并实现导出逻辑
5.  新增导出专用的VO类,处理日期格式化和状态转文本
2026-07-06 17:19:49 +08:00
朱昊天
e42eac9115 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-07-06 16:04:31 +08:00
朱昊天
b5e71223e7 集成开发 2026-07-06 16:03:39 +08:00
砂糖
b1bf87b611 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-06 15:43:11 +08:00
砂糖
72bc19fab2 feat(mes/roll,cost/trend): 优化轧辊报表和成本趋势页面
1. 轧辊报表:修复产线关联逻辑,通过轧辊映射获取产线信息,移除冗余的lineId请求参数
2. 成本趋势页:重构为迷你多图表布局,优化筛选栏样式和交互细节
2026-07-06 15:43:08 +08:00
19040479dd feat(pltcm): 添加钢种分类管理功能
- 创建了钢种分类实体类 TdbSteelgrade 包含钢种名、冲压级别、屈服强度等字段
- 定义了业务对象 TdbSteelgradeBo 和视图对象 TdbSteelgradeVo
- 实现了钢种分类的增删改查服务接口 ITdbSteelgradeService
- 开发了钢种分类控制器 TdbSteelgradeController 提供 REST API 接口
- 配置了 MyBatis Plus 映射器和 XML 映射文件
- 实现了分页查询、导出 Excel、批量删除等功能
- 添加了数据验证和业务逻辑处理
2026-07-06 15:21:38 +08:00
8839693ccd feat(deps): 添加 klp-pltcm 依赖模块
- 在 pom.xml 中新增 klp-pltcm 依赖配置
- 版本统一使用 ${klp-flowable-plus.version} 变量管理
2026-07-06 14:48:58 +08:00
e6eec3c459 feat(pltcm): 添加工艺模型配置模块及核心功能
- 新增 klp-pltcm 模块到项目根目录
- 在 klp-admin 中添加对 klp-pltcm 的依赖引用
- 实现策略关联 (ModStrategy) 的完整CRUD功能
- 实现厚度分类 (ModThickClass) 的完整CRUD功能
- 实现宽度分类 (ModWidthClass) 的完整CRUD功能
- 实现屈服强度分类 (ModYieldStressClass) 的完整CRUD功能
- 实现比例表 (SchRatio) 的完整CRUD功能
- 添加相应的控制器、服务接口、实现类和数据传输对象
- 配置 MyBatis 映射文件和数据库实体类
- 提供 Excel 导出功能和分页查询支持
2026-07-06 14:35:57 +08:00
砂糖
a21e0059ef Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-06 13:44:07 +08:00
砂糖
223c0361ab feat(roll report): 添加磨削报表产线维度分析与多维度趋势展示
1. 新增lineId字段到磨削VO及查询SQL,支持产线数据统计
2. 增加按天/周/月切换的磨削趋势图表,自动适配时间区间
3. 新增月度产线汇总表格,支持按产线统计磨削次数与总量
4. 新增汇总数据导出Excel功能
2026-07-06 13:44:05 +08:00
jhd
ab8dfb86b2 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-06 11:24:21 +08:00
jhd
b0ac38c050 refactor(file): 重构文件管理页面UI布局和搜索功能
- 将统计卡片改为销售看板风格的汇总卡片布局
- 实现左右分栏布局并支持拖拽调节宽度
- 新增高级搜索功能和文件类型筛选标签页
- 优化搜索栏布局为工具栏样式并支持折叠
- 移除文件元数据卡片改用预览区域显示
- 添加查看文件详情和导出功能按钮
- 重构表格容器为固定高度可滚动布局
- 分离我的文件和共享文件的搜索界面差异
2026-07-06 11:23:28 +08:00
f164fa5b12 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-07-06 10:55:07 +08:00
55ae4ad332 feat(attendance): 优化考勤记录导出功能支持部门选择
- 修改后端接口参数名称从 deptname 改为 enames
- 实现前端多员工选择下拉框组件
- 添加部门联动员工动态加载功能
- 重构导出逻辑支持按员工列表精确过滤
- 修复数组参数序列化导致的逗号编码问题
- 新增获取部门列表和按部门查询员工的API接口
- 实现导出表单验证和异步处理机制
2026-07-06 10:54:57 +08:00
砂糖
f343552729 refactor: 优化多个页面UI与交互细节
1. 修改钢卷追踪页面标题,调整crm钢卷表格列宽与按钮文本
2. 优化采购审核、到货、计划页面表格列配置,添加材质列
3. 为多个页面添加详情加载状态,统一按钮间距样式
4. 新增采购到货页面模板下载功能,修复产品内容组件单元格内边距
2026-07-06 10:36:56 +08:00
王文昊
ed69b65e96 feat(qc): 质量评审模块增加库区管理功能
1. 为钢卷评审实体类新增改判前后逻辑库区相关字段
2. 新增数据库迁移脚本添加库区字段到qc_quality_review_coil表
3. 移除硬编码的技术部库区逻辑,改为支持手动指定目标库区
4. 在前端页面新增库区展示列和改判后库区选择器
5. 自动带出钢卷当前库区信息
2026-07-06 10:14:27 +08:00
jhd
cf4e5b78fc Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-06 09:52:29 +08:00
jhd
9ef387114d refactor(file): 优化文件管理页面布局和元数据显示
- 将文件列表表格包装在可滚动容器中,支持固定高度显示
- 新增选中文件元数据卡片组件,显示文件详细信息
- 调整左右分栏布局为拉伸对齐,优化高度计算
- 移除预览区域的文件元数据行,统一在卡片中显示
- 为共享文件和相关文件标签页添加独立的滚动样式
- 简化预览内容区域的flex属性配置
2026-07-06 09:51:28 +08:00
660e8049cd fix(order): 修复合同ID查询逻辑错误
- 修正了销售异议查询中的订单ID参数错误
- 修正了应收账款查询中的订单ID参数错误
- 修正了运单查询中的订单ID参数错误
- 简化了合同ID直接查询逻辑,移除冗余订单查询步骤
- 修复了线圈材料查询中的订单ID条件错误
2026-07-05 10:14:46 +08:00
7d65f76923 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-07-05 09:29:13 +08:00
3ffc96b501 fix(order): 优化合同ID查询线圈数据逻辑
- 移除通过订单表间接查询的冗余步骤
- 直接使用合同ID查询线圈合同关联表
- 简化数据库查询逻辑提升性能
- 修复可能的数据查询错误问题
2026-07-05 09:29:05 +08:00
9849e6bfe3 refactor(wms): 优化多个页面的样式与功能
1. 调整物料预警页面的逾期天数默认值为60天
2. 钢卷库存页面新增钢卷明细导出按钮和布局优化
3. 异议工单页面调整导出按钮的显示逻辑,移除状态判断
4. 重构异议工单基础信息组件的布局与样式,优化信息展示
2026-07-04 16:11:57 +08:00
e8c1c646a8 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-04 15:43:08 +08:00
2fde9ec993 feat: 实现产需单按工序步骤生成排产明细功能
1. 重构接收产需单接口,支持按配置工序步骤生成明细
2. 新增工艺、工艺步骤CRUD接口与管理页面
3. 新增工序选择组件
4. 优化产需单页面,增加历史记录功能
5. 为排产明细添加工序步骤名称展示
2026-07-04 15:43:05 +08:00
ce09ac9da3 refactor: 清理调试日志、注释节点并新增指标公式计算能力
1. 移除Sidebar.Item组件中的调试打印日志
2. 注释掉wms/post/flow.vue中的K节点菜单配置
3. 重构cost/comprehensive.vue的统计计算逻辑,新增自定义指标公式解析计算功能,支持变量替换和安全求值
2026-07-04 15:35:41 +08:00
2ab7647bf2 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-07-04 15:35:11 +08:00
a3016a0f70 fix(acid): 优化实际性能组件中的钢种字段显示逻辑
- 移除了ORDER_QUALITY和order_quality字段的冗余处理
- 统一使用GRADE或grade字段作为钢种数据源
- 简化了模板中的条件渲染逻辑
2026-07-04 15:34:48 +08:00
aab6f9e4f1 refactor(wms/report): 给钢卷号列组新增coilId字段
在入库报表和报表模板的列配置中,为钢卷号分组追加coilId字段,补充展示钢卷ID相关信息
2026-07-04 15:22:35 +08:00
王文昊
0f054c189d feat(qc): 优化质量评审审批流程,改为创建时预填内容领导仅确认
1.  调整审批接口为路径参数传递评审单ID,移除审批BO参数
2.  待审批页面改为只读展示已填写的审批意见和钢卷改判状态
3.  审批通过时直接执行改判,无需额外操作
4.  重构编辑弹窗和详情页的布局与展示逻辑
5.  移除独立的品质部意见编辑,整合到表单中
2026-07-04 14:35:20 +08:00
ec40ab90ba fix(erp): 修复采购计划到货统计准确性问题
- 直接从到货明细重新计算到货/在途统计数据,避免数据库缓存导致的数据不准确
- 更新在途状态判断逻辑,在途等于所有已上传但尚未到货的卷,不论WMS中是否有记录
- 移除未到货状态,未到货的全部计入在途状态
- 立即加载详情而不等待WMS刷新,提升用户体验
- 在WMS钢卷导出功能中添加钢卷ID字段支持
2026-07-04 14:19:25 +08:00
d42c4c5a94 feat(export): 添加钢卷ID导出字段
- 在CoilTotalMergedExportVo中添加coilId字段用于导出
- 在WmsCoilWarehouseOperationLogExportVo中添加coilId字段用于导出
- 在WmsMaterialCoilAllExportVo中添加coilId字段用于导出
2026-07-04 13:43:47 +08:00
eecb7fcae6 feat(erp): 补充合同信息字段并完善采购计划关联显示
- 在ErpContractOptionVo中添加crm_order全量字段包括订单类型、交货日期、订单状态等
- 添加@JsonFormat注解支持日期格式化
- 新增selectContractsByOrderCodes方法支持按合同编号批量查询
- 更新SQL映射文件中的selectContractPage和新增selectContractsByOrderCodes查询
- 在采购计划服务实现中查询时刷新进度并关联合同详情
- 在前端界面中新增关联合同标签页显示合同详细信息表格
- 重构采购到货界面将采购要求和到货明细合并显示
- 添加合同状态文本转换方法和相关样式定义
2026-07-04 13:38:23 +08:00
5e5c0bae24 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-04 13:19:38 +08:00
85751acc46 feat(cost/comprehensive): 添加汇总行功能,支持表格数据求和与平均计算
1. 新增summaryRows计算属性,生成总和与平均两行汇总数据
2. 新增tableData计算属性,将汇总行合并到原表格数据中
3. 为汇总行添加专属样式,高亮显示并加粗文字
4. 优化表格列渲染逻辑,普通行保留编辑能力,汇总行仅展示静态数据
5. 调整删除按钮逻辑,仅对非汇总行生效并修复删除索引问题
6. 新增rowClassName方法为汇总行添加专属CSS类
2026-07-04 13:19:32 +08:00
王文昊
c922856a08 feat(qc): add auto warehouse update logic for regraded coils
根据改判后的钢卷质量等级自动将C/D级钢卷移动到技术部逻辑库区
2026-07-04 11:49:04 +08:00
王文昊
d5d77c53b6 refactor(qc): 移除页面顶部审批操作按钮,调整审批逻辑
1.  移除待审批状态下页面顶部的审批通过和驳回按钮
2.  重构审批相关的前端方法,删除冗余的handleApprove和handleReject
3.  优化后端审批日志逻辑,自动获取当前登录用户作为操作人
4.  新增评审单修改状态校验,仅草稿和已驳回状态可修改
5.  新增钢卷改判状态完整性校验,确保所有钢卷都已指定改判质量
6.  完善保存前的数据校验,新增产品名称非空校验和默认传审部门
2026-07-04 11:23:13 +08:00
王文昊
32455daf42 refactor(wms): 统一钢卷质量状态更新逻辑,集中管理改判记录
1. 新增统一的updateQualityStatus方法,封装钢卷质量状态更新和改判日志记录逻辑
2. 替换mes模块中直接更新钢卷状态和插入改判日志的代码,改用统一服务方法
3. 移除冗余的改判日志Mapper注入和手动插入代码
2026-07-04 10:54:41 +08:00
jhd
827555aa43 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-04 10:29:39 +08:00
jhd
dde554c081 feat(file): 扩展文件管理功能支持相关文件标签页
- 为 related 标签页添加左侧文件列表面板宽度控制逻辑
- 在 KLPTable 组件中为 related 标签页启用行高亮显示功能
- 调整文件类型、文件大小、订单编号、所属部门、可见范围列的显示条件
- 为浏览次数列添加 related 标签页的支持条件
- 调整备注和操作列的显示逻辑以兼容 related 标签页
- 为 related 标签页添加拖拽分隔条和右侧文件预览功能
- 在文件预览头部添加查看文件详情按钮
- 更新预览和行点击事件以支持 related 标签页
- 实现文件详情查看功能和对应的弹窗显示逻辑
2026-07-04 10:28:22 +08:00
jhd
69f97e1bac feat(file): 重构文件管理页面增加左右分栏布局
- 实现共享文件标签页的左右分栏布局,左侧显示文件列表,右侧显示文件预览
- 添加拖拽分隔条功能,支持调整左右面板宽度比例
- 为共享文件添加文件预览功能,支持图片、PDF、Word、Excel等多种格式
- 实现文件评论系统,支持查看和发布评论
- 优化表格交互,在共享文件标签页点击行可选中文件并显示预览
- 添加浏览次数统计功能,点击预览时自动增加浏览量
- 调整文件列表列显示逻辑,根据不同标签页显示相应字段
- 添加文件详情预览面板,显示文件元数据信息
- 实现评论区域展开收起功能,优化界面空间利用
-
2026-07-04 10:24:10 +08:00
ca0de0fcd6 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-07-04 10:13:43 +08:00
157f34fc6e feat(acid): 支持按热卷号搜索实绩数据
- 修改前端界面将搜索选项从"按钢卷号"扩展为"按钢卷号/热卷号"
- 更新搜索标签从"钢卷号"改为"钢卷号/热卷号"
- 将输入框占位符从"EXCOILID"更新为"子卷号或热卷号"
- 修改后端SQL查询逻辑同时支持EXCOILID和HOT_COILID字段搜索
- 为两个查询方法添加热卷号搜索条件支持
2026-07-04 10:13:08 +08:00
jhd
383c180962 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-04 10:03:55 +08:00
jhd
09466ad4a7 feat(file): 在文件预览界面添加评论功能
- 实现文件评论的前端展示界面,包括评论列表、输入框和交互功能
- 添加文件评论的API接口,支持查询和新增评论操作
- 设计并实现后端服务层、控制器、数据访问层等相关组件
- 集成评论功能到现有的文件预览页面,支持展开/收起评论区
- 实现评论数据的实时加载和提交功能,优化用户体验
2026-07-04 10:02:52 +08:00
王文昊
bce8152aff refactor(pt): 调整PtProductTolerance相关类的包路径
将产品公差相关的domain、bo、vo、mapper、service等类统一迁移到pt模块包下,同时新增数据库对齐和菜单修复的SQL脚本
2026-07-04 09:46:22 +08:00
jhd
5029d09f09 feat(file): 添加文件浏览次数统计功能
- 在文件列表表格中新增浏览次数列显示
- 在文件详情描述中添加浏览次数信息展示
- 实现文件浏览次数自增接口 incrementView
- 前端点击文件预览时自动调用浏览次数增加功能
- 后端添加 SysFile 实体类 viewCount 字段
- 实现数据库表字段映射和更新逻辑
- 添加控制器接口 /incrementView/{fileId} 处理请求
2026-07-04 09:40:48 +08:00
jhd
fa30ac37e9 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-03 17:56:05 +08:00
jhd
882c329e03 feat(file): 实现文件管理页面左右分栏布局和实时预览功能
- 添加左右分栏布局结构,支持拖拽调节面板宽度
- 在左侧显示文件列表表格,右侧显示选中文件的详细信息和预览
- 集成多种文件类型的预览组件(图片、PDF、Word、Excel等)
- 实现点击表格行选中文件并同步到右侧预览区域
- 添加文件详情弹窗用于显示完整元数据信息
- 优化文件统计卡片的样式设计和间距布局
- 移除原有的独立预览对话框,整合到右侧预览面板中
2026-07-03 17:55:06 +08:00
de623e5f34 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-07-03 17:47:15 +08:00
3f02e108e9 feat(wms): 删除钢卷质量状态变更记录相关功能模块
- 移除 WmsCoilQualityChangeLog 实体类定义
- 移除 WmsCoilQualityChangeLogVo 视图对象类
- 移除 WmsCoilQualityChangeLogBo 业务对象类
- 移除 IWmsCoilQualityChangeLogService 服务接口
- 移除 WmsCoilQualityChangeLogServiceImpl 服务实现类
- 移除 WmsCoilQualityChangeLogController 控制器类
- 移除 WmsCoilQualityChangeLogMapper 数据访问接口
- 移除 WmsCoilQualityChangeLogMapper.xml 映射文件
2026-07-03 17:47:07 +08:00
56fe7f9e55 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-03 17:42:08 +08:00
053f3ea01e feat(wms/coil): 新增钢卷质量状态流转展示
1.  添加属性箭头样式类用于展示状态流转箭头
2.  新增初始质量状态props传递,在基础信息和生命周期追踪组件中展示质量状态变更
3.  在 futuristic 钢卷卡片中展示初始到当前的质量状态流转
2026-07-03 17:42:05 +08:00
734a83df10 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-07-03 17:35:02 +08:00
4bea8bdb17 feat(wms): 添加钢卷列表附带质量改判记录功能
- 在 IWmsCoilQualityRejudgeService 中新增 queryCoilListWithRejudge 方法
- 实现批量查询钢卷并附带最新质量改判记录的功能
- 添加 WmsMaterialCoilRejudgeVo 和 WmsMaterialCoilBo 数据传输对象
- 在 WmsCoilQualityRejudgeController 中新增 coilListWithRejudge 接口
- 实现服务层逻辑,通过 wmsMaterialCoilService 查询钢卷列表
- 批量查询每个钢卷的最新改判记录并组装返回结果
2026-07-03 17:30:33 +08:00
2f01c712e1 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-03 17:15:16 +08:00
a0b283a21e feat(system-menu): 优化菜单样式配置功能
1. 修复收货计划跳转路径错误,将路径从/receive/plan调整为/wip/receive/plan
2. 重构菜单样式编辑区域:将单行输入框改为多行文本编辑器,支持快捷样式预设、格式校验和实时预览
3. 新增菜单样式JSON校验逻辑,支持验证格式合法性和无效CSS属性
2026-07-03 17:15:13 +08:00
6fd30eae7c feat(wms): 添加钢卷质量状态变更记录功能
- 新增 WmsCoilQualityChangeLog 实体类定义数据库表结构
- 创建 WmsCoilQualityChangeLogBo 业务对象用于数据传输
- 创建 WmsCoilQualityChangeLogVo 视图对象用于前端展示
- 实现 IWmsCoilQualityChangeLogService 接口定义业务方法
- 开发 WmsCoilQualityChangeLogServiceImpl 业务逻辑实现类
- 创建 WmsCoilQualityChangeLogMapper 数据访问接口
- 配置 WmsCoilQualityChangeLogMapper.xml 映射文件
- 实现 WmsCoilQualityChangeLogController 控制器提供 REST API
- 支持查询、新增、修改、删除和导出钢卷质量状态变更记录
- 添加分页查询和条件筛选功能
- 集成 Excel 导出功能便于数据导出统计
2026-07-03 17:01:01 +08:00
388d5a10c4 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-03 16:56:47 +08:00
338d205cc6 feat(equipment-maintenance): 新增产线字段并完善查询条件与日期格式化
1.  在维修计划实体、BO和VO类中新增产线字段,添加excel导出注解
2.  维修计划列表查询增加产线过滤条件
3.  为维修计划明细的执行日期添加日期格式化注解
2026-07-03 16:56:44 +08:00
b8d3af67e7 feat(flow): 添加工序定义和步骤明细功能模块
- 创建工序定义主服务接口及实现类
- 创建工序步骤明细服务接口及实现类
- 添加工序定义主控制器提供CRUD操作接口
- 添加工序步骤明细控制器提供CRUD操作接口
- 创建工序定义主和步骤明细的数据实体类
- 创建工序定义主和步骤明细的业务对象类
- 创建工序定义主和步骤明细的视图对象类
- 添加工序定义主和步骤明细的数据访问层
- 更新元数据配置文件将actionType字段名改为actionId
- 更新前端调度界面使用新的actionId字段进行工序类型映射
- 在排程明细表中添加工序关联字段processId
- 完善前后端数据交互和验证逻辑
2026-07-03 16:26:59 +08:00
ad46667847 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-07-03 15:58:51 +08:00
d03cd926bc feat(attendance): 新增考勤记录表导出功能
- 在前端API中添加exportAttendanceReport方法用于导出考勤记录
- 在AttendanceRecordsController中添加exportReport接口支持考勤表导出
- 在AttendanceRecordsServiceImpl中实现完整的考勤记录表Excel导出逻辑
- 添加员工分组、按日期汇总打卡时间的业务处理
- 创建多种Excel样式包括标题、表头、日期列和明细行样式
- 在前端页面中新增导出按钮和导出参数设置对话框
- 实现导出前确认同步状态的交互逻辑
- 支持按工号、姓名、部门筛选条件进行考勤表导出
2026-07-03 15:58:43 +08:00
00f5abc0db Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-03 15:37:47 +08:00
a671e1ee5f feat(cost): 新增成本趋势分析页面
实现了基于产线筛选的成本数据趋势可视化页面,包含报表筛选、成本类别和成本项多选过滤,支持多趋势线对比展示,自动适配图表布局与图例滚动,同时展示统计摘要信息。
2026-07-03 15:37:45 +08:00
89e7a9d56a style: 统一优化异议处理页面的整体UI样式风格
本次提交对wms异议处理页面的所有组件样式进行了统一调整:
1.  替换了老旧的复古文档风格配色,统一使用现代中性色调的Tailwind CSS风格色值
2.  调整了字体大小、行高、间距等排版参数,优化页面整体可读性
3.  统一了卡片、边框、圆角的样式规范,移除冗余的衬线字体配置
4.  调整了页面容器背景色,从暖白纸色改为更清爽的工业风浅色主题
5.  优化了空状态、流程步骤等组件的视觉表现,保持整体风格统一
2026-07-03 15:37:37 +08:00
b3da00e2e7 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-07-03 15:14:16 +08:00
6fce4105ab refactor(flow): 移除设备维护计划详情中的巡检记录和设备ID字段
- 从 EqpMaintenancePlanDetail 实体类中移除 recordId 和 equipmentId 字段
- 从 EqpMaintenancePlanDetailBo 中删除 recordId 和 equipmentId 属性定义
- 在 MyBatis 映射文件中移除 recordId 和 equipmentId 的结果映射
- 从查询条件中移除对 recordId 和 equipmentId 的过滤逻辑
- 从 EqpMaintenancePlanDetailVo 中删除相关字段及其 Excel 导出注解
- 修改前端代码以适应该字段移除,在添加维护计划异常时不再传递 recordId 参数
2026-07-03 15:14:08 +08:00
7236e02813 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-07-03 15:04:52 +08:00
d05dd9448a 添加设定值 2026-07-03 15:04:45 +08:00
d7bf12d880 feat: 新增产品标准、工艺路线及工序参数管理功能
本次提交新增了以下内容:
1. 为产品标准BO的生效日期和失效日期添加Json格式化注解
2. 新增工艺主表、工序参数明细的前后端CRUD接口与页面
3. 新增产品标准相关的全套CRUD接口
4. 新增产品标准管理页面,包含产品用途、化学成分等多类子功能模块
2026-07-03 10:42:48 +08:00
jhd
c04f40ad5c Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-02 15:46:14 +08:00
jhd
5f1aec65c5 尺寸公差 2026-07-02 15:45:50 +08:00
8fa94d4918 厚度曲线出口厚度显示三位小数、去除设定值线,横坐标从0起步长500 2026-07-02 15:13:48 +08:00
b7d77405b8 feat(pt): 添加产品和工艺模块基础配置
- 创建 klp-pt 模块的 pom.xml 配置文件
- 设置模块基本信息包括 artifactId 和描述
- 配置父项目依赖关系
- 添加 klp-common 公共组件依赖
2026-07-02 14:56:12 +08:00
1d8274000b feat(pt): 添加产品工艺模块及生产流程接口
- 在klp-generator模块中为GenTableServiceImpl添加创建时间倒序排序功能
- 创建全新的klp-pt模块用于产品和工艺管理功能
- 在父级pom.xml中注册klp-pt模块依赖
- 在klp-admin中添加klp-pt模块引用
- 添加生产工艺路线主实体、业务对象、控制器、服务接口及实现类
- 添加工艺各工序质检关口、工艺工序控制参数明细等10个新的服务接口定义
- 实现PtProcesse相关数据库映射和XML配置文件
- 添加PtProcessQualityGate等产品工艺相关领域模型和业务对象定义
2026-07-02 14:55:53 +08:00
王文昊
2812c6b3b1 feat(wms/flow): 启用并完善全流程节点配置,新增异常处理逻辑
1.  恢复并启用设备维修流程的全流程节点配置
2.  重构各业务标签页的节点跳转逻辑,统一使用handleOpen跳转对应页面
3.  为投诉任务列表接口新增异常捕获处理,请求失败时重置列表数据
2026-07-02 14:24:19 +08:00
5d29e92bde Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-02 09:32:11 +08:00
10490610d1 refactor(wms/flow): 重构流程页面节点跳转逻辑,改为动态弹窗加载组件
1. 新增弹窗组件容器,实现节点点击后动态加载对应页面组件
2. 替换原有硬编码的跳转逻辑,统一使用handleOpen方法处理节点点击
3. 注释暂时不需要的流程节点配置,简化当前可用流程
4. 新增弹窗相关状态与样式,优化弹窗展示效果
2026-07-02 09:32:04 +08:00
6f9db961b4 feat(monitor): 添加操作日志绩效统计权重
- 在SysOperLogService中新增绩效概览、人员绩效和模块排行接口
- 在SysOperLogMapper中添加模块统计、人员统计和全局概览查询方法
- 在SysOperLogMapper.xml中实现绩效相关的SQL查询和ResultMap
- 在SysOperLogServiceImpl中实现绩效统计业务逻辑和评分算法
- 创建OperModuleStatVO、OperPersonVO和OperSummaryVO数据传输对象
- 新增OperPerformanceController提供绩效统计API接口
- 添加前端performance页面实现数据可视化展示和图表渲染
2026-07-01 16:24:45 +08:00
9bed76e3dc refactor: 移除多个标签组件的手动打印缩放逻辑与打印样式
移除了11个物料标签组件中的打印监听事件、动态缩放计算逻辑以及单独的打印样式代码,改为依赖浏览器原生打印适配能力,简化组件代码结构。
2026-07-01 15:57:33 +08:00
cddc3309ad Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-07-01 15:43:40 +08:00
9233d09edc feat(monitor): 添加操作日志绩效统计功能
- 在SysOperLogService中新增绩效概览、人员绩效和模块排行接口
- 在SysOperLogMapper中添加模块统计、人员统计和全局概览查询方法
- 在SysOperLogMapper.xml中实现绩效相关的SQL查询和ResultMap
- 在SysOperLogServiceImpl中实现绩效统计业务逻辑和评分算法
- 创建OperModuleStatVO、OperPersonVO和OperSummaryVO数据传输对象
- 新增OperPerformanceController提供绩效统计API接口
- 添加前端performance页面实现数据可视化展示和图表渲染
2026-07-01 15:43:26 +08:00
20d598b099 feat(wms/coil/materialWarning): 完善物料超期预警查询条件
新增物料类型筛选、产品规格/材质/厂家等多维度查询字段,调整表单布局与默认参数,适配成品/原料两类物料的查询需求
2026-07-01 15:33:38 +08:00
2ff75fdc77 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-01 15:23:35 +08:00
178df9de43 feat(wms/coil): 新增超期库存告警页面并重构告警管理页面
1. 新增钢卷超期库存告警页面,支持按超期天数、库位、物料筛选查询
2. 在钢卷信息组件中添加创建时间展示并优化显示格式
3. 将原告警页面重构为标签页形式,拆分维度告警和超期库存告警为独立组件
2026-07-01 15:23:30 +08:00
jhd
c445a01cd9 请购单优化 2026-07-01 15:16:27 +08:00
jhd
ad25227400 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-01 13:29:38 +08:00
jhd
aa0f645fc8 隐藏按钮bug修改 2026-07-01 13:29:08 +08:00
62f6362d61 feat(menu): 添加菜单唯一标识功能
- 新增 menuKey 字段到 SysMenu 实体类
- 在菜单服务接口和服务实现中添加 checkMenuKeyUnique、selectMenuByMenuKey 和 generateMenuKeys 方法
- 在控制器中增加 getByKey 和 generateMenuKeys 接口用于通过唯一标识获取菜单和批量生成菜单标识
- 在数据库映射中添加对 menuKey 字段的支持
- 在新增和修改菜单时验证 menuKey 唯一性
- 实现自动生成菜单唯一标识的功能,支持基于路径或菜单名称生成
2026-07-01 13:23:18 +08:00
ad1fa08561 fix(mes): 解决检化验Jackson序列化导致的字段名不一致问题
- 归一化单字母前缀字段名,处理cContent、pContent、sContent字段大小写问题
- 添加字段映射逻辑,兼容ccontent、pcontent、scontent小写格式
- 确保数据展示时字段名统一性,避免前端显示异常
2026-07-01 11:28:29 +08:00
jhd
59956764b0 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-01 11:10:11 +08:00
jhd
40de24f3b0 库存明细页面增加导出excel 2026-07-01 11:09:52 +08:00
0c8bde49bc Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-01 11:05:34 +08:00
d9733d057a refactor(WarehouseSelect): 重构组件props,将showTop改为collapseTags
1.  新增仓库选择组件的collapseTags属性,默认关闭多选标签折叠
2.  新增钢卷库存页面,集成仓库选择组件并启用多选标签折叠功能
2026-07-01 11:05:31 +08:00
jhd
3b1fc19b2d 库存明细页面优化 2026-07-01 11:04:37 +08:00
王文昊
3fcb03ebc3 fix(qc): 优化质量评审模块的字典使用与逻辑修复
1. 替换改判状态硬编码选项为系统字典
2. 修复钢卷明细更新的误删问题,仅在传coilList时更新
3. 拆分评审意见表单避免数据串用
4. 补充线上数据库修复脚本与缺失字典
5. 修复钢卷字段名不匹配问题
2026-07-01 10:45:20 +08:00
jhd
7aea184a81 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-07-01 09:13:04 +08:00
jhd
ad650b9a57 电子请购单优化 库存明细页面 2026-07-01 09:11:15 +08:00
王文昊
450fca0c45 feat: 新增质量评审流程全量功能
- 新增质量评审相关的实体、Mapper、Service、Controller接口与实现
- 新增前端页面与API接口,支持评审单增删改查、提交送审、审批驳回、改判执行
- 新增数据库初始化脚本与字典数据
- 修复vue.config热加载监视系统文件导致的EBUSY错误
- 清理HRM模块API导出注释
2026-06-30 17:58:21 +08:00
c997a4a1a0 refactor(system/file): 拆分文件管理页面,新增所有文件tab页
1. 从原文件页面抽离所有文件逻辑为独立all.vue组件
2. 移除原页面的所有文件tab,默认激活我的文件tab
3. 保留原有的我的文件、共享文件、与我相关tab功能
2026-06-30 17:26:57 +08:00
fe3d55c02b refactor(file): 重构文件对象继承基础实体类
- 添加 BaseEntity 继承以统一基础字段管理
- 简化了 SysFileVo 类的代码结构
- 提升了代码复用性和可维护性
2026-06-30 17:10:58 +08:00
497d9e78fb Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-30 16:43:07 +08:00
f4c870aa23 feat(aps): 优化排产页面与对比页面的工序类型展示和筛选功能
1. 为待审核、已排产卡片添加自定义加载提示文本
2. 替换工序类型输入框为下拉选择器,使用全局工序枚举数据
3. 为排产表格添加工序类型名称转换显示
4. 重构对比页面的工序筛选逻辑,改为顶部单选按钮组筛选
5. 优化钢卷数据查询逻辑,关联选中的工序类型进行查询
6. 修复编辑和合并表单的字段类型转换问题
2026-06-30 16:43:03 +08:00
64d52f1ecf feat(wms): 新增合同挂接钢卷统计功能
- 在IWmsCoilContractRelService接口中添加queryContractCoilStatistics方法
- 在WmsCoilContractRelController控制器中添加统计查询和导出接口
- 在WmsCoilContractRelMapper中添加selectContractCoilStatistics查询方法
- 实现合同挂接钢卷统计的SQL查询逻辑,支持多条件筛选
- 创建ContractCoilStatisticsBo查询对象和ContractCoilStatisticsVo视图对象
- 开发前端统计页面,包含搜索筛选、统计卡片、图表展示和数据表格
- 集成ECharts实现合同状态分布饼图和销售员挂接钢卷柱状图
- 实现统计数据的Excel导出功能
- 添加响应式设计适配移动端显示
2026-06-30 15:31:35 +08:00
524f8f3333 feat(crm): 新增配卷相关API并重构合同、销售员页面的配卷管理
1.  新增crm/coil.js封装配卷相关接口,包括列表查询和统计汇总
2.  重构合同页面:移除冗余的coilList状态,改用分页API加载生产成果和发货配卷数据,新增分页和统计展示
3.  重构销售员页面:改用独立分页API获取生产成果和计划发货数据,新增分页、加载状态和全局统计
4.  升级CoilTable组件:支持分页功能和双维度统计(本页/全部)
2026-06-30 14:38:58 +08:00
81dec034b3 feat: 多个页面功能优化与新增
1.  异议页面:新增状态为4时的导出PDF按钮,替换原有注释的打印按钮
2.  流程图页面:重构流程图组件,支持多流程切换、节点点击事件,优化主题配置和渲染逻辑
3.  钢卷待领页面:新增钢卷数据修正功能,新增操作列按钮和对应弹窗表单,注释绑定组件
4.  导出PDF弹窗:优化多钢卷数据展示,拆分合并附件排版,优化导出样式和分页逻辑
2026-06-30 11:42:03 +08:00
89773b273b refactor(wms/coil/label): 统一质量状态字段的显示逻辑
将三个标签页组件的质量状态展示逻辑抽离为复用的计算属性,把原始状态码转换为易读的中文描述,A/A+/A-/B/B+/B-统一显示为合格品,其他情况保留原始值
2026-06-30 11:33:39 +08:00
8c7483dced Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-30 10:24:48 +08:00
b93f953327 feat(file): 添加文件管理功能和相关接口
- 新增文件上传、编辑、删除等基础功能
- 实现文件可见范围控制(公开/私有)
- 添加与我相关的文件查询功能
- 集成用户选择组件用于设置文件可见用户
- 实现文件统计展示功能
- 完善文件操作权限验证机制
- 添加文件预览和下载功能
- 优化文件列表分页和搜索功能
2026-06-30 10:24:40 +08:00
15b3d65771 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-30 10:03:44 +08:00
719d012c38 fix(wms/anneal/plan): 给退火计划查询添加入料库筛选条件
在退火计划列表和管控页面的查询参数中,新增固定的退火原料库ID,确保只查询该仓库下的卷数据
2026-06-30 10:03:39 +08:00
29eab97af4 refactor(wms report): 优化产线筛选组件样式与默认值
1. 将产线下拉选择替换为单选按钮组,提升筛选交互体验
2. 设置产线筛选默认值为酸轧线对应编码
3. 新增工序配置工具类与产线元数据工具类,统一管理工序与产线数据
2026-06-30 10:02:49 +08:00
08dec15614 feat(wms-warehouse): 添加钢卷右键领料功能
新增仓库视图右键菜单触发钢卷选择弹窗,支持平面视图和3D视图右键选中钢卷,实现快速领料流程,包含领料弹窗、工序选择和接口调用逻辑
2026-06-30 10:02:27 +08:00
d4b5bc7041 feat(system): 添加文件管理模块及权限控制功能
- 新增文件主信息实体类SysFile,包含文件名、路径、大小等属性
- 创建文件可见用户关联实体SysFileVisibleUser,实现文件权限控制
- 添加文件服务接口ISysFileService和实现类SysFileServiceImpl
- 实现文件可见用户服务接口ISysFileVisibleUserService及其实现
- 创建文件控制器SysFileController,提供文件CRUD操作接口
- 添加文件可见用户控制器SysFileVisibleUserController
- 配置文件和关联表的MyBatis映射及XML配置文件
- 定义文件和关联信息的业务对象BO、视图对象VO类
- 实现文件列表分页查询、详情查看、新增修改删除功能
- 支持文件权限分配给指定用户的多对多关联功能
2026-06-30 10:01:18 +08:00
dbcc28fb80 feat(wms): 新增APS排产对比功能页面
- 添加 compare.vue 页面实现排产明细与现存钢卷对比展示
- 实现左侧排产明细表格按工序筛选功能
- 实现右侧现存钢卷信息展示包括重量统计
- 添加日期查询和汇总统计功能
- 创建 materialCoil API 接口用于获取钢卷数据
- 集成排产明细和钢卷数据的并列对比显示
2026-06-30 09:30:39 +08:00
4a9d811592 feat(wms): 在排产管理中新增工序类型字段
- 在排产单表格中添加工序类型列显示
- 在编辑表单中增加工序类型输入字段
- 在合并表单中添加工序类型字段配置
- 在后端实体类SchProdScheduleItem中新增actionType属性
- 在业务对象SchProdScheduleItemBo中添加actionType字段
- 在查询条件中加入工序类型过滤功能
- 在视图对象SchProdScheduleItemVo中添加工序类型映射
- 更新表单初始化时工序类型数据的处理逻辑
2026-06-30 09:16:52 +08:00
70ade4632e feat(crm): 添加订单项统计功能
- 在CrmOrderItemController中新增三个统计接口:按订单ID、销售员、合同ID统计配卷汇总
- 实现resolveCoilIdsByOrderId、resolveCoilIdsBySalesman、resolveCoilIdsByContractId辅助方法
- 重构queryCoilsByOrderId、queryCoilsBySalesman、queryCoilsByContractIdPaginated方法逻辑
- 新增queryCoilsByOrderIdStatistics、queryCoilsBySalesmanStatistics、queryCoilsByContractIdStatistics统计方法
- 添加emptyStatistics私有方法返回默认统计值
- 在WmsDeliveryWaybillDetailController中新增按负责人统计已发货钢卷汇总接口
2026-06-29 17:19:28 +08:00
bc7b9d2454 feat(crm): 订单项控制器添加分页功能并新增销售员和合同查询接口
- 将getCoilsByOrderId方法改为分页查询,返回TableDataInfo格式
- 新增getCoilsBySalesman接口,支持按销售员查询生产成果钢卷列表
- 新增getCoilsByContractIdPaginated接口,支持按合同ID分页查询生产成果
- 更新前端API调用适配分页参数传递
- 修改listOrderPackaging接口支持分页查询
- 更新相关Vue组件适配新的分页数据结构返回格式
2026-06-29 17:08:24 +08:00
jhd
272b29e54a Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-29 16:50:20 +08:00
jhd
afd4165007 电子请购单优化 2026-06-29 16:48:37 +08:00
ee376f922f feat(aps): 新增排产单明细合并功能及优化界面展示
- 在排产单明细表格中添加多选合并功能
- 实现排产单明细合并对话框及合并逻辑
- 优化排产单明细表格列配置和表单布局
- 添加合并校验和接收产需单API接口
- 重构订单绑定解绑逻辑提升用户体验
- 添加ScheduleDetailCoilBind组件引入
2026-06-29 16:07:29 +08:00
da01bfaa48 feat: 完成售后投诉流程全链路优化与功能完善
本次提交完成了多项核心优化与功能新增:
1.  重构投诉受理流程状态,移除冗余的执行反馈阶段,简化为4个流程节点
2.  新增售后单关联客户、下游用户、工程信息等扩展字段,完善基础信息采集
3.  新增部门结构化意见表单与预览组件,优化部门意见填写与展示流程
4.  新增售后意见汇总页面,支持流程阶段筛选与详情查看
5.  优化合同列表页面,新增重置筛选按钮与默认备注逻辑
6.  新增PDF导出功能,完善钢卷信息展示列
7.  修复逻辑删除级联问题,新增任务过滤逻辑保障数据一致性
2026-06-29 14:58:24 +08:00
9484b64de7 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-29 14:56:28 +08:00
jhd
6af45432b6 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-29 14:50:09 +08:00
jhd
bc46976b74 电子请购单sql 2026-06-29 14:40:38 +08:00
jhd
6a4775a1e4 电子请购单 2026-06-29 14:33:24 +08:00
jhd
356d7e9496 电子请购单 2026-06-29 14:33:10 +08:00
19cfcf0d71 style(attendance): 优化考勤页面时间展示和默认日期范围
1.  调整考勤同步页面的创建时间展示格式,补充时分秒信息
2.  修改考勤异常页面的默认日期范围,改为昨日至当前时间
2026-06-29 10:50:01 +08:00
487175e59c Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-29 10:23:40 +08:00
78410b13b7 refactor(wms/aps): 重构排产和订单页面布局与渲染逻辑
1. 优化aps/order.vue页面代码缩进与标签换行格式,统一代码风格
2. 将aps/schedule.vue的折叠表格改为自定义卡片式列表,移除原el-table展开行逻辑
3. 重构排产页面的明细展示、信息展示结构,新增状态标签样式与列表样式
4. 清理冗余的展开行相关状态和构建逻辑,简化页面交互逻辑
2026-06-29 10:23:36 +08:00
8c7cce90ba 修复采购和集成酸轧细节 2026-06-29 10:18:26 +08:00
59dad19296 feat(cost): 新增成本综合页的异常分析功能
1. 新增异常分析弹窗组件AnomalyAnalysis,支持基于3σ法则检测异常数据
2. 在综合成本页面右上角添加异常分析入口按钮
3. 为异常单元格添加红色高亮样式,标记异常数据
4. 实现异常数据的接收、存储和表格标记逻辑
2026-06-27 17:58:19 +08:00
dbea29eb23 feat(cost): 添加成本明细和指标结果的日期范围查询功能
- 在 CostProdDetailBo 中新增 detailDateStart 和 detailDateEnd 字段
- 在 CostProdMetricResultBo 中新增 metricDateStart 和 metricDateEnd 字段
- 在 CostProdDetailServiceImpl 中实现日期范围查询逻辑
- 在 CostProdMetricResultServiceImpl 中实现日期范围查询逻辑
- 为新字段添加日期格式化注解支持
- 实现 between 查询条件用于日期范围过滤
2026-06-27 16:36:19 +08:00
fabad206c7 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-27 16:13:32 +08:00
726799ae94 refactor(wms/coil/trace): 重构钢卷追溯页面布局与数据逻辑
将原单列表格拆分为当前/已发货/历史/未入库四栏2x2网格布局,并行请求四类钢卷数据优化加载效率,简化搜索和重置逻辑
2026-06-27 16:13:26 +08:00
9b0e3f4238 feat(purchaseDelivery): 添加数量列到采购交货表格
- 在采购交货详情表格中新增数量列
- 数量列右对齐显示
- 设置列最小宽度为58px
2026-06-27 15:55:00 +08:00
8d2cde4aad refactor(erp): 移除采购交货单中冗余的数量和件数列
- 移除主表中的数量列显示
- 移除子表中的件数列显示
- 优化表格布局结构
- 简化数据展示逻辑
2026-06-27 15:51:30 +08:00
2802972df2 fix(excel): 解决合并单元格数据导入异常问题
- 引入 StringUtils 处理各种空白字符和占位符
- 修改数量和件数字段从 BigDecimal/Integer 改为 String 类型读取
- 在 Service 层添加 parseDecimal 和 parseInteger 方法处理数值转换
- 优化异常处理逻辑,支持合并单元格中的点号、横线等占位符
- 更新注释说明合并单元格的数据处理方式变更
2026-06-27 15:36:45 +08:00
e326d8df0b Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-27 15:03:22 +08:00
f70b446282 完善单元格合并逻辑 2026-06-27 15:03:17 +08:00
321d03b192 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-27 14:38:36 +08:00
3d5c0a7281 feat(wms盘库): 完成多项功能升级与体验优化
1. 新增仓库选择组件多选支持,适配批量库区操作
2. 售后单新增自动生成编号与当前日期填充
3. 盘点计划新增流程审批操作按钮,支持驳回与审批通过
4. 优化库区绑定页面,支持编辑删除已绑定库区
5. 替换人员选择为可搜索下拉框,支持多选参与人
6. 新增驳回审批弹窗,提供快捷驳回理由
7. 优化表单提交逻辑,适配多库区数据格式
2026-06-27 14:38:33 +08:00
c1f4417d3c Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-27 14:14:28 +08:00
88d2d864b2 refactor(inventory): 修改盘点计划仓库字段类型支持多库区
- 将 warehouseId 字段从 Long 类型改为 String 类型,支持逗号分隔的多个库区ID
- 将 actualWarehouseId 字段从 Long 类型改为 String 类型,支持逗号分隔的多个实际库区ID
- 更新实体类、业务对象、视图对象中的字段类型定义
- 修改数据库映射文件中的字段映射关系
- 调整查询条件构造逻辑,使用模糊匹配替代精确匹配
- 更新字段注释说明多库区支持功能
2026-06-27 14:11:33 +08:00
fa333ff557 完善单元格合并逻辑 2026-06-27 14:10:56 +08:00
5a3759b502 feat(log): 添加实际库区IDs多值查询功能
- 在WmsCoilWarehouseOperationLogBo中新增actualWarehouseIds字段用于存储逗号分隔的库区ID
- 集成StringUtils工具类支持字符串判空处理
- 实现actualWarehouseId与actualWarehouseIds的统一查询逻辑
- 支持单值和多值库区ID的同时检索
- 添加数字格式验证避免解析异常
- 使用distinct去重确保查询条件的准确性
2026-06-27 13:59:56 +08:00
601d8c751f Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-27 13:56:56 +08:00
09d2fb2dfc feat(WmsMaterialCoil): 添加实际库区IDs多值查询支持
- 新增 actualWarehouseIds 字段用于支持逗号分隔的多个库区ID查询
- 统一处理 actualWarehouseId 与 actualWarehouseIds 的查询逻辑
- 实现多值库区ID解析和层级展开功能
- 支持 -1 空库区条件与正常库区ID的组合查询
- 优化查询条件构建,支持 NULL 和 IN 条件的联合查询
2026-06-27 13:56:45 +08:00
3658728acd feat(menu): 新增菜单自定义样式配置功能
1. 新增菜单样式表单字段,支持传入JSON格式自定义菜单样式
2. 改造侧边栏组件,实现菜单样式的动态绑定与渲染
3. 添加路由元信息style字段的解析与调试日志
4. 修复侧边栏菜单默认样式冲突问题
2026-06-27 13:12:33 +08:00
b94b7823e5 refactor(盘库流程): 重构盘库流程页面与组件,完善排产明细功能
1.  重构盘库流程的步骤与状态映射,调整流程节点顺序与名称
2.  拆分通用盘库详情组件PlanDetailPanel,复用各流程页面
3.  新增计划审批、盘库执行页面,完善差异审批页面
4.  为排产单明细添加增删改查API与前端操作功能
5.  为排产日期添加格式化注解,完善参数接收格式
2026-06-27 11:15:13 +08:00
097d45b420 Merge remote-tracking branch 'origin/feat/erp-purchase-plan' into 0.8.X 2026-06-27 10:44:53 +08:00
66d2b33db5 新增采购 2026-06-27 10:40:54 +08:00
c29f074eae feat(menu): 添加菜单样式属性支持
- 在 SysMenu 实体类中新增 style 字段用于存储菜单样式
- 在 MetaVo 类中添加 style 属性以传递样式信息
- 更新 SysMenuMapper.xml 映射文件中的字段映射和查询语句
- 修改 SysMenuServiceImpl 中的路由构建逻辑以设置菜单样式
- 为不同类型的菜单路由节点添加样式属性的赋值处理
2026-06-27 10:33:28 +08:00
b246a2fac7 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-26 17:49:34 +08:00
aefee3debb feat(schProdScheduleItem): 添加排产单主加明细合并功能
- 新增 SchProdScheduleItemMergeBo 合并请求对象
- 在 ISchProdScheduleItemService 中添加 mergeByBo 方法定义
- 在 SchProdScheduleItemController 中添加 merge 接口
- 在 SchProdScheduleItemServiceImpl 中实现合并逻辑
- 支持先删除被合并记录再插入合并后新记录的功能
- 使用事务确保合并操作的数据一致性
2026-06-26 17:49:26 +08:00
bb568bf1d8 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-26 17:46:58 +08:00
5f523158c1 feat(wms/coil/label): 新增拉矫和双机架原料标签打印功能
新增LajiaoRawTag和ShuangRawTag两个原料标签组件,分别适配拉矫卷和双机架原料卷的打印需求,同时根据仓库ID自动匹配对应的标签类型,完善原料标签的适配场景。
2026-06-26 17:46:54 +08:00
6ebae7fb60 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-26 16:33:37 +08:00
7e028da213 feat(schProdScheduleItem): 添加批量新增排产单主加明细可合并功能
- 在服务接口中新增insertBatchByBo方法定义
- 在控制器中添加批量新增API端点/batch
- 实现服务层批量插入逻辑,支持多条记录同时插入
- 集成日志记录和重复提交防护机制
- 实现批量插入后的ID回填功能
2026-06-26 16:33:29 +08:00
8fa1f0a20b Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-26 15:41:24 +08:00
39eaab139e feat: 新增盘库管理全流程功能模块
1.  新增批量新增盘库差异记录API
2.  新增盘库Excel对比工具函数
3.  新增盘库申请页面与库区明细组件
4.  优化流程图页面,新增流程图下载功能
5.  重构盘库主页面流程状态与操作逻辑
6.  新增多组件拆分与页面模块化改造
2026-06-26 15:41:21 +08:00
174cd29280 feat(flow): 添加排产单主加明细可合并功能模块
- 创建排产单主加明细可合并的实体类 SchProdScheduleItem
- 定义业务对象 SchProdScheduleItemBo 和视图对象 SchProdScheduleItemVo
- 实现排产单主加明细可合并的服务接口 ISchProdScheduleItemService
- 开发控制器 SchProdScheduleItemController 提供 CRUD 操作接口
- 配置 MyBatis 映射器 SchProdScheduleItemMapper 和 XML 映射文件
- 实现服务层业务逻辑 SchProdScheduleItemServiceImpl
- 添加分页查询、新增、修改、删除等核心功能
- 集成 Excel 导出功能支持数据导出操作
2026-06-26 14:14:23 +08:00
dc47a91d0f Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-26 11:44:03 +08:00
97c9a3741a refactor(wms/coil): 优化卷号匹配与表格布局,调整功能按钮权限
1.  修复卷号匹配字段名不统一问题,将encoilid改为coilId适配新逻辑
2.  调整CoilSelector的列名从镀铬卷号改为工序卷号
3.  调整base.vue表格列位置与注释代码,新增correctButton参数控制数据修正按钮
4.  在ship.vue中传入correctButton参数,优化发货页面功能
2026-06-26 11:43:52 +08:00
40c2f83589 docs(domain): 更新镀铬卷号字段为工序卷号
- 修改 WmsMaterialCoil 实体类中的字段注释
- 更新 WmsMaterialCoilAllExportVo 导出视图对象的 Excel 属性标注
- 修改 WmsMaterialCoilBo 业务对象的字段注释
- 更新控制器中列名映射的中文描述
- 修改 WmsMaterialCoilExportVo 导出视图对象的注释和 Excel 属性
- 更新 MyBatis 映射文件中的 SQL 注释
- 修改服务实现类中的查询条件注释
- 更新 WmsMaterialCoilVo 视图对象的字段注释
2026-06-26 11:05:12 +08:00
230b18eee6 feat(wms): 添加材料卷厚度差计算功能
- 在WmsMaterialCoilAllExportVo中新增厚度差字段
- 在导出列配置中添加厚度差映射
- 实现厚度差计算逻辑:理论厚度减去实际厚度
- 添加数字格式异常处理避免程序崩溃
- 支持厚度差数据的Excel导出功能
2026-06-26 11:00:14 +08:00
238e0d2963 feat(WmsMaterialCoil): 自定义报表导出完善
- 在 WmsMaterialCoilAllExportVo 中新增理论厚度、排产厚度、理论长度、镀铬卷号、实测长度和实测宽度字段
- 在 WmsMaterialCoilExportVo 中新增实测长度和实测宽度字段
- 在控制器中为导出功能添加实测长度和实测宽度列配置
- 在数据库映射文件中添加 actual_length 和 actual_width 字段查询映射
2026-06-26 09:48:37 +08:00
395700b8d6 refactor(wms/report): 调整物理属性列展示字段
分别在入库报表页面和报表模板页面,补充实际长度、实际宽度字段到物理属性分组中,优化报表展示内容
2026-06-26 09:45:42 +08:00
c20965406f feat(wms/coil): 酸轧自动填写冷卷号,自动填写最优项 2026-06-26 09:29:59 +08:00
b3dbdaef58 Merge remote-tracking branch 'origin/feat/erp-purchase-plan' into 0.8.X 2026-06-25 17:08:24 +08:00
ce3998db74 feat(erp): 采购计划/采购审核/到货跟踪 + 供应商管理
- 采购计划:选合同自动带出明细、合同/供应商表格选择器、批量填充(可生成N行)、卷号/数量列、送审/重新送审流程
- 采购审核:通过/驳回 + 申请意见,每次审核留痕(erp_purchase_plan_audit_log),计划详情展示审核历史/驳回理由
- 到货跟踪:上传到货Excel按牌号+规格回填明细到货量与状态,列校验/kg→t纠正,满额自动归档
- 供应商管理页(复用既有 erp_supplier 后端)
- 综合搜索(计划号/供货商/合同号)、左右分栏工作台、全局表单按钮对齐修复
- 清理无用旧 erp 页面(看板/需求/订单/收货/退货/汇总)
- DDL 与菜单脚本:docs/purchase-plan-ddl.sql(按 path 解析父目录、可重复执行)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 16:53:21 +08:00
d627a72aea refactor(cost views): 统一调整数值格式化精度为两位小数
修改了三个成本相关页面的数值格式化逻辑:
1.  energy.vue和assised.vue的formatNum方法,将保留小数位数从4位改为2位
2.  comprehensive.vue的多位置数值处理逻辑,统一将计算结果格式化为两位小数
2026-06-25 16:08:02 +08:00
16ba2dfa18 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-25 15:44:28 +08:00
289555fd44 feat(aps): 新增APS排产管理模块完整功能
本次提交完成APS(高级计划与排程)模块的全量开发:
1.  新增CRM订单相关API接口,包含列表、详情、明细查询
2.  新增产需单相关CRUD API与页面,支持排产单管理与订单绑定
3.  新增按日期查询排产单、订单下钻详情页面
4.  为排产单实体类添加日期格式化注解,修复参数绑定问题
5.  统一封装APS模块主题样式,提供通用混入与变量
6.  实现产需单与销售订单的绑定解绑、明细自动生成功能
2026-06-25 15:44:26 +08:00
1c0b0da99e feat(wms): 退火计划选择合同提前
- 在退火计划表格中添加合同号选择功能,支持远程搜索和下拉选择
- 更新数据库表结构,在wms_furnace_plan_coil表中新增contract_id字段
- 修改后端实体类将contractNo改为contractId,并更新相关映射配置
- 调整前端页面布局,将左右两列比例从12:12调整为10:14
- 优化退火完成验证逻辑,要求所有钢卷必须绑定合同后才能完成操作
- 修复材料网格布局样式,改为固定2列显示
- 添加订单列表加载和搜索功能,支持按关键词过滤
- 更新完成退火对话框提示文案,明确合同绑定要求
2026-06-25 15:04:41 +08:00
7e9caf9bb7 feat(flow): 添加生产排程关联CRM订单功能
- 在生产排程VO中新增orderList字段存储关联的CRM订单列表
- 实现fillOrderList方法批量填充CRM订单数据
- 通过sch_sale_schedule_rel关联表建立排程与订单的关系
- 添加ICrmOrderService依赖注入以查询订单信息
- 在查询排程详情时自动加载相关联的CRM订单数据
- 配置klp-crm模块依赖以支持跨模块服务调用
2026-06-25 13:41:48 +08:00
86200d189d feat(schProdSchedule): 实现排产单主表与明细表的关联查询功能
- 在SchProdScheduleDetailVo中添加schedule字段用于关联主表信息
- 在SchProdScheduleVo中添加detailList字段用于关联明细列表
- 实现fillSchedule方法批量填充排产单明细中的主表信息
- 实现fillDetailList方法批量填充排产单主表中的明细列表
- 修改queryById、queryPageList、queryList方法以支持关联数据查询
- 添加必要的依赖注入和工具类导入
2026-06-25 13:23:30 +08:00
3277610ff7 feat(WmsMaterialCoil): 添加排除已绑定排产明细钢卷功能
- 在 WmsMaterialCoilBo 中新增 excludeScheduledDetail 字段
- 实现排产明细绑定钢卷的查询过滤逻辑
- 防止钢卷重复绑定到多个排产单
- 通过子查询优化排产明细关联查询性能
2026-06-25 13:18:50 +08:00
143853a87d feat(flow): 添加排产明细钢卷关系管理功能
- 创建排产明细钢卷关系实体类 SchDetailCoilRel
- 定义业务对象 SchDetailCoilRelBo 和视图对象 SchDetailCoilRelVo
- 实现排产明细钢卷关系服务接口 ISchDetailCoilRelService
- 开发控制器 SchDetailCoilRelController 提供 REST API
- 创建数据访问层 SchDetailCoilRelMapper 和 XML 映射文件
- 实现服务层业务逻辑 SchDetailCoilRelServiceImpl
- 集成分页查询、新增、修改、删除等基础操作
- 添加 Excel 导出功能和数据验证机制
2026-06-25 11:34:56 +08:00
47931b75ae Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-25 11:08:35 +08:00
e084e56841 feat(WmsFurnacePlanCoil): 退火添加合同号字段支持
- 在 WmsFurnacePlanCoil 实体类中新增 contractNo 字段
- 在 WmsFurnacePlanCoilBo 业务对象中添加 contractNo 属性
- 更新 MyBatis 映射文件,添加 contract_no 字段映射
- 在服务层查询逻辑中加入合同号条件过滤
- 在 WmsFurnacePlanCoilVo 视图对象中添加合同号 Excel 导出支持
2026-06-25 11:07:00 +08:00
a9b4d5ddd6 feat: 新增盘库和维修计划初版 2026-06-25 10:53:27 +08:00
e994afb97f feat: 新增顶部菜单切换、菜单复制新增功能并优化侧边栏渲染
1.  新增顶部菜单选择器,支持切换顶级菜单并动态渲染对应侧边栏
2.  菜单管理页面添加复制新增按钮,可基于现有菜单快速创建新菜单
3.  重构侧边栏路由逻辑,支持自动匹配当前页面所属顶级菜单
4.  在vuex中新增顶部菜单状态管理,持久化激活的顶级菜单
2026-06-25 10:52:46 +08:00
24030dd93f feat(wms/delivery/waybill): 新增运单列表页面的orderId字段传递
将接口返回的orderId字段加入到列表行数据中,方便后续页面使用该参数
2026-06-25 09:04:47 +08:00
a4f8ecb48b feat: 新增多项功能并优化多个页面交互
1. 新增批量修改钢卷合同接口与合同批量转单功能
2. 优化KLPTable多选列默认位置与物料预警查询交互
3. 升级CoilTable支持多选与自定义操作栏
4. 新增菜单导出功能
5. 优化钢卷面板列宽与操作按钮文案
2026-06-24 17:51:14 +08:00
fa84bae4f2 feat(wmsCoilContractRel): 添加批量修改钢卷合同关联功能
- 在服务层接口中新增 batchUpdateContractId 方法定义
- 在控制器中添加 /batchUpdateContract 接口支持批量合同修改
- 实现批量更新逻辑,包括钢卷存在性校验和合同ID更新
- 添加缺失钢卷验证并抛出相应业务异常
- 更新后同步钢卷业务员信息
- 使用事务确保数据一致性
2026-06-24 17:34:03 +08:00
13f83a56b6 feat(inventory): 添加盘库差异记录批量新增功能
- 在服务层接口中添加批量新增方法定义
- 在控制器中实现批量新增API端点
- 在服务实现类中添加批量新增业务逻辑
- 添加请求参数验证和空值检查
- 使用BeanUtil工具进行对象转换
- 集成基础映射器的批量插入功能
2026-06-24 17:12:26 +08:00
c7b899735f feat(inventory): 添加盘库计划关联库区列表查询功能
- 在 InvCountPlanServiceImpl 中新增 warehouseMapper 依赖注入
- 修改 queryPageList 方法以联查盘库计划关联的库区列表
- 修改 queryList 方法以联查盘库计划关联的库区列表
- 新增 setWarehouseList 方法实现批量设置库区列表逻辑
- 在 InvCountPlanVo 中新增 warehouseList 字段存储库区列表
- 更新 .gitignore 文件添加 *.toml 忽略规则
2026-06-24 16:51:22 +08:00
fc537a1aa6 refactor(售后工单页面): 全面优化页面UI与功能体验
1.  api层优化:新增驳回接口,优化提交接口过滤无用参数
2.  页面重构:统一页面布局为左右分栏拖拽面板,替换原有弹窗模式
3.  样式升级:采用类Word文档风格重构所有页面样式,新增中英双语标题
4.  功能新增:添加流程总览组件,新增PDF导出功能,新增驳回操作
5.  交互优化:调整卡片布局与间距,优化空状态提示,统一标签样式
2026-06-24 14:59:23 +08:00
8d2d22de50 fix(crm/contract): 修复产品选择组件只读逻辑并优化数据源
1. 将产品名称和材质选择框的readonly属性替换为disabled,修复禁用状态下仍可编辑的问题
2. 注释原有硬编码的产品和材质选项,改为通过字典contract_product_material动态获取
3. 新增字典数据转换逻辑,生成动态的产品选项和材质选项列表
4. 新增材质默认空值处理逻辑,避免未赋值时的异常
2026-06-24 14:46:33 +08:00
7eda414846 refactor(wms/delivery/waybill): 替换订单编号手动输入为下拉选择组件
重构运单页面的订单编号选择模块,将原有的自动补全输入框+弹窗选择的方式改为远程搜索下拉选择器,移除冗余的订单选择对话框、绑定解绑切换相关逻辑,优化代码结构并统一订单数据处理流程
2026-06-24 13:30:17 +08:00
74f7866986 fix(flow): 查询代办任务和执行反馈时过滤已驳回记录
- 在查询投诉任务列表时添加驳回标记条件
- 在查询计划执行关联列表时添加驳回标记条件
- 确保只统计未被驳回的任务和执行反馈记录
- 修复了已完成状态判断逻辑中的数据过滤问题
2026-06-23 17:54:25 +08:00
499d9c5611 feat(flow): 添加投诉处理驳回功能
- 在ITsComplaintAcceptService接口中新增opinionReject和feedbackReject方法
- 在TsComplaintAcceptController控制器中添加意见驳回和反馈驳回的REST端点
- 实现TsComplaintAcceptServiceImpl中的驳回业务逻辑,包括状态更新和标记设置
- 为TsComplaintTask和TsPlanExecuteRel实体类添加rejectMark字段
- 更新相关BO、VO类和XML映射文件以支持驳回标记字段
- 实现驳回时对当前记录和其他关联记录的状态更新机制
2026-06-23 17:34:39 +08:00
6cf855b004 fix(wms/coil/report): 修复并优化报表与钢卷面板功能
1.  钢卷列表新增发货业务员列与绑定负责人显示
2.  修复异常弹窗标签空格格式问题
3.  替换报表旧接口为listForPeriodComparison
4.  新增lossCoilIds变量优化盘亏数据获取逻辑
5.  优化导出功能的线圈ID获取方式
2026-06-23 16:24:34 +08:00
9fd96c3cf5 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-23 14:35:48 +08:00
6265292cbb refactor(wms/post): 优化售后与流程页面功能
1. 调整售后列表页拖拽面板初始尺寸与标题
2. 新增部门参数传递与处理逻辑到售后相关页面
3. 移除售后意见页的部门切换 tabs 相关代码
4. 新增盘库、排产、设备维修流程文档
2026-06-23 14:35:45 +08:00
2490f487fd feat(wms/coil/label): 新增退火原料标签组件并调整标签逻辑
拆分退火原料库和脱脂原料库的标签逻辑,新增退火原料专用标签组件,调整仓库对应的标签类型映射规则
2026-06-23 14:35:35 +08:00
25b4dfe006 refactor(sub-nav,redirect-menu): 重构路由路径处理,支持传递query参数
统一在SubNav和redirectMenu组件中处理路由的完整路径,支持解析字符串格式的query参数,将其转换为对象格式存入_fullPath字段,保留原有的路径处理逻辑
2026-06-23 14:35:22 +08:00
faaa5b1b75 feat(flow): 添加排产单管理功能模块
- 创建排产单主实体类、业务对象和视图对象
- 创建排产单明细实体类、业务对象和视图对象
- 实现排产单主和明细的服务层接口及实现类
- 添加排产单主和明细的数据访问层映射器
- 配置MyBatis映射XML文件
- 实现排产单主和明细的控制器REST接口
- 添加分页查询、新增、修改、删除等基本操作功能
- 集成Excel导出功能
- 添加数据验证和业务逻辑处理
2026-06-23 13:52:30 +08:00
1f16c984a8 fix(wms/coil/label-render): 调整标签字号计算逻辑并更新原料库判断
1. 统一修正四个标签组件的订单单位字号计算规则,将判断阈值从<10改为<=9,同时调整字号计算基数
2. 更新脱脂原料标签的适用仓库,新增退火原料库和罩式退火纵剪分条原料库
2026-06-23 13:28:11 +08:00
41557c606b feat(flow): 添加设备维保功能模块
- 创建维修计划主对象 EqpMaintenancePlan 及其 BO、VO、Mapper、Service 和 Controller
- 实现维修计划明细对象 EqpMaintenancePlanDetail 的完整 CRUD 操作功能
- 开发维修计划-异常记录关联对象 EqpMaintenancePlanAbnormal 的业务逻辑
- 集成分页查询、导出、新增、修改、删除等标准业务操作接口
- 配置 MyBatis-Plus 映射文件和数据校验规则
- 实现 Excel 导入导出功能和数据字典转换处理
2026-06-23 11:26:42 +08:00
a8435a3716 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-23 10:05:00 +08:00
01128d293e feat(wms): 所有的list接口增加原料厚度以及导出增加原料厚度
- 在 WmsMaterialCoilAllExportVo 和 WmsMaterialCoilExportVo 中新增原料厚度字段
- 更新控制器中的列配置映射,添加原料厚度显示
- 实现批量查询热轧卷板原料厚度映射功能
- 重构原料厚度填充逻辑为通用方法,支持多种 VO 类型
- 在多个导出功能中集成原料厚度数据回填
- 更新 .gitignore 添加 *.json 文件忽略规则
- 优化数据库查询性能,减少重复查询操作
2026-06-23 10:04:51 +08:00
2d008f64ea feat: 新增钢卷相关字段并优化页面功能
1.  在可选列配置中新增合同号、原料厚度字段,调整原料材质字段位置
2.  优化库存预警页面操作按钮权限逻辑,移除多余的状态判断
3.  新增钢卷异常管理弹窗组件,重构异常页面结构
4.  优化报表页面的分页加载和数据展示逻辑
5.  调整表单布局和代码格式,优化用户体验
2026-06-23 09:57:29 +08:00
29d99a4f8d Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-22 18:04:15 +08:00
416202360b feat(material): 添加钢卷原料厚度自动提取功能
- 新增 WmsMaterialCoilMapper.selectRawMaterialThicknessByEnterCoilNos 方法
- 添加 MyBatis 映射查询热轧卷板原料规格
- 在 WmsMaterialCoilServiceImpl 中实现 fillRawMaterialThickness 方法
- 自动从规格字段提取 * 前的数字作为厚度值
- 在 WmsMaterialCoilVo 中新增 rawMaterialThickness 字段
- 分页查询时自动填充原料厚度信息
2026-06-22 18:04:07 +08:00
fd6c568d19 style: 格式化轧辊磨削页面代码,优化排版可读性
将页面内的模板标签、样式代码统一调整为多行缩进规范,合并冗余的单行代码,统一代码书写格式,提升页面代码的可维护性和阅读体验
2026-06-22 17:56:33 +08:00
7efa20dd94 feat(mes): 添加轧辊磨削复核人字段
- 在前端表格中新增复核人列,支持编辑和显示功能
- 在 MesRollGrind 实体类中添加 reviewer 字段
- 在 MesRollGrindBo 和 MesRollGrindVo 中添加 reviewer 字段
- 更新数据库查询映射文件,包含 reviewer 字段的查询
- 初始化新增行时将 reviewer 设置为 undefined
2026-06-22 17:49:14 +08:00
b5a269a37a feat(wms): 优化钢卷库区操作记录吞吐报表统计功能
- 后端新增 statistics 接口聚合图表数据,避免前端遍历计算
- 新增 WmsCoilWarehouseOperationLogStatisticsVo 数据传输对象
- 实现按操作人汇总、按日趋势、汇总指标三个维度的数据查询
- 前端 record 页面集成统计卡片、趋势图、饼图、柱状图展示
- 优化分页逻辑,移除前端全量数据存储和分页计算
- 添加完整的 SQL 统计查询语句支持多维度数据聚合
2026-06-22 17:27:08 +08:00
6436d56ab8 feat(flow): 添加盘库管理相关实体和服务接口
- 创建盘库差异记录实体类InvCountDiscrepancy及对应的BO、VO
- 创建盘库计划主实体类InvCountPlan及对应的BO、VO
- 创建盘库计划-库区关联实体类InvCountPlanWarehouse及对应的BO、VO
- 实现盘库差异记录的增删改查服务接口IInvCountDiscrepancyService
- 实现盘库计划主的增删改查服务接口IInvCountPlanService
- 实现盘库计划-库区关联的服务接口IInvCountPlanWarehouseService
- 添加对应的控制器InvCountDiscrepancyController和InvCountPlanController
- 创建相应的数据库映射文件和XML配置
- 实现服务接口的具体业务逻辑实现类
2026-06-22 16:38:02 +08:00
eda206a4d5 fix(wms/coil/materialWarning): 优化物料告警页面的操作权限和选择逻辑
1. 新增表格行选择校验,仅未处理告警可被选中
2. 给处理、忽略按钮新增未处理状态校验,仅未处理告警显示操作按钮
3. 优化批量处理/忽略逻辑,过滤已处理的选中项并更新提示文案
4. 移除单条处理的确认弹窗逻辑
2026-06-22 14:48:14 +08:00
15703216c3 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-22 14:42:49 +08:00
3e640b4a4d feat: 新增业务员、合同号查询与展示,优化钢卷管理功能
1.  在钢卷相关API中新增对saleName和contractNo字段的过滤逻辑,避免数据覆盖
2.  多个报表页面新增业务员和合同号查询条件
3.  钢卷物料页面重构表单布局,新增生产耗时计算、合同绑定功能
4.  告警页面优化UI展示,新增详情弹窗和备注处理流程
5.  多处代码格式化与注释优化
2026-06-22 14:42:46 +08:00
b5708ea8f0 fix(wms): 修正销售员姓名查询字段
- 将查询条件从 su.nick_name 改为 mc.sale_name
- 修复材料卷销售员姓名模糊查询功能
2026-06-22 13:43:23 +08:00
1167bc117b feat(WmsMaterialCoilController): 添加合同编号字段到自定义导出
- 在控制器中添加合同编号字段映射
- 更新列配置以包含合同编号显示
2026-06-22 13:32:17 +08:00
5f142050a9 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-22 13:25:40 +08:00
26c834780c feat(order): 订单变更时同步更新钢卷的业务员和合同编号
- 在 CrmOrderServiceImpl 中查询旧订单时同时获取原合同编号
- 当销售员或合同编号变更时同步更新关联钢卷的业务员名称和合同编号
- 在 WmsCoilContractRelMapper 中新增批量更新钢卷业务员和合同编号的方法
- 为钢卷相关实体类添加 contractNo 字段支持
- 修改数据库表结构为 wms_material_coil 表添加 contract_no 字段
- 更新钢卷导出功能以包含合同编号字段
- 实现根据合同ID查询业务员和合同编号信息的功能
2026-06-22 13:25:31 +08:00
0fe9bce02a feat: 新增售后异议管理全流程功能
本次提交完成售后异议管理模块的开发,主要包括以下内容:
1. 新增售后异议主页面、待办页面和意见填写页面
2. 新增5个通用业务组件用于页面渲染
3. 新增4个业务API接口文件
4. 优化流程图表单描述、文件列表样式和钢卷信息展示
5. 完善投诉受理单的日期格式化和实体类继承
2026-06-22 13:06:57 +08:00
2e79a5beb0 feat(crm/contract): 优化产品表格表头展示与导出配置功能
1.  将产品表格表头文本拆分为多行显示,优化视觉排版
2.  调整表格列的grid布局宽度适配新的表头样式
3.  新增产品导出列的自定义编辑与重置功能,支持自定义表头文本
4.  重构导出预览的表头生成逻辑,支持动态渲染自定义列名与适配宽度
2026-06-22 13:06:46 +08:00
119b9105c7 fix(TsComplaintAcceptController): 修改反馈下发接口参数处理逻辑
- 添加了java.util.stream.Collectors导入
- 将deptIds参数从List<Long>类型改为String类型
- 实现字符串转Long列表的转换逻辑
- 使用Arrays.stream和map方法解析逗号分隔的部门ID
2026-06-22 10:45:15 +08:00
4aba91abd9 feat(flow): 修改反馈下发功能支持传入部门参数
- 更新 ITsComplaintAcceptService 接口方法 feedbackDispatch,增加 deptIds 参数
- 修改 TsComplaintAcceptController 控制器,调整接口路径并接收部门ID列表参数
- 实现 TsComplaintAcceptServiceImpl 服务类,移除字典查询逻辑改为使用传入的部门ID列表
- 更新反馈下发业务逻辑,直接使用传入的部门ID创建执行反馈记录
- 移除对 flow_coil_objection 字典类型的依赖
- 调整参数验证逻辑,确保接受ID和部门ID列表均不为空
2026-06-22 10:41:59 +08:00
7ec3f49c73 feat(flow): 添加受理单ID批量查询功能并优化任务关联信息展示
- 在TsComplaintAcceptBo中新增acceptIds字段用于批量查询
- 实现基于受理单ID列表的批量查询条件构建
- 添加工具方法enrichWithAcceptInfo批量填充受理单信息到任务VO
- 为TsComplaintTaskVo和TsPlanExecuteRelVo添加acceptInfo关联字段
- 优化查询逻辑支持实时关联受理单信息展示
2026-06-22 10:12:56 +08:00
1a0a904903 refactor(flow): 优化投诉受理服务中的字典数据查询方式
- 移除对 DictUtils 的依赖
- 引入 ISysDictDataService 接口进行字典数据查询
- 将缓存字典数据改为实时查询数据库
- 统一两个方法中的字典查询逻辑为直接访问 sys_dict_data 表
- 提高字典数据获取的准确性和实时性
2026-06-22 09:28:08 +08:00
de5a82d0a7 refactor(TsComplaintAcceptService): 优化钢卷关联插入逻辑
- 将单条插入改为批量插入以提升性能
- 使用Stream API重构钢卷关联数据构建过程
- 减少了数据库操作次数,提高处理效率
2026-06-21 15:40:25 +08:00
a07ced4b25 feat(flow): 新增投诉受理单关联钢卷功能
- 在TsComplaintAcceptBo中添加coilIds字段用于存储关联的钢卷ID列表
- 新增TsAcceptCoilRel实体类和对应的数据库映射
- 在投诉受理单创建时自动插入钢卷关联记录到ts_accept_coil_rel表
- 实现了批量关联多个钢卷ID的业务逻辑
- 完善了受理单与钢卷之间的多
2026-06-21 15:35:59 +08:00
b939052a88 feat(flow): 添加钢卷关联合同订单信息查询功能
- 引入 WmsCoilContractRelVo 和 WmsCoilContractRelMapper 依赖
- 在 TsAcceptCoilRelServiceImpl 中添加 wmsCoilContractRelMapper 注入
- 修改 enrichWithCoilInfo 方法同时查询钢卷关联的合同/订单信息
- 通过一次 SQL JOIN 查询批量获取钢卷合同关系数据
- 按 coilId 分组合同订单信息并填充到钢卷信息中
- 优化查询性能减少数据库访问次数
2026-06-21 15:11:27 +08:00
c33b27d174 feat(flow): 添加意见下发和反馈下发功能
- 在ITsComplaintAcceptService中新增opinionDispatch和feedbackDispatch方法
- 在TsComplaintAcceptController中添加对应的意见下发和反馈下发接口
- 实现opinionDispatch功能:修改flow_status=2并按字典创建代办任务
- 实现feedbackDispatch功能:修改flow_status=4并按字典创建执行反馈记录
- 调整同步流程状态逻辑,移除重复的状态更新代码
- 新增相关实体类和服务层依赖注入
2026-06-21 14:57:38 +08:00
691c8289dd feat(flow): 添加投诉任务和执行反馈的流程状态同步功能
- 在TsComplaintTaskServiceImpl中新增syncAcceptFlowStatus方法
- 在TsPlanExecuteRelServiceImpl中新增syncAcceptFlowStatus方法
- 添加TsComplaintAcceptMapper依赖注入
- 实现任务状态变更时自动同步受理单流程状态
- 完善部门意见填写和执行反馈的状态判断逻辑
- 添加必要的LambdaUpdateWrapper和相关导入包
2026-06-21 14:46:06 +08:00
ca094574f5 feat(coil): 添加钢卷查询排除已受理功能
- 在 WmsMaterialCoilBo 中新增 excludeAccepted 字段用于控制是否排除已受理钢卷
- 在 WmsMaterialCoilServiceImpl 中实现排除已受理钢卷的查询逻辑
- 防止多个受理单重复绑定同一钢卷的问题
- 通过 NOT EXISTS 子查询优化钢卷查询性能
2026-06-21 14:23:55 +08:00
f068daba0b feat(flow): 添加钢卷信息关联查询功能
- 在pom.xml中添加klp-wms依赖模块
- 引入WmsMaterialCoil和WmsMaterialCoilVo相关类
- 注入WmsMaterialCoilMapper用于钢卷信息查询
- 实现enrichWithCoilInfo方法批量获取钢卷详情
- 优化查询逻辑支持单条和分页查询的钢卷信息填充
- 在TsAcceptCoilRelVo中新增coilInfo字段存储钢卷信息
2026-06-21 14:15:54 +08:00
0c05455ae3 feat: 新增业务员列并调整部分表格列宽,注释操作记录标签页
1. 在CoilSelector相关数据和报表设置列配置中新增业务员字段
2. 调整逻辑库位、实际库区的表格列宽
3. 注释crm合同页的操作记录标签页
2026-06-21 11:45:56 +08:00
274671f309 feat(wms): 新增钢卷合同号自动填充功能
1. 在钢卷合并、分卷、打钢印、计划拆分、退火计划页面添加合同号自动拉取逻辑
2. 优化合同选择组件,补全不存在于列表的已选合同
3. 移除split.vue中冗余的注释代码
2026-06-21 11:32:02 +08:00
b4fba79838 feat(order): 订单销售员变更时同步更新关联钢卷业务员
- 在订单更新逻辑中增加销售员变更检测功能
- 新增数据库方法批量更新关联钢卷的业务员名称
- 实现订单销售员变更时自动同步到相关钢卷记录
- 添加钢卷与合同关联时的业务员同步机制
- 增加修改关联关系时的业务员信息同步处理
- 完善数据一致性保障机制
2026-06-21 10:40:07 +08:00
6910278ba7 feat(wms): 添加业务员相关代码
- 在WmsCoilContractRelMapper中新增selectSalesmanByOrderId方法
- 在WmsCoilContractRelMapper.xml中添加对应的SQL查询语句
- 在WmsMaterialCoilServiceImpl中新增setSaleNameFromContract私有方法
- 在多个钢卷创建场景中调用setSaleNameFromContract方法设置销售员姓名
- 实现了根据合同ID自动获取并设置业务员信息的功能
2026-06-21 10:14:26 +08:00
491eed3dad refactor(ContractSelect): 优化选中合同的加载逻辑
将原有的列表搜索获取选中合同的方式,改为直接调用getOrder接口单个查询,简化代码逻辑并提升查询效率
2026-06-19 13:14:02 +08:00
66838b6c69 feat: 优化合同选择组件与钢卷修正页面功能
1. 重构ContractSelect组件,新增all模式支持远程搜索
2. 修正钢卷修正弹窗布局为两列排版,扩大弹窗宽度
3. 为钢卷修正页面添加合同绑定功能,支持新增/更新合同关联关系
2026-06-19 12:45:07 +08:00
c8c2523fe7 feat(wms): 新增多项功能并优化标签展示逻辑
1. 异常管理页面默认显示继承按钮,新增继承弹窗传参
2. 多标签页优化订货单位展示:移除"有限公司"后缀并自适应字体大小
3. 基础面板新增备注查询条件和表格列展示
4. 流程页面新增节点点击交互和悬停效果
2026-06-19 12:30:18 +08:00
d0afe5eaaf feat(wms/coil): 新增发货单状态筛选视图
1. 在ship.vue页面新增isShipView参数并默认开启
2. 在base面板新增货单状态筛选 radio 组
3. 根据isShipView切换查询逻辑和表格列展示
4. 新增对应统计计数逻辑
2026-06-18 17:00:03 +08:00
7374b810c1 feat(wms/coil/label): 优化多规格标签的订货单位显示适配
1.  修复订货单位截断逻辑,保留完整客户名称
2.  新增根据订货单位长度动态调整字体大小的功能,适配长文本显示
2026-06-18 15:49:24 +08:00
041e5aef0e feat(contract-select): 为合同选择组件添加分页功能并优化搜索逻辑
1.  移除了vis-network依赖包
2.  重构两个合同选择页面的搜索与列表逻辑,移除本地合并合同数据的操作,改为直接使用接口返回数据
3.  为所有合同tab添加分页组件,支持分页查询、搜索重置页码
4.  调整表格高度优化布局,更新搜索触发事件为失焦、回车和清空按钮
5.  新增搜索查询按钮,优化搜索交互体验
2026-06-18 15:39:42 +08:00
6120e87966 feat(wms): 新增仓储售后流程页面,添加beautiful-mermaid依赖
1. 新增wms售后流程可视化页面,支持生产全链路和售后处理两种流程图切换展示
2. 安装beautiful-mermaid依赖并配置到transpileDependencies中
2026-06-18 14:50:51 +08:00
5828dbd133 feat(hrm/meal&employee): 新增员工吃辣偏好字段与就餐统计矩阵
1.  在员工入职/信息页面新增是否吃辣单选表单字段
2.  重构就餐统计模块,替换原有简单统计为吃辣/不吃辣 × 堂食/打包 × 有效/无效的三维交叉统计矩阵
3.  新增员工吃辣偏好映射接口,自动获取员工饮食偏好进行分类统计
2026-06-18 13:50:46 +08:00
ee49fbdcc0 feat: 新增合同配置页面,优化多页面合同关联逻辑
1.  新增crm/contract/selectConfig页面,支持本地配置可选合同列表,区分手动/接口同步来源
2.  优化ContractSelect组件,新增上次选中合同置顶、本地存储选中记录功能
3.  为合卷、分条、退火计划、钢卷编辑页面添加合同必填校验与自动关联逻辑
4.  移除各业务页面冗余的合同关系手动调用代码,统一关联逻辑
2026-06-18 13:49:52 +08:00
7f1a89eb61 feat(furnace-plan): 添加合同ID字段并实现合同关联功能
- 在 WmsFurnacePlanLocationItemBo 中新增 contractId 字段
- 实现合同ID映射关系构建和数据流转
- 移除二维码步骤类型的空值检查条件
- 完成合同信息在退火加工流程中的传递
2026-06-18 13:34:47 +08:00
759bbbed63 feat(wms): 钢卷加工必须绑定合同
- 在 WmsMaterialCoilBo 中新增 contractId 字段
- 添加 IWmsCoilContractRelService 依赖注入
- 实现加工操作必须绑定合同的验证逻辑
- 添加分卷、合卷、单个更新等操作的合同验证
- 实现插入钢卷合同关联记录的功能
- 在各种钢卷操作完成后自动插入合同关联记录
2026-06-18 13:25:16 +08:00
5b0cb314e4 feat(flow): 添加投诉处理流程模块及相关服务接口
- 创建受理单关联钢卷中间表服务接口及实现类
- 添加投诉受理单主服务接口及相应控制器
- 实现各部门投诉代办任务服务功能
- 集成最终方案下发部门及执行反馈服务
- 在员工信息表中新增是否吃辣字段
- 配置klp-flow模块依赖并注册到系统中
2026-06-18 11:19:55 +08:00
2fc4bf4043 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-18 10:39:16 +08:00
2fb5a64124 feat(employee): 添加员工是否吃辣字段支持
- 在 WmsEmployeeInfo 实体类中新增 isSpicyEater 字段
- 在 WmsEmployeeInfoBo 业务对象中添加 isSpicyEater 属性
- 更新 WmsEmployeeInfoMapper.xml 映射文件配置
- 在查询条件中添加 isSpicyEater 过滤逻辑
- 在 WmsEmployeeInfoVo 视图对象中添加 Excel 导出支持
2026-06-18 10:39:00 +08:00
379aa9d44b feat(crm): 优化合同模板管理和订单明细页面功能
1. 合同模板管理:添加选中状态高亮样式,新增当前选中模板状态管理
2. 订单明细页面:
   - 合并搜索框为产品名称/材质统一搜索
   - 重构表格数据结构,拆分合同与产品明细展示
   - 添加批量/单行保存功能,自动计算产品金额字段
   - 优化筛选条件和默认日期范围,调整表格列样式与配置
2026-06-18 10:27:09 +08:00
b4a9a48ae6 refactor(wms/report/split): 统一拆分报表页面模板组件
将所有分条相关报表页面替换为通用ActionTemplate组件,移除冗余的单独模板导入,统一配置报表参数,减少重复代码
2026-06-18 10:27:00 +08:00
41716b3430 feat(wms/coil): 新增钢卷加工链追溯功能并优化成本信息展示
1. 新增钢卷加工链双向追溯API接口getCoilChain
2. 替换原有的递归 lineage 构建逻辑,使用新接口获取完整加工链数据
3. 补充完善工序类型枚举映射,新增修复工序和退火工序
4. 重构加工路径图构建逻辑,使用接口返回的depth字段计算层级
2026-06-18 09:31:32 +08:00
585017873c feat(wms): 添加钢卷加工链追溯功能
- 在IWmsMaterialCoilService中新增queryCoilChain方法实现双向追溯
- 在WmsMaterialCoilController中添加/chain/all/{coilId}接口
- 在WmsMaterialCoilMapper中新增selectByParentCoilIds批量查询方法
- 在Mapper XML中实现FIND_IN_SET匹配逗号分隔的parent_coil_id查询
- 实现完整的双向追溯逻辑:向上追溯祖先向下查找后代支持合卷场景
- 创建CoilChainVo数据传输对象包含追溯结果和节点关系信息
- 实现BFS算法构建完整的加工链父子关系映射和深度计算
2026-06-17 16:49:19 +08:00
605f7b85a1 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-17 15:28:49 +08:00
192a27afbc fix(wms): 修复卷材子记录缺少父级ID关联问题
- 在新增卷材记录时设置parentCoilId字段
- 确保新创建的卷材能够正确关联到原始卷材记录
- 解决了卷材拆分或复制操作后数据关系不完整的问题
2026-06-17 15:28:37 +08:00
768b18c22a feat(cost+wms): 新增生产指标标签功能并优化钢卷成本展示
1. 为生产指标实体、BO、VO新增tags标签字段并完善MyBatis映射
2. 在生产指标查询中添加标签模糊筛选条件
3. 新增生产指标计算结果API接口
4. 优化成本综合页面:支持标签字段的增改查,新增指标结果批量保存逻辑
5. 移除废弃的costDataService文件,重构钢卷详情页成本展示模块,新增加工路径可视化和吨钢成本计算展示
6. 注释并禁用了原有的检验任务相关代码逻辑
2026-06-17 15:09:08 +08:00
3719416cbf fix(cost): 修复报表日期格式化问题
- 修改了报告日期的格式化逻辑,使用 SimpleDateFormat 替代直接字符串拼接
- 确保日期格式统一为 yyyy-MM 格式进行查询匹配
- 避免了可能的日期格式不一致导致的查询错误
2026-06-17 14:40:39 +08:00
791be3e1a5 feat: 新增多类业务功能并优化页面展示
1. 新增钢卷周期对比查询API,增加冷轧卷、花纹板物料类型
2. 优化库存积压统计逻辑,支持成品和原料数据合并计算
3. 新增告警统计功能,实现长度/厚度告警的数量和重量统计
4. 替换岗位管理页面为冷轧厂业务流程泳道图页面
2026-06-17 11:01:47 +08:00
7b7f4b902e feat(cost): 添加生产指标计算结果批量保存功能
- 在CostProdMetricResultBo中新增resultIds和prodMetricResultList字段
- 添加/batch接口支持批量保存生产指标计算结果
- 实现batchSaveWithDelete方法支持先删除再插入操作
- 使用事务注解确保批量操作的数据一致性
- 集成CollUtil工具类处理集合操作
- 完善相关的Service接口定义
2026-06-17 10:11:10 +08:00
c547456108 feat(cost): 添加生产指标计算结果模块
- 创建 CostProdMetricResult 实体类,包含主键、报表ID、指标ID、计算日期、班组、计算值等字段
- 创建 CostProdMetricResultBo 业务对象,用于接收前端参数并进行验证
- 创建 CostProdMetricResultVo 视图对象,用于返回给前端的数据结构
- 实现 CostProdMetricResultController 控制器,提供增删改查和导出功能
- 创建 CostProdMetricResultMapper 数据访问接口,继承 BaseMapperPlus
- 实现 CostProdMetricResultServiceImpl 服务类,处理业务逻辑和数据操作
- 配置 CostProdMetricResultMapper.xml 映射文件,定义结果映射关系
- 添加完整的 CRUD 操作支持,包括分页查询、单条查询、新增、修改、删除和批量导出功能
- 集成 MyBatis-Plus 分页插件和 LambdaQueryWrapper 查询构建器
- 实现数据校验机制和 Excel 导出功能
2026-06-17 09:57:00 +08:00
931fc74ed7 feat(wms): 添加钢卷环比报表功能
- 在 IWmsMaterialCoilService 中新增 queryPeriodComparisonList 方法
- 在 WmsMaterialCoilController 中新增 /listForPeriodComparison 接口
- 在 WmsMaterialCoilMapper 中新增 selectPeriodComparisonList 查询方法
- 修改原 selectPageReportList 为 selectReportList 并调整相关调用
- 新增 WmsMaterialCoilPeriodComparisonVo 数据传输对象
- 添加环比报表专用的 SQL 查询语句,包含实际长度、理论长度、理论厚度字段
2026-06-17 08:21:42 +08:00
e7f1e584eb Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-16 17:02:31 +08:00
b43b44d044 feat(wms): 新增钢卷告警历史批量处理功能
新增批量处理历史告警接口,支持将今天以前的告警标记为指定状态,前端添加对应操作按钮,可一键处理或忽略历史告警
2026-06-16 17:02:25 +08:00
d053dd0319 refactor(domain): 将检验结果值数据类型从BigDecimal改为String
- 修改WmsInspectionDetail实体类中的itemValue字段类型为String
- 修改WmsInspectionDetailBo业务对象中的itemValue字段类型为String
- 修改WmsInspectionDetailVo视图对象中的itemValue字段类型为String
2026-06-16 16:51:33 +08:00
3b1ce45043 feat: 新增钢卷成本信息展示与能耗辅料成本报表页面
1. 在钢卷详情页新增成本信息模块,展示产线类型、投入产出量、报表信息和总成本
2. 新增成本数据服务类,支持按日期和产线获取完整成本明细与计算数据
3. 新增能耗和辅料两类成本报表页面,支持按产线筛选查看报表
4. 优化岗位管理页面,替换vis.js为ECharts实现岗位树图,新增职责弹窗查看功能
5. 优化综合成本页面,隐藏部分反填按钮和操作入口
2026-06-16 16:33:27 +08:00
5473fbf28f feat(wms): 新增岗位管理与岗位职责管理功能
1. 新增依赖包vis-network用于可视化岗位树
2. 新增岗位相关API接口,包含增删改查功能
3. 新增岗位职责相关API接口,包含增删改查功能
4. 新增岗位管理页面,支持岗位树可视化、岗位CRUD以及关联的岗位职责管理
2026-06-16 13:42:12 +08:00
2874f1727a feat(cost): 新增成本综合页面的辅料能耗反填功能
本次提交新增了全量反填、单行反填、单元格反填的批量/单独反填能力,支持辅料和能耗类型的数据反填入库,同时新增了反填进度弹窗、优化了表格列头布局和输入框后缀操作按钮样式,补充了对应的API引入和反填处理器注册逻辑。
2026-06-16 11:52:34 +08:00
a3a4986cb8 feat(wms/report): 新增产线报表页面,支持多维度数据统计与可视化
该页面实现了产线相关的钢卷产出、消耗、品质、异常库位等数据的统计分析,支持按日/周/月维度拆分数据,提供折线图可视化展示与明细表格查询,包含快捷时间范围选择、多条件筛选功能
2026-06-16 11:52:22 +08:00
f525770094 fix(wms/coil): 调整酸洗轧制动作类型区间范围并注释完成待办逻辑
1. 将acidRollingActionType判断区间从200-299修正为200-210
2. 注释掉stepSplit.vue中调用completeAction完成待办的代码逻辑
2026-06-16 11:52:10 +08:00
25beef5517 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-16 11:41:40 +08:00
e6b1e31bd1 feat(wms/coil): 优化钢卷生命周期追踪的步骤插槽数据传递
1. 给CoilTraceResult的stepBody插槽新增allSteps参数传递标准化后的全量步骤列表
2. 在LifecycleTrace中新增getCreationCoils方法,实现创建步骤钢卷列表的兜底获取逻辑:
   - 优先使用步骤自身的newCoilInfoList
   - 若为空则通过全量步骤匹配获取前序步骤的旧钢卷信息
   - 最后兜底使用当前钢卷信息
3. 修复入库步骤空钢卷判断和列表渲染的逻辑
2026-06-16 11:41:33 +08:00
8c3a3eec28 fix(wms): 钢卷退火绑定的限制
- 添加详细的锁定状态描述映射
- 区分不同锁定状态的具体业务场景
- 提供更精确的错误提示信息
- 增强用户体验和问题定位效率
2026-06-16 09:26:25 +08:00
1510f43aee refactor(WmsMaterialCoilService): 简化待操作记录状态更新逻辑
- 使用新的 completeAction 方法替代手动设置状态和时间
- 移除冗余的状态赋值和时间设置代码
- 通过方法调用统一处理操作完成逻辑
2026-06-15 18:06:34 +08:00
cb8fce435c fix(wms): 修复分卷取消操作中的逻辑错误
- 移除过早删除待操作记录的代码
- 保留母卷独占锁释放功能但暂时注释
- 重新调整代码执行顺序确保业务逻辑正确性
- 修复可能导致数据不一致的操作步骤
2026-06-15 17:49:28 +08:00
7bb68483e6 feat(wms): 添加批量处理和批量忽略功能 2026-06-15 16:22:20 +08:00
696280bd47 feat(wms): 添加调拨单按时间倒序排序功能
- 在调拨单查询中增加按调拨时间倒序排序逻辑
- 确保最新的调拨单记录优先显示
- 提升调拨单列表的数据展示体验
2026-06-15 14:26:37 +08:00
bdf01feacb feat(warning): 添加钢卷告警批量处理功能
- 在 IWmsMaterialWarningService 中添加 batchHandle 方法接口
- 在 WmsMaterialWarningBo 中新增 warningIds 字段用于存储 ID 集合
- 在 WmsMaterialWarningController 中添加 /batchHandle 接口
- 在 WmsMaterialWarningServiceImpl 中实现批量处理逻辑
- 更新 Excel 导出标题中的分隔符为中文顿号
- 批量处理时自动填充处理人、处理时间和处理状态信息
2026-06-15 13:55:36 +08:00
120320c800 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-15 13:33:34 +08:00
3db1651efd feat(wms): 添加岗位和岗位职责管理功能
- 创建岗位实体类 WmsPost 和岗位职责实体类 WmsPostDuty
- 实现岗位和岗位职责的业务对象 BO 和视图对象 VO
- 开发岗位和岗位职责的服务接口及实现类
- 添加岗位和岗位职责的控制器提供 REST API 接口
- 配置 MyBatis Plus 的 Mapper 接口和 XML 映射文件
- 实现岗位和岗位职责的增删改查、分页查询和导出功能
- 添加数据验证、日志记录和防止重复提交功能
2026-06-15 13:33:23 +08:00
9d679954fa fix(wms/coil): 修复钢卷领料和合并相关的逻辑问题
1. 新增根据酸洗动作类型设置锁值的逻辑
2. 修复合并页面钢卷选择器的筛选条件和匹配逻辑
2026-06-15 13:21:54 +08:00
a2844ec54a fix(service): 修复钢卷操作中的空指针异常和逻辑错误
- 在 WmsCoilPendingActionServiceImpl 中添加钢卷存在性检查,避免空指针异常
- 当关联钢卷不存在时抛出运行时异常提示"关联的钢卷不存在"
- 修复 WmsMaterialCoilServiceImpl 中的合卷操作逻辑
- 修改条件判断避免整数缓存导致的比较错误
- 合卷操作已在 mergeCoils 方法中单独处理,此处跳过重复操作
2026-06-15 11:48:12 +08:00
91ddc8602a fix(wms): 优化钢卷锁定状态提示信息
- 添加getLockStatusDesc方法用于获取详细的锁定状态描述
- 实现针对不同锁定状态的状态码映射和中文描述
- 更新异常消息显示具体的锁定操作类型而非笼统提示
- 提升用户对钢卷当前操作状态的认知准确性
2026-06-15 11:35:24 +08:00
22fd3c4a58 refactor(WmsMaterialCoilService): 移除钢卷操作权限验证检查
- 注释掉单个更新方法中的独占状态验证逻辑
- 移除批量更新方法中的权限验证检查代码
- 保留原有的注释文档结构
- 简化方法实现逻辑,跳过操作前的状态验证步骤
2026-06-15 11:26:42 +08:00
ceab5d4be3 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-15 11:09:59 +08:00
bf8b69d193 feat(wms): 添加钢卷锁定机制并优化操作流程
- 在WmsCoilPendingActionBo中新增lockValue字段用于钢卷锁值控制
- 为insertByBo方法添加事务注解确保数据一致性
- 实现钢卷领料时的锁状态校验和上锁逻辑
- 添加unlockCoil方法在操作完成后自动解锁关联钢卷
- 在deleteBatch、completeAction和cancelAction方法中集成自动解锁功能
- 新增getLockStatusDesc方法提供详细的锁状态描述信息
- 优化合卷操作流程,使用completeAction替代手动更新状态
- 在MaterialCoilService中增强独占状态检查,支持多种锁定类型识别
2026-06-15 11:09:45 +08:00
7feaf8021b feat: 新增规格校验功能并优化钢卷号输入处理
1. 新增validSpecification规格校验函数,校验格式为数字.两位小数*数字的钢卷规格
2. 为多个页面的钢卷号输入框添加trim修饰符自动去除首尾空格
3. 在API层统一对钢卷号字段做trim预处理
4. 为原料和产品表单添加规格必填校验和格式校验
5. 新增钢卷信息修正页面,添加生产耗时自动计算功能
6. 优化部分页面的UI和代码冗余
2026-06-15 10:56:28 +08:00
6328b4ac7a Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-15 10:04:37 +08:00
183e6d08d8 feat(wms,cost): 新增多项功能并修复部分问题
1. 退火计划页面新增exclusiveStatus状态字段
2. 钢卷分步加工新增预览标签功能
3. 修复实际库位空值判断问题
4. 成本综合页面新增价格管理功能,支持配置指标单价
2026-06-15 10:04:35 +08:00
a037c56122 feat(wms): 完善退火计划钢卷绑定和解绑逻辑
- 添加钢卷映射缓存以提高查询效率
- 增加钢卷排他状态检查防止并发操作冲突
- 实现绑定计划时自动释放实际库区锁定功能
- 优化解绑操作增加数据验证和异常处理
- 修复解绑后钢卷状态更新确保一致性
- 移除冗余的批量释放库区操作提升性能
2026-06-14 12:19:48 +08:00
857daa24af feat(wms): 添加钢卷数据校验逻辑
- 实现钢卷存在性校验,确保钢卷未被删除
- 添加钢卷类型校验,只允许现存钢卷(dataType=1)参与加工
- 阻止历史钢卷被用于退火操作
- 提供详细的错误提示信息
2026-06-14 11:31:10 +08:00
0968dcaded Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-13 16:16:38 +08:00
cced2ff4aa feat(cost): 添加单价字段和使用单价标识功能
- 在CostProdMetric实体类中添加usePrice字段,用于标识是否使用单价
- 更新CostProdMetricBo、CostProdMetricVo数据传输对象,增加单价相关属性
- 修改CostProdMetricMapper.xml映射文件,添加usePrice字段映射配置
- 扩展CostProdMetricServiceImpl查询逻辑,支持按是否使用单价进行筛选
- 更新前端metric.vue页面,添加单价输入框和是否使用单价下拉选择组件
- 实现表格中单价列的显示和编辑功能,并增加条件查询支持
2026-06-13 16:16:30 +08:00
f197462b11 refactor(mes/qc): 重构质检模块接口与页面,迁移is模块业务到qc模块
1.  新增qc模块下检验主、检验明细、拉伸试验相关接口文件
2.  删除原is模块下的检验任务、样品库存、检验委托单接口与页面文件
3.  调整待办页面的检验任务标签页引用路径
4.  优化质检模板页面的检查项相关交互逻辑
2026-06-13 15:51:15 +08:00
9559e5810e refactor(domain): 重构拉伸检验细节实体的弯曲试验
- 将 bendTest90 字段重命名为 bendTest,统一弯曲试验结果字段
- 将 bendTest180 字段重命名为 bendTestReverse,明确表示反向弯曲试验
- 更新数据库映射文件中的字段映射关系
- 修改服务层查询条件中对应的字段引用
- 更新 Excel 导出注解中的字段描述和值映射
2026-06-13 14:34:24 +08:00
92ad229104 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-13 13:30:56 +08:00
ee1cb31321 feat(mes/eqp): 新增设备监控模拟页面
该页面实现了设备状态统计看板、多条件筛选搜索、自动刷新、设备卡片展示、详情弹窗查看功能,使用mock数据模拟真实设备运行状态和参数变化
2026-06-13 13:30:52 +08:00
f0de25a3a2 feat(inspection): 添加检验模块日期范围筛选功能
- 在WmsInspectionMainBo中增加inspectionDateStart和inspectionDateEnd字段用于日期范围筛选
- 在WmsInspectionMainServiceImpl中实现日期范围查询逻辑
- 在WmsInspectionTensileDetailBo中增加productionDateStart、productionDateEnd、testDateStart和testDateEnd字段
- 在WmsInspectionTensileDetailServiceImpl中实现生产日期和试验日期范围查询逻辑
- 添加DateTimeFormat注解支持日期格式化处理
2026-06-13 13:08:11 +08:00
0d40774194 feat(wms): 添加检验管理模块功能
- 新增检验项目明细相关实体类、业务对象、视图对象及服务接口
- 实现检验项目明细的增删改查、分页查询及数据校验功能
- 新增检验主记录相关实体类、业务对象、视图对象及服务接口
- 实现检验主记录的增删改查、分页查询及数据校验功能
- 新增金属材料室温拉伸试验相关实体类、业务对象、视图对象及服务接口
- 实现拉伸试验记录的增删改查、分页查询及数据校验功能
- 配置MyBatis映射文件及Excel导出功能
- 添加相应的控制器及参数验证规则
2026-06-13 13:02:43 +08:00
948e62daae fix(wms/report/comparison): 修复库存对比报表的查询参数错误
将原有的actionId、actionIds查询参数修正为coilId、coilIds,匹配接口实际需要的入参字段
2026-06-13 11:23:36 +08:00
48d12fe056 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-13 11:15:42 +08:00
6edc6e1100 feat(wms-report): 新增对比报表页面和尺寸异常统计功能
1. 新增comparison.vue对比报表页面,支持基期/当期数据对比、快速环比查询、明细表格查看和列配置
2. 在action.vue报表中添加尺寸异常统计模块,统计长度和厚度异常的卷数、总重及占比
3. 新增告警阈值配置获取逻辑,从系统配置中读取长度和厚度异常阈值
2026-06-13 11:15:38 +08:00
12ea9b0b83 refactor(wms/coil/label): 为热卷号添加动态字体大小适配
移除了硬编码的字体样式,根据热卷号长度动态调整字号,避免长文本溢出标签
2026-06-13 11:14:25 +08:00
c149216ebd refactor: 多页面UI优化、接口清理与文案调整
1. 移除质检模板页面未使用的getCheckItem接口导入
2. 给成本综合页面表格添加固定高度适配布局
3. 更新物料告警页面的表格列文案:理论值→推论值、实测值→实际值、实际偏差值→实际偏差
4. 重构重定向菜单页面的样式,优化布局与视觉效果
2026-06-13 11:14:14 +08:00
325a93fd84 refactor: 将“理论长度/厚度”统一改为“推论长度/厚度”
修改了CoilSelector组件、CoilInfo组件和报表列设置中的相关文案,将统一术语表述为“推论”,替代原有的“理论”表述。
2026-06-13 11:13:49 +08:00
f0656b57d4 fix(wms): 解决材料厚度预警中的精度比较问题
- 统一将理论厚度和规格厚度四舍五入到3位小数后再进行比较
- 避免因高精度尾数导致的比较结果与存储值不一致问题
- 对阈值也进行相同的精度处理确保比较逻辑正确
- 修复偏差值计算中重复精度转换的问题
- 优化偏差率计算中的除法精度控制
2026-06-13 10:22:22 +08:00
9c7d2dca65 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-12 16:00:45 +08:00
36b1e3da82 fix(warning): 解决退火工序告警处理问题
- 退火工序没有actionId时不创建代操作记录,直接设置actionType=600
- 当actionId为空时使用bo中的actionType作为兜底方案
- 确保退火工序的告警能够正确关联到对应的操作类型
2026-06-12 16:00:34 +08:00
c83eb79d25 fix(wms/coil/label): 修正标签页生产日期字段的时间来源
将多个标签渲染组件中的生产日期从updateTime改为createTime,统一展示正确的创建时间
2026-06-12 15:30:27 +08:00
e0cf4b46b6 feat(mes/qc): 增加物理性质和化学成分同时导入
新增了通用的综合导入组件,支持同时导入化学成分和物理性能数据,并在理化证书页面添加了对应的综合导入按钮和逻辑,实现一站式批量导入两种类型的质检数据。
2026-06-12 13:43:17 +08:00
00972112d2 feat: 多模块新增功能与优化体验
1. 隐藏客户录入页的客户编码字段
2. 为WmsMaterialWarningBo添加日期格式化注解
3. 合同产品选择时自动匹配默认材质
4. 物料告警页新增今日筛选、行样式区分与偏差率展示优化
5. 合同页新增快速新增客户功能
2026-06-12 13:31:58 +08:00
2559dc27cb feat(crm): 添加客户编码自动生成功能
- 新增 selectMaxCustomerCode 方法查询最大客户编码
- 实现客户编码自动生成逻辑,支持纯数字和带前缀格式
- 添加正则表达式解析编码规则并递增末尾数字
- 集成编码生成功能到客户插入业务流程中
2026-06-12 13:17:33 +08:00
7a0d7e1b12 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-12 13:03:34 +08:00
1cd2cf2b9a feat(wms): 添加物料预警创建时间范围查询功能
- 在WmsMaterialWarningBo中新增createStartTime和createEndTime字段
- 为新增字段添加JSON格式化注解和文档注释
- 在WmsMaterialWarningServiceImpl中实现时间范围查询逻辑
- 使用ge和le条件进行创建时间范围过滤
- 保持按创建时间倒序排列的排序规则
2026-06-12 13:03:25 +08:00
98116fa042 refactor: 多页面UI优化与功能完善
1. 优化合同页面默认备注内容
2. 修复分卷编辑接口参数缺失问题
3. 新增分卷、合卷、加工菜单路由
4. 重构导航栏默认显示逻辑
5. 升级重定向菜单页面样式与布局
6. 优化告警页面查询与展示字段
7. 重构全局搜索组件为弹窗模式
8. 优化报表页面代码格式与接口参数
2026-06-12 11:25:15 +08:00
d3c6790603 refactor(WmsMaterialWarningVo): 继承BaseEntity并移除钢卷信息的JSON忽略注解
- 继承com.klp.common.core.domain.BaseEntity类
- 移除coilVo字段的@JsonIgnore注解
- 更新类结构以支持基础实体功能
2026-06-11 17:23:48 +08:00
c1e3fa5141 fix(wms): 修复钢卷警告检查逻辑
- 注释掉新增钢卷时的长度/厚度偏差检查
- 添加actionId为空判断条件避免警告插入异常
- 优化更新钢卷时的警告检查逻辑
2026-06-11 16:49:15 +08:00
f319308196 refactor(domain): 移除WmsCoilAbnormalExportVo中的废弃字段
- 注释掉parentAbnormalId字段以优化数据结构
- 移除sourceSystem字段减少不必要的数据传输
- 删除processSource字段简化对象属性
- 保留plateSurface字段用于表列宽度设置
- 为后续代码清理和重构做准备
2026-06-11 16:25:06 +08:00
185745b7da Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-11 15:31:26 +08:00
7440706e2e style(sidebar): 优化侧边菜单样式与标识逻辑
1.  移除原有二级菜单叶子节点的小圆点样式
2.  新增子菜单标识图标组件,为有子级的菜单添加折叠箭头标识
3.  调整菜单标题渲染逻辑,统一标题样式处理
4.  修复菜单容器的定位样式问题
2026-06-11 15:31:23 +08:00
0adb29139e 修复厚度偏差曲线 2026-06-11 15:24:46 +08:00
2148a068f8 修复厚度偏差曲线 2026-06-11 15:10:56 +08:00
e1bb9e5431 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-11 15:02:08 +08:00
8b2039f06a 修复厚度偏差曲线 2026-06-11 14:59:31 +08:00
9761faa2d2 feat(wms, crm): 新增导出模式选择并修复canvas图片缩放问题
1. 为Wms异常报表页面新增多行/单行导出切换功能
2. 拆分导出菜单为单行、多行两种导出选项
3. 修复ContractExportDialog中图片缩放比例的冗余限制
2026-06-11 14:49:31 +08:00
d5f00a4b0b Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-11 14:02:52 +08:00
b9fb4b4611 refactor(wms/coil): 重构钢卷详情页面,拆分组件并优化页面结构
1.  将原钢卷详情页面拆分为多个独立组件,按功能模块划分
2.  调整路由指向,将页面入口指向新的页面文件
3.  新增状态工具类,封装通用格式化和样式
2026-06-11 14:02:49 +08:00
7d76ef0c52 feat(wms): 添加异常报表导出功能
- 在WmsMaterialCoilBo中新增abnormalExportCount字段用于控制导出格式
- 实现异常报表的Excel导出功能,支持两种导出模式
- 添加extracted方法处理导出逻辑,构建EasyExcel导出数据
- 创建createExportVo方法组装导出DTO对象,包含钢卷基本信息和异常信息
- 集成EasyExcel实现报表导出,设置响应头和文件下载格式
- 处理无异常信息钢卷的空数据行创建逻辑
2026-06-11 11:49:28 +08:00
ea71a6dd93 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-11 11:39:44 +08:00
b9b6ae7e79 fix(wms): 修复钢卷号重复校验问题
- 添加注释说明子卷与母卷钢卷号冲突的处理逻辑
- 在查询条件中增加exclusiveStatus字段过滤,避免正在处理的数据被误判为重复
- 修复入场钢卷号、当前钢卷号和供应商钢卷号的重复检查逻辑
- 确保历史数据和排他状态数据不会影响重复性校验结果
2026-06-11 11:39:29 +08:00
20a75aec4b Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-11 11:28:57 +08:00
3ad7bf40b5 feat: 新增二级菜单子导航系统(SubNav + redirectMenu)
- 新增 SubNav 组件:Navbar 下方水平子导航条,展示当前二级菜单下的三级页面,支持滚动和下拉分组
- 新增 redirectMenu 页面:点击二级菜单时卡片式展示子页面列表
- SidebarItem 深度 >=1 时改为叶子节点渲染(小圆点标记),激活高亮回退到二级菜单
- Navbar 布局重构为 Flexbox,面包屑/SubNav 根据场景切换
- 新增 productionLine Vuex 模块,轧辊研磨页改为 store 方式读取产线数据
- Sidebar activeMenu 逻辑增强:自动定位当前页所属二级菜单
2026-06-11 11:28:42 +08:00
196e628665 feat(WmsCoilAbnormal): 添加钢卷ID集合批量查询功能
- 在WmsCoilAbnormalBo中新增coilIds字段用于批量查询
- 实现逗号分隔的coilIds批量查询逻辑
- 使用Stream API处理字符串分割和类型转换
- 添加空值过滤确保查询条件的有效性
- 集成到现有的查询条件构建流程中
2026-06-11 10:24:55 +08:00
7c61c42eb5 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-11 09:49:54 +08:00
1223b634b7 refactor(wms): 移除销售人员相关字段
- 从WmsMaterialCoilExportVo中移除saleName私有字段
- 从WmsMaterialCoilVo中移除saleId和saleName私有字段
- 从WmsMaterialCoilMapper.xml的多个查询中移除sale_name映射
- 从WmsMaterialCoilMapper.xml的关联查询中移除sys_user表连接
- 移除与销售人员相关的数据库字段映射和关联关系
2026-06-11 09:49:42 +08:00
87913ba0a0 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-11 09:29:49 +08:00
eab45a8706 feat: 合同新增自动补全交货日期功能
- 签订日期变更时自动计算交货日期(签约 + 1天 + 30天 → 按5日取整)
- 选择合同模板或点击「自动补全交货日期」时自动替换合同内容中的交货时间占位符
- 新增 DC01-H 材质选项
- 修正按钮文案「管理合同」→「管理合同模板」
2026-06-11 09:29:33 +08:00
a9a7a0889e Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-10 17:45:05 +08:00
cd2e4016a6 feat(warning): 添加产线类型字段支持告警功能
- 在 WmsMaterialWarning 实体中新增 actionType 字段
- 在 WmsMaterialWarningBo 和 WmsMaterialWarningVo 中添加 actionType 属性
- 更新 WmsMaterialWarningMapper.xml 映射文件以包含 actionType 字段
- 在 WmsMaterialWarningServiceImpl 中注入 WmsCoilPendingActionMapper
- 实现告警查询时根据产线类型过滤的功能
- 在告警插入前查询并设置对应的产线类型信息
- 完善告警服务中的厚度和长度检查逻辑
2026-06-10 17:44:56 +08:00
87d72b2a0d feat(wms/coil): 增加排产厚度字段
1. 新增排产厚度字段到钢卷信息列表、报表列配置、分条/合并/录入页面
2. 优化部分代码格式与换行,修复多余空格问题
3. 调整表单布局,将排产厚度表单项加入对应页面
2026-06-10 17:22:12 +08:00
4342215c00 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-10 17:11:08 +08:00
7bf7d24f29 feat(wms/coil): 新增异常继承功能并优化钢卷列表页面
1.  为异常管理弹窗添加继承异常按钮和继承弹窗
2.  新增罩式退火原料库选项
3.  优化钢卷列表表格样式与列配置,新增标签预览、打印、数字钢卷、追溯功能
4.  复用生产工序配置常量统一维护
2026-06-10 17:11:05 +08:00
4da8d8d297 feat(wms): 添加排产厚度字段支持
- 在 WmsMaterialCoil 实体类中新增 scheduleThickness 字段
- 在 WmsMaterialCoilBo 业务对象中新增 scheduleThickness 字段
- 在 WmsMaterialCoilController 控制器中添加排产厚度列映射
- 在 WmsMaterialCoilExportVo 导出对象中添加 Excel 导出支持
- 在 WmsMaterialCoilMapper.xml 中添加数据库映射配置
- 在 WmsMaterialCoilServiceImpl 服务实现中添加查询条件支持
- 修复钢卷号重复检查逻辑中的数据类型判断问题
- 在 WmsMaterialCoilVo 视图对象中添加排产厚度字段
2026-06-10 16:49:00 +08:00
c4eab467ee feat(wms): 添加钢卷号重复检查功能
- 在新增钢卷时检查当前钢卷号是否重复
- 在简单更新时检查当前钢卷号是否重复并排除自身
- 在单个更新时检查当前钢卷号是否重复并排除自身
- 在分卷操作时检查每个子钢卷号是否重复
- 在合卷操作时检查新钢卷号是否重复
- 在子钢卷创建时检查子钢卷号是否重复
- 在退货操作时检查当前钢卷号是否重复并排除自身
- 修复历史钢卷恢复时的重复检查参数传递问题
2026-06-10 15:54:01 +08:00
fd50118161 refactor(contract/export/preview): 优化合同打印导出功能,添加页码和修复样式
1.  移除coilTable的异常行高亮逻辑
2.  修复导航栏告警badge的显示逻辑
3.  为合同导出和预览添加页码标注,调整打印样式
4.  移除冗余的合同打印预览代码
2026-06-10 11:29:41 +08:00
cc63aa80b2 fix: 修复/优化多个业务页面的逻辑与配置
1. 修正物料选项中的BX51D+Z为DX51D+Z
2. 给L2匹配面板的标准化方法添加日志与start_date/end_date字段解析
3. 优化卷材页面的日期赋值逻辑并添加调试日志
4. 简化异常表格的图片组件写法,新增继承来源列
2026-06-10 09:21:34 +08:00
c95ea7db61 feat(mes/roll/grind): 磨辊间增加机组字段 2026-06-09 17:55:42 +08:00
f50c240bbe Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-09 17:47:46 +08:00
66278e635b feat(roll): 添加机架字段支持
- 在MesRollInfo实体类中新增frame字段
- 在MesRollInfoBo业务对象中添加frame字段定义
- 实现机架字段的查询过滤功能
- 在MesRollInfoVo视图对象中增加frame字段映射
- 完成机架数据的Excel导出功能
2026-06-09 17:47:35 +08:00
74d0ba57e2 feat(crm/contract): 优化合同产品材质输入与导出样式
1. 将材质输入框改为可搜索创建的选择器,新增冷轧卷(花纹)选项和SPCC等材质选项
2. 优化合同导出表格的边框、内边距和字体样式,统一表格样式
2026-06-09 17:42:28 +08:00
e00d1357b0 refactor(wms): 优化钢卷告警数据查询逻辑解决循环依赖
- 将钢卷信息批量查询逻辑从服务层迁移到控制器层
- 在控制器中实现钢卷ID收集和批量查询功能
- 通过Map映射方式关联钢卷信息到告警数据
- 移除服务层中的WmsMaterialCoilService依赖注入
- 提高数据查询效率和代码结构清晰度
2026-06-09 17:08:01 +08:00
b9f87c6cc4 feat(warning): 添加物料预警按创建时间倒序排序功能
- 实现物料预警列表按创建时间倒序排列
- 优化查询逻辑以支持时间排序功能
2026-06-09 10:04:36 +08:00
7c9c99bf45 feat(wms): 添加钢卷警告信息关联查询功能
- 在 WmsMaterialWarningBo 中新增 coilIds 字段用于批量过滤
- 在 WmsMaterialWarningServiceImpl 中实现批量钢卷信息查询和填充逻辑
- 添加按逗号分隔的钢卷ID集合过滤功能
- 在 WmsMaterialWarningVo 中增加 coilVo 关联字段并设置为忽略导出
- 实现了钢卷警告与钢卷信息的关联显示功能
- 优化了查询性能通过批量获取钢卷数据减少数据库访问次数
2026-06-09 09:58:35 +08:00
fdb13b7261 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-09 09:41:31 +08:00
74a3803290 refactor(WmsMaterialCoilService): 修复理论厚度和长度沿用老数据导致重复告警
- 移除理论厚度为空的条件判断,统一实际长度不为空时进行计算
- 移除理论长度为空的条件判断,改为直接计算并设置理论长度
- 保持原有的体积、宽度和厚度计算公式不变
- 简化代码结构,减少不必要的条件分支
2026-06-09 09:41:14 +08:00
76497eece7 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-09 09:02:47 +08:00
d231d3619a feat(wms/report): add length/thickness diff columns and abnormal alert
1. 调整产品内容工具函数,移除冗余的quantity和taxPrice字段返回
2. 重新编排报表列配置,新增长度/厚度差值列并调整字段顺序
3. 实现差值计算逻辑与异常标红展示,从配置获取告警阈值
2026-06-09 09:02:44 +08:00
20966157c5 fix(wms): 修正材料预警服务中的数值精度计算问题
- 为理论值、实际值、允许偏差和偏差值设置统一的3位小数精度
- 将偏差率计算精度从4位小数调整为1位小数
- 修正厚度偏差计算公式中的减法运算顺序
- 在警告消息中应用相同的数值精度格式化
- 确保所有BigDecimal运算都使用HALF_UP舍入模式
2026-06-08 18:02:52 +08:00
59e58e5206 feat(warning): 更新钢卷告警检查功能支持动态阈值配置
- 在 WmsMaterialCoilBo 中新增 specThickness 字段用于存储规格厚度
- 修改 checkAndInsertWarnings 方法签名以传递 BO 对象
- 将长度和厚度告警阈值改为从系统配置表动态读取
- 长度告警阈值配置键为 material.warning.length,默认值 0.1
- 厚度告警阈值配置键为 material.warning.thickness,默认值 -0.01
- 厚度检查逻辑改为理论厚度与规格厚度对比
- 钢卷创建和更新流程中传递 BO 对象到告警检查方法
- 优化告警消息内容以反映阈值检查而非固定比例
- 移除原有的实测厚度检查规则,统一使用规格厚度作为参考标准
2026-06-08 17:45:10 +08:00
59ceeed4a4 fix(crm/contract): 优化合同预览与导出的样式及重复渲染问题
1.  为产品内容组件添加值相等判断,避免重复解析内容
2.  统一合同预览和导出弹窗的表格边框样式为2px粗边框
3.  将合同预览的字体改为黑体并调整字重,优化显示效果
4.  调整表格字体粗细的配置标准
2026-06-08 16:31:17 +08:00
fac59f4346 feat: 合同导出新增附件图片配置功能
- 新增附件图片加载区域(从 businessAnnex/techAnnex 等字段提取 OSS 图片)
- 支持图片勾选显隐、拖拽排序(上移/下移)
- 导出 HTML 预览和 PDF 均支持图片附件页渲染
- @open 重构为 onDialogOpen,自动拉取附件列表
- 新增 loadImage 辅助方法,PDF 导出支持 JPEG 图片嵌入
2026-06-08 11:21:25 +08:00
f6a74e58ea refactor(wms/coil): 抽象排产单组件,复用排产单展示逻辑
1.  新增PlanSheetViewer通用排产单展示组件,支持图片、excel、普通文件预览和空状态
2.  改造TimeInput组件,修复绑定属性写法
3.  替换typing.vue、stepSplit.vue、split.vue、merge.vue中的旧排产单代码,统一使用新组件
4.  删除冗余的排产单相关API调用和本地数据逻辑
2026-06-08 10:22:30 +08:00
857a3948d6 feat(wms): 新增钢卷通用维度告警管理功能
1. 新增告警信息路由页面与API接口
2. 在导航栏添加告警入口与未读红点提示
3. 实现告警列表查询、处理、忽略、删除与导出功能
4. 每分钟自动刷新告警状态检查
2026-06-08 10:05:52 +08:00
47b3fb24b7 feat: 新增阿里妈妈数黑体字体并更新标签样式
1. 新增阿里妈妈数黑体字体文件及授权说明文档
2. 全局替换标签默认字体为阿里妈妈数黑体
3. 统一调整多个标签页的卷号/原料号字体大小为1em
4. 修复表单输入框的v-model.number类型绑定问题
5. 删除废弃的盐雾试验、力学性能、样品标签预览组件
2026-06-08 09:05:15 +08:00
97e0df7ae1 refactor(aps/planSheet): 重构排产单详情页与列表页,替换可编辑表格为文件上传功能
1. 移除原排产单明细可编辑表格,替换为文件上传预览区域
2. 重构PlanSheetList组件,优化排产单筛选与展示UI
3. 新增排产单附件上传、预览、重新上传功能
4. 优化排产单列表的筛选、分页与操作交互
2026-06-06 17:56:13 +08:00
7c87670896 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-06 17:15:40 +08:00
cd3cc85c0a feat: 合同导出弹窗新增导出行配置(合计行/大写金额行/备注行可选)
- 新增 rowConfigs 配置,支持控制合计行、大写金额行、备注行显隐
- 新增全选/半选逻辑,与列配置交互风格一致
- 导出 HTML 模板根据行配置动态渲染
2026-06-06 17:15:31 +08:00
d70bb77755 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-06 17:11:09 +08:00
b00db10a37 feat(aps): 添加排产文件字段支持
- 在 ApsPlanSheet 实体类中新增 apsUrl 字段用于存储排产文件路径
- 在 ApsPlanSheetBo 业务对象中添加 apsUrl 属性定义
- 更新 MyBatis 映射文件 ApsPlanSheetMapper.xml 添加字段映射
- 在 ApsPlanSheetVo 视图对象中增加 apsUrl 字段并配置 Excel 导出
- 为 deliveryWaybillDetail 查询添加按创建时间倒序排序功能
2026-06-06 17:10:59 +08:00
dbeb99d9e5 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-06 17:08:51 +08:00
1a2fc9852d feat: 新增考勤模板管理功能
- 后端新增 WmsAttendanceTemplate CRUD(Controller/Service/Mapper/Domain)
- 前端新增 attendanceTemplate API 对接
- 前端新增 AttendanceTemplateManager 组件(拖拽排序 + 模板编辑)
- 优化考勤 drag.vue 页面交互
2026-06-06 17:08:31 +08:00
7aaa59cee1 feat(wms): 添加钢卷长度厚度偏差自动告警功能
- 在IWmsMaterialWarningService接口中新增checkAndInsertWarnings方法定义
- 在WmsMaterialCoilServiceImpl中注入materialWarningService依赖
- 在钢卷新增、更新、拆分等操作后自动触发偏差检查和告警插入
- 实现doCheckAndInsertWarnings方法进行长度和厚度偏差计算
- 添加checkLength方法验证长度偏差是否超过10%
- 添加checkThickness方法验证厚度偏差包括偏薄ERROR和偏厚WARNING
- 实现批量插入告警记录并添加异常处理和日志记录
2026-06-06 16:24:35 +08:00
cbebd5b6d6 feat(wms): 添加钢卷通用告警功能
- 创建 WmsMaterialWarning 实体类定义告警数据结构
- 实现 IWmsMaterialWarningService 接口提供告警业务方法
- 开发 WmsMaterialWarningController 控制器支持增删改查操作
- 设计 WmsMaterialWarningBo 和 WmsMaterialWarningVo 数据传输对象
- 配置 WmsMaterialWarningMapper 数据访问层和 XML 映射文件
- 实现 WmsMaterialWarningServiceImpl 业务逻辑处理类
- 添加告警类型、级别、状态等字段支持长度/厚度/宽度维度监控
- 集成 Excel 导出功能便于告警数据统计分析
2026-06-06 15:52:29 +08:00
24a9784035 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-06 15:24:16 +08:00
de7ec604dd fix(wms): 修复理论长度计算为空的问题
- 移除实际宽度比较条件,简化理论厚度计算判断逻辑
- 保持体积计算公式不变,仅调整条件判断流程
- 确保在缺少理论厚度且有实际长度时能正确计算厚度值
2026-06-06 15:23:50 +08:00
696f6d9ee0 fix(crm/contract): 修复合同状态更新调用错误的接口
移除了多余的created钩子中调用字典列表的代码,将更新合同状态的接口从updateContract改为updateOrder
2026-06-06 15:12:42 +08:00
050dd1a965 feat(crm): 合同含税总金额自动填入订单总金额 & 移除冗余页面
- feat(crm/contract): 含税总额变化后自动填写订单总金额(可配置开关)
- fix(crm/receive): 修复金额单位错误(万元→元);清理未使用导入
- fix(contract/product): 产品备注设置默认值
- chore: 移除已废弃的 OrderDashboard 组件和 finance/order 页面
- feat(wms/hrm): 新增考勤异常管理页面(attendanceAbnormal.vue)
- chore: 移除 trae git 提交规则配置
2026-06-06 13:01:38 +08:00
724c1dd16f refactor(order): 调整订单列表排序规则
- 移除状态排序逻辑
- 修改排序规则为合同号倒序排列
- 更新注释说明新的排序方式
- 保持置顶优先的排序策略不变
2026-06-06 12:58:12 +08:00
0e85153b3d chore(wms/order): 删除订单模块冗余的页面和组件文件 2026-06-06 11:44:26 +08:00
af728f8ea6 refactor(crm/contract): 抽取合同导出预览组件到独立文件 2026-06-06 10:49:02 +08:00
7e07b6f970 feat(wms/attendance-check): 新增异常考勤筛选功能
1. 在考勤审核查询条件中增加异常标识字段abnormal,用于筛选异常考勤记录
2. 在服务层实现异常筛选逻辑:当abnormal为true时,查询整体状态不为"normal"的考勤记录

调整前,考勤审核查询无法直接筛选异常考勤;调整后,支持通过abnormal字段快速过滤出异常状态的考勤记录,提升审核效率。
2026-06-06 10:13:41 +08:00
8a0f5e65bb feat(wms/attendance): add batch delete attendance schedule function
1. 修改删除排班接口为POST请求方式并调整接口路径为/wms/attendanceSchedule/remove,传递删除id数据
2. 在排班页面添加多选列和批量删除按钮,实现批量删除排班记录功能,包含选中校验、删除确认和操作反馈
2026-06-05 17:14:30 +08:00
1947a5c2d5 fix(wms/attendance-schedule): 调整批量删除接口参数类型与逻辑
1. 接口参数调整:将批量删除接口的路径参数从Long数组改为接收逗号分隔的字符串,并修改为@RequestBody接收
2. 服务层逻辑重构:将deleteWithValidByIds方法参数从Collection<Long>改为String,内部实现字符串解析与转换
3. 新增参数校验:在服务层添加字符串解析逻辑,过滤空值并转换为Long列表,避免空列表操作

调整前,批量删除依赖路径参数数组,存在URL长度限制且类型转换复杂;调整后,通过请求体接收字符串参数,服务层统一解析处理,提升接口健壮性与兼容性。
2026-06-05 16:46:23 +08:00
d8498728ee Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-05 15:51:31 +08:00
53e948b3e0 refactor(contractList): 移除旧的PDF导出逻辑,改用浏览器原生打印 2026-06-05 15:51:28 +08:00
3ebc0cb86a Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-05 11:07:33 +08:00
8059b0a0bb feat(wms/material-coil): 优化钢卷异常导出功能,支持动态表头与横向拼接
1. 重构异常导出逻辑:将原纵向展开(每个异常一行)改为横向拼接(每个钢卷一行),动态计算最大异常数并生成对应表头组
2. 移除冗余代码:删除原createExportVo方法和parseDateFromObject方法,简化导出结构
3. 调整数据格式:使用List<List<Object>>存储行数据,直接填充钢卷信息、改判原因及N组异常字段

调整前,导出文件为每个异常生成独立行,导致数据冗余且结构松散;调整后,每个钢卷仅占一行,异常信息横向拼接为动态列组,提升数据紧凑性与可读性,支持大规模异常数据导出。
2026-06-05 11:07:20 +08:00
1792196dc7 fix(wms/coil): 修复位置比较时的类型校验问题
将位置字段转为整数再进行大小比较,同时添加了调试日志用于排查异常数据问题
2026-06-05 11:05:32 +08:00
d8051abf8e feat(cost): 新增钢卷囤积成本统计页面及相关接口
新增了钢卷囤积成本统计的API接口,包括囤积统计和明细列表接口,同时新建了对应的页面页面,包含筛选查询、统计卡片、维度对比图表和明细表格功能,实现钢卷囤积成本的可视化管理。
2026-06-05 10:45:46 +08:00
5e0cb69bb8 feat(wms/coil): 为钢卷相关页面添加异常继承功能
本次修改在typing.vue、merge.vue、split.vue和stepSplit.vue四个钢卷相关页面中,新增了异常继承的完整功能:
1.  重构异常信息展示区域,添加继承标记样式
2.  新增继承异常按钮,打开异常选择弹窗
3.  实现从源钢卷拉取异常列表、批量选择继承异常的功能
4.  继承的异常会标记来源并使用特殊样式展示
2026-06-05 10:45:37 +08:00
37a69b563b Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-05 10:45:01 +08:00
66f0b3fdd7 fix(wms): 修复三处业务显示与逻辑不一致问题
1. 修复异常报表接口数据字段使用错误,将rows改为data
2. 调整标签渲染PDF的图片缩放和位置,避免内容超出页面
3. 修改考勤审核页面的请假天数列标题为请假小时,匹配实际展示数据
2026-06-05 10:44:56 +08:00
5e0dc848bb fix(wms-warehouse): 修复仓库页面容器高度溢出和导出二维码逻辑 2026-06-05 10:41:49 +08:00
a5323aea76 fix(crm/contract): 优化合同预览与导出功能
1.  隐藏打印预览按钮
2.  调整合同预览页面样式间距与logo位置
3.  修改合同金额字段保留小数位数为3位
4.  优化PDF导出分页逻辑,按空白行自动分页
2026-06-05 10:41:33 +08:00
cac747d158 fix(wms/material-coil): 移除钢卷查询中不必要的用户与异常统计关联
在WmsMaterialCoilMapper.xml的钢卷分页查询SQL中,移除了与sys_user表的左连接(通过sale_id关联)以及wms_coil_abnormal异常统计的子查询关联。调整前,查询包含冗余关联,可能影响性能且非必需;调整后,简化了SQL结构,提升查询效率。
2026-06-05 10:02:32 +08:00
705d929d6e feat(wms/material-coil): 优化钢卷囤积统计查询性能
1. 重构囤积统计方法:将原Java循环计算逻辑替换为单SQL聚合查询,通过JSON_EXTRACT解析二维码步骤创建时间,一次性计算平均囤积周期与成本
2. 移除原低效实现:删除getHoardingStatistics方法中的批量查询与循环解析代码,消除N+1性能问题
3. 新增Mapper方法与XML映射:添加selectHoardingStatistics接口及对应SQL,支持与分页查询相同的条件筛选

调整前,统计需先查询钢卷列表再批量获取二维码并循环解析,存在性能瓶颈;调整后,通过单SQL完成所有聚合计算,大幅提升查询效率,支持大规模数据统计。
2026-06-04 17:06:08 +08:00
29c21fd64f Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-04 15:46:02 +08:00
5236500f04 feat(wms/material-coil): 新增钢卷囤积统计与二维码详情查询功能
1. 新增囤积统计接口:计算已发货钢卷的平均囤积周期和平均囤积成本
   - 囤积周期 = 发货时间 - 二维码第一步创建时间
   - 囤积成本 = 囤积天数 × 钢卷净重 × 1元/吨/天
   - 支持与分页列表相同的查询条件筛选

2. 新增二维码详情查询接口:在分页查询基础上填充完整的二维码记录信息
   - 前端可通过 qrcodeRecord.content 获取二维码JSON内容
   - 采用批量查询避免N+1性能问题

调整前,钢卷查询无法获取二维码详细内容,也无法统计囤积相关指标;调整后,支持二维码内容查看和囤积成本分析,为仓储成本核算提供数据支持。
2026-06-04 15:45:51 +08:00
600867f386 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-04 14:28:38 +08:00
8183bae824 fix(crm): 统一销售金额单位为元并优化金额精度
1. 修改客户等级图表、销售报告页面的金额单位从万元改为元
2. 将金额计算和展示的精度从两位小数调整为三位小数
3. 新增合同默认编码和签订地点的默认值
2026-06-04 14:28:33 +08:00
37d6830947 fix(wms/delivery): 清除运单明细查询中的时间条件干扰
在WmsDeliveryWaybillDetailController的运单明细查询方法中,startTime/endTime参数已用于运单delivery_time筛选。为避免其被误用作钢卷update_time的查询条件,在查询前将bo中的startTime和endTime字段显式置为null。调整前,时间条件可能干扰钢卷维度的查询结果;调整后,确保运单交付时间筛选与钢卷更新时间筛选互不干扰,提升查询准确性。
2026-06-04 14:09:25 +08:00
c71dfe3ff2 feat(wms/coil): 新增钢卷异常管理相关页面与功能
1. 新增钢卷异常列表基础页、明细页、钢卷维度异常页和继承扩展页
2. 在异常管理表格中新增继承来源列
3. 完善异常增删改查、判级以及继承功能
2026-06-04 13:36:01 +08:00
ff139759d4 feat(wms/coil/abnormal): 新增钢卷异常记录的父异常ID字段
在WmsCoilAbnormal实体及相关业务对象中新增parentAbnormalId字段,用于记录异常继承关系。调整涉及数据库映射、Java实体类、业务对象、查询条件及导出映射。调整前,异常记录缺少父异常关联信息;调整后,支持按父异常ID进行筛选与关联追溯,提升异常链分析能力。
2026-06-04 13:19:33 +08:00
5176c80344 refactor(mes/wms): 优化多处日期处理与表格列展示
1. 移除磨工页面字典表格的"值"列
2. 修复TimeInput组件日期格式化逻辑,补全月份日期补零处理
3. 为卷料录入页面添加日期格式化方法,替换直接赋值逻辑并新增生产时长计算
2026-06-04 11:10:34 +08:00
31f7a9c0cb Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-04 10:59:17 +08:00
9d208770d8 feat(service): 添加按热卷号查询计划详情功能
- 在 SqlServerApiBusinessService 中实现按热卷号查询计划详情方法
- 新增调用查询扩展卷数据接口并整合到返回结果中
- 修改 PlanDetailView 构造函数以支持扩展卷数据列表
- 添加 excoilRows 属性和相应的 getter 方法
- 提供新的 fromExecuteSqlResponse 静态工厂方法处理双响应对象
- 在 SqlServerApiClient 中新增 queryExcoilByHotCoilId 查询接口
2026-06-04 10:59:07 +08:00
31d8d1ee16 feat: 多个页面优化与功能增强
1. 磨削页面:添加操作人权限控制,自动填充上次硬度值,移除字典值字段
2. 质保书页面:新增质保书类型筛选与表单字段,移除模板选择弹窗
3. 成本综合页面:添加产线校验、录入/查看切换、表格列控制与快捷操作
4. 质保书条目页面:新增类型筛选与表单字段,移除模板选择弹窗
2026-06-04 10:26:09 +08:00
b4fbb8dfc8 feat(qc/certificate): 新增证书类型字段
在QcCertificate实体及相关业务对象中新增certificateType字段,用于标识出厂合格证、检测报告、质保书等证书类型。调整涉及数据库映射、查询条件及导出映射。调整前,证书记录缺少类型分类;调整后,支持按证书类型进行筛选与统计,提升证书管理能力。
2026-06-03 17:21:12 +08:00
40ebca2573 feat(mes/eqp/check): add inspector summary statistics table
新增按实际巡检人维度的巡检汇总统计表格,展示巡检人、巡检次数、通过/不通过数量及通过率
2026-06-03 16:59:03 +08:00
ec08a360a0 feat(qc/inspection): 新增检验任务方案选择的公司和默认选中参数
1.  给SchemeSelect组件新增company和scheme两个props
2.  组件内新增模板单位查询参数并关联传入的company值
3.  组件挂载/重置时自动匹配并选中传入的默认方案
4.  同步更新表单内的归属公司和任务类型字段初始化
2026-06-03 16:54:37 +08:00
977ea2b021 refactor(wms/report): 移除actionIds相关导出逻辑 2026-06-03 16:44:44 +08:00
e507887a27 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-03 16:31:54 +08:00
12a887e074 refactor(wms-report): 统一报表页面模板,提取公共逻辑为action-template
1.  将merge、repair下的多个报表页面重构为使用action-template组件
2.  提取自定义导出功能为公共组件CustomExport并复用至receive.vue和action-template
3.  统一报表页面的查询、导出、列配置等公共逻辑
2026-06-03 16:31:51 +08:00
577de8eb64 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-03 16:31:32 +08:00
03add7c96b 模架厚度修复 2026-06-03 16:30:48 +08:00
42e5b6dd2b feat(wms/coil/abnormal): 新增钢卷异常记录数据来源与工序来源
在WmsCoilAbnormal实体及相关业务对象中新增以下字段:
1. 数据来源(sourceSystem):标识数据来自二级系统同步或三级本地录入
2. 工序来源(processSource):记录异常发生的具体工序(如粗轧、精轧等)

调整涉及数据库表结构、Java实体类、业务对象、查询条件及导出映射。调整前,异常记录缺少数据来源和工序信息;调整后,新增字段支持按数据来源和工序进行筛选与统计,提升异常追溯与分析能力。同时为物料钢卷服务中的相关DTO预留字段映射注释。
2026-06-03 15:48:25 +08:00
88149561c5 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-03 15:12:34 +08:00
51bb7593c7 feat(mes/wms): 新增磨辊人管理与免验规则优化
1. 优化wms产线免验逻辑,新增镀铬产线免验支持
2. 新增磨辊人统计报表导出功能
3. 新增磨辊操作人字典维护功能
2026-06-03 15:12:31 +08:00
c34fc1e477 fix(wms/coil): 修正操作类型校验逻辑,增加对类型505的排除
在钢卷操作校验逻辑中,原代码仅排除了操作类型501(入库)对子卷操作类型的校验。调整后,增加对操作类型505(出库)的排除,确保在入库和出库操作中,子卷的操作类型字段不会因非空而被错误校验,避免因校验不匹配导致的业务异常。
2026-06-03 15:06:25 +08:00
9bd6077599 feat(wms/report): 新增自定义报表导出列配置缓存功能
在入库报表页面中新增导出列配置的本地缓存功能,用户自定义的列顺序将被保存至localStorage,避免重复配置。调整前,每次打开自定义导出弹窗均需重新选择列;调整后,自动读取上次保存的配置,提升用户体验。
2026-06-03 15:01:16 +08:00
6fe1f668d3 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-03 14:53:14 +08:00
53b991242c feat(mes/roll/report): 优化磨辊人员统计报表,按辊型拆分统计数据
该提交重构了磨辊报表的操作人员统计模块,将原有的总统计拆分为中间辊(CR)、支撑辊(BR)、工作辊(WR)的分项统计,并增加了合计栏,同时完善了辊型识别逻辑,新增了对应的数据计算和表格展示。
2026-06-03 14:07:46 +08:00
91017f7c84 refactor(wms/report): 重构镀锌、酸轧线报表页面,统一使用通用模板组件
1.  新增了zinc_old和zha_old旧版报表备份目录,保留原有实现
2.  将所有报表页面替换为通用的ActionTemplate组件
3.  为镀锌线、酸轧线的各类报表配置了固定的生产线、仓库选项和操作类型
4.  移除了动态加载报表配置的逻辑,改为硬编码固定配置
2026-06-03 14:07:35 +08:00
7b80ef035a fix(mes/roll): 修正磨削记录查询排序逻辑
1. 将磨削记录列表的默认排序由升序改为降序,确保最新记录优先展示
2. 移除冗余的grind_id排序条件,简化排序规则
2026-06-03 11:36:36 +08:00
e54efab7c8 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-02 16:49:16 +08:00
715c1b9728 fix(qc/inspection): 修复产品检验入场卷号校验逻辑
1. 移除表单内置的入场卷号校验规则,改为手动校验
2. 添加失焦校验和实时错误提示
3. 优化两个页面的卷号选择表单结构
2026-06-02 16:49:13 +08:00
jhd
8723924002 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-02 15:44:19 +08:00
jhd
cbaa47b34e 地图获取省份逻辑 2026-06-02 15:44:01 +08:00
fe24426f59 refactor(crm/contract): 简化产品内容组件并优化合同打印样式 2026-06-02 15:40:47 +08:00
ef04d73e0c feat(cost/comprehensive): 新增产线自动填充和数据一键获取功能
1.  新增产线名称转换方法,统一展示产线中文名
2.  为详情输入框添加自动获取数据按钮,支持原料、产出、辅料、轧辊四类数据自动查询
3.  改造报表表单的产线选择器,使用正式产线数据而非硬编码选项
4.  完善报表编辑时的产线数据映射逻辑
5.  新增自动加载状态管理,避免重复请求
2026-06-02 14:45:04 +08:00
b7d47a5d9d feat(mes/roll): 扩展磨削记录查询功能,新增班组与轧辊类型筛选
在磨削记录查询接口中新增以下筛选条件:
1. 班组(team)
2. 轧辊类型(rollType)

调整涉及服务接口、控制器、Mapper及XML映射文件,将原有的时间范围和产线筛选扩展为支持多维度查询。调整前,查询仅支持按轧辊ID、产线ID和时间范围筛选;调整后,新增班组和轧辊类型条件,提升查询灵活性与业务分析能力。同时优化SQL查询,通过关联mes_roll_info表获取轧辊类型,并在返回结果中新增rollType字段。
2026-06-02 14:22:55 +08:00
jhd
021c1c908a Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-02 13:52:06 +08:00
cd3b25fa30 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-02 13:35:43 +08:00
3106b2c530 feat(wms/report): 新增理论厚度、理论长度与镀铬卷号字段至钢卷报表
在钢卷入库报表中新增以下字段:
1. 理论厚度(theoreticalThickness)
2. 理论长度(theoreticalLength)
3. 镀铬卷号(chromePlateCoilNo)

调整涉及前端报表展示列配置、后端导出列映射及理论计算公式注释修正。调整前,报表仅展示物理属性与材质属性的基础字段;调整后,新增理论计算字段与镀铬卷号,提升报表信息完整性与业务分析能力。同时修正理论计算公式注释中的单位转换符号,将除1000更正为乘1000,确保公式表述准确。
2026-06-02 13:35:29 +08:00
f4e6b24c92 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-02 13:23:01 +08:00
d6620e2449 feat: 新增质保书模板功能,优化标签样式与钢卷信息展示 2026-06-02 13:22:58 +08:00
b59bb1789e fix(wms/coil): 修复理论厚度与长度计算中宽度为零的除零异常
在钢卷理论计算逻辑中,当实际宽度为零时,计算理论厚度和理论长度会导致除零异常。调整前,仅校验实际长度不为空;调整后,增加实际宽度大于零的校验,避免无效计算。同时修正理论厚度和理论长度的计算公式,统一使用乘1000替代除1000,确保计算精度和单位转换正确。
2026-06-02 11:48:44 +08:00
4295a28f33 feat(wms/coil): 新增已绑定钢卷列表按发货计划创建时间倒序排序功能
在钢卷查询业务中,当查询已绑定钢卷列表且未指定计划ID(planId)时,新增按关联的发货计划创建时间倒序排序功能,确保较新的计划优先展示。

主要改动:
1. 在WmsMaterialCoilBo中新增orderByPlanDesc布尔字段,用于控制排序逻辑
2. 在WmsMaterialCoilMapper中新增selectVoPagePlusPlanOrder方法及对应的XML映射,通过关联发货计划表支持按计划创建时间排序
3. 在WmsMaterialCoilServiceImpl中调整查询逻辑:当orderByPlanDesc为true时调用新的查询方法,并在查询条件中补充排序规则
4. 在WmsDeliveryWaybillDetailController中设置orderByPlanDesc条件:当planId为空时启用该排序
5. 重构XML映射文件,提取公共SQL片段以提高可维护性

调整前,已绑定钢卷列表在无planId时仅按状态排序;调整后,新增按发货计划创建时间倒序排序,便于用户快速查看最新计划相关的钢卷。
2026-06-02 11:11:55 +08:00
8572a60044 feat(qc): 新增质量检验证书原料卷号、表面处理与调质度字段
在质量检验证书项(QcCertificateItem)中新增以下字段:
1. 原料卷号(rawCoilNo)
2. 表面处理(surfaceTreatment)
3. 调质度(temperDegree)

调整涉及实体类、业务对象、值对象及映射文件,确保字段在查询条件、导出模板中生效。
2026-06-02 11:02:56 +08:00
29328d70e9 提交3d钢卷,追溯和意库内容 2026-06-02 10:08:47 +08:00
12545f7c8b 提交3d钢卷 2026-06-02 09:27:47 +08:00
6ec4275088 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-02 09:13:56 +08:00
14dbd633b5 feat(qc): 新增化学成分与物理性能检验字段
在质量检验证书项(QcCertificateItem)中新增以下字段:
1. 化学成分:铝(Al)、钛(Ti)、铬(Cr)、镍(Ni)、铜(Cu)、氮(N)、铁(Fe)、硼(B)
2. 物理性能:规定塑性延伸强度(plasticExtensionStrength)
3. 镀层信息:镀层表面结构(coatingSurfaceStructure)、镀层重量(coatingMass)

调整涉及实体类、业务对象、值对象及映射文件,确保字段在查询条件、导出模板中生效。
2026-06-02 09:13:46 +08:00
8d68d2bdee Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-02 08:56:34 +08:00
6b8eac4139 feat(contract): 新增合同打印功能,重构产品金额计算逻辑
1. 新增合同打印预览功能,支持A4格式打印,包含合同完整信息和产品明细
2. 新增多个产品金额计算工具函数,统一管理产品税额、无税单价等字段计算
3. 重构产品内容组件,新增税率除数、无税单价、税额列,实现字段联动自动计算
4. 新增合同logo静态资源,优化表格布局和样式
2026-06-02 08:56:31 +08:00
13780c635b fix(attendance): 调整考勤漏打卡判定时间阈值至两小时
将漏打卡判定阈值从30分钟延长至120分钟,即上班打卡晚于理论上班时间两小时以上或下班打卡早于理论下班时间两小时以上才标记为漏打卡。调整前,30分钟即触发漏打卡状态;调整后,放宽判定标准,减少因短暂延误导致的误判。
2026-06-02 08:18:46 +08:00
a425a9052a fix(wms/coil): 为镀铬操作类型豁免分卷净重与规格厚度校验
在钢卷分卷和批量分卷的业务逻辑中,当操作类型为501(镀铬)时,豁免以下校验:
1. 子卷净重不超过母卷净重的校验
2. 子卷规格厚度不超过母卷规格厚度的校验
3. 批量分卷时所有子卷总重不超过母卷净重的校验

调整前,所有分卷操作均强制进行净重和规格厚度校验;调整后,镀铬操作类型(501)可跳过这些校验,以适应镀铬产线的特殊业务场景。
2026-06-02 08:02:04 +08:00
f64da15bc3 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-01 17:11:43 +08:00
b134539e53 提交3d钢卷初版 2026-06-01 17:11:36 +08:00
effc1f6f2e Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-01 16:40:15 +08:00
ca285f78c6 feat(qc): 新增厂家卷号匹配功能,优化卷号录入体验
本次改动在检验任务、化学成分报告、物理性能报告模块中:
1. 支持通过入场卷号和厂家卷号双向搜索匹配
2. 新增多选卷号标签式展示与删除功能
3. 新增批量导入时厂家卷号自动匹配入场卷号的逻辑,包含多匹配结果弹窗选择
4. 在表格中新增厂家卷号展示列,更新导入模板支持厂家卷号字段
2026-06-01 16:40:13 +08:00
0cfffcc60d feat(wms/coil): 新增钢卷理论长度字段并优化理论计算逻辑
1. 在钢卷物料实体类、业务对象、值对象及导出VO中新增理论长度(theoreticalLength)字段,并在映射文件中补充数据库映射关系
2. 重构理论计算工具方法,将原有的calculateTheoreticalThickness方法扩展为calculateTheoretical,支持同时计算理论厚度和理论长度
3. 理论长度计算公式:理论长度 = 净重(吨) × 1000 / 7.85 / 规格厚度(mm) / 规格宽度(mm) / 1000
4. 优化规格信息提取逻辑,统一从物品规格中解析厚度和宽度,避免重复代码
5. 在新增、修改、分卷、批量分卷等业务方法中调用新的计算逻辑,确保理论长度字段的自动填充
2026-06-01 16:21:41 +08:00
37b2987279 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-01 16:10:27 +08:00
59bdcf96dc style(mes/roll/grind): 调整磨削记录查询排序为降序
将磨削记录的默认排序从按磨削时间升序改为降序,确保最新的磨削记录显示在列表前面,便于用户优先查看最近的操作记录。
2026-06-01 16:10:18 +08:00
8f602d80a9 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-06-01 15:56:51 +08:00
7bddfad80f feat(eqp/check): 新增设备巡检负责人筛选页面及相关优化
1.  新增person.vue页面,支持按负责人筛选巡检部位
2.  在设备巡检列表页展示负责人信息并添加样式
3.  修复产线绑定字段错误,将lineId改为productionLine
4.  移除磨工页面输入框的number类型限制
2026-06-01 15:56:48 +08:00
8b1d7ed280 feat(wms/report): 新增自定义导出列顺序功能并优化导出弹窗布局
1. 在ExcelUtil工具类中新增exportExcelOrdered方法,支持按指定顺序的列动态生成表头和数据行进行导出
2. 重构接收报表页面的自定义导出弹窗:将布局拆分为左侧可选列面板和右侧导出顺序面板,支持拖拽排序
3. 新增后端/exportCustomOrdered接口,接收有序字段列表并调用新的导出方法
4. 优化弹窗样式:调整宽度、间距、滚动区域,新增顺序序号和移除按钮
5. 移除原有的/exportCustom接口,统一使用新的有序导出逻辑
2026-06-01 15:14:34 +08:00
285775c733 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-01 14:39:03 +08:00
7e6bc1e8b4 fix(attendance): 优化考勤状态识别逻辑并补充漏打卡处理
1. 在考勤状态筛选、汇总卡片和图例中将“迟到/早退”标签更新为“迟到/早退/缺卡”,以包含漏打卡情况
2. 后端服务中,在考勤状态常量列表新增“missed_start”、“missed_end”、“missed”三种漏打卡状态
3. 重构上下班打卡时间判断逻辑:当打卡时间晚于理论上班时间或早于理论下班时间超过30分钟时,标记为漏打卡(上班漏打卡或下班漏打卡)
4. 调整状态覆盖逻辑:上班漏打卡或下班漏打卡状态会覆盖原有的迟到/早退状态;若上下班均漏打卡则标记为全天漏打卡(missed)
5. 更新考勤记录处理:当标记为漏打卡时,对应的首次或末次打卡时间字段设为null
6. 优化旷工判定逻辑:单独处理上午段(P1)或下午段(P2)漏打卡的情况,分别标记为半天旷工(absent_half)
7. 前端新增漏打卡状态对应的日历样式(状态色块为#e6a23c)和状态描述文本(“上班漏打卡”、“下班漏打卡”)
2026-06-01 14:38:56 +08:00
bf3967d7b5 feat(wms/coil): 新增镀铬卷号字段与分条校验规则优化
1.  在CoilCard中将长度标签改为参考长度
2.  新增镀铬卷号列到钢卷选择器表格与可选列配置
3.  在钢卷更新和分条页面添加净重、厚度校验规则,区分镀锌/酸轧/镀铬产线豁免情况
4.  优化分条页面的代码格式与组件注册顺序,新增镀铬操作类型判断
5.  分条表单新增镀铬卷号输入项,支持从源卷复制镀铬卷号信息
2026-06-01 14:31:06 +08:00
a0cd885fc7 feat(wms/attendance): 优化考勤同步功能,新增月份选择和超时配置
1. 重构syncRecords接口,支持传入开始和结束时间参数并新增60s超时配置
2. 升级考勤同步页面:新增同步弹窗、月份选择器,替换原有基于最后同步时间的同步逻辑
3. 优化搜索表单和详情表单的标签与占位符,调整表单宽度提升可读性
4. 移除无用的最后同步时间查询逻辑
2026-06-01 14:12:06 +08:00
481188f654 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-06-01 13:51:00 +08:00
c8fe545950 feat(wms/coil): 为钢卷物料新增理论厚度与镀铬卷号字段并实现自动计算
1. 在钢卷物料实体类、业务对象、值对象及导出VO中新增理论厚度(theoreticalThickness)和镀铬卷号(chromePlateCoilNo)字段
2. 在映射文件中补充新增字段的数据库映射关系
3. 在服务实现类中添加理论厚度自动计算逻辑:根据净重、实测长度和物品规格宽度,使用公式“理论厚度 = 净重(吨) × 1000 / (7.85 × 实测长度(mm) × 宽度(mm))”自动计算并保留3位小数
4. 新增工具方法用于从物品规格中提取厚度和宽度信息
5. 在新增、修改、分卷、批量分卷等业务方法中调用理论厚度计算逻辑
6. 在分卷和批量分卷时增加子卷净重和规格厚度不超过母卷的业务校验
2026-06-01 13:50:48 +08:00
94840b2153 feat(mes/roll/grind): 实现轧辊增删改查功能
1. 新增轧辊列表头部新增按钮和轧辊明细面板的修改、删除按钮
2. 增加轧辊新增/编辑弹窗,包含完整的轧辊信息表单和校验
3. 对接轧辊CRUD后端接口,实现新增、修改、删除逻辑
4. 调整左侧轧辊面板宽度适配新增内容
2026-06-01 12:58:35 +08:00
c5ce33f71a feat(mes/roll): 重构轧辊磨削页面布局并补充备注字段
1.  重构轧辊磨削页面的整体布局,调整为左侧产线Tab+右侧主体的结构
2.  在实体类和BO类中新增remark备注字段
3.  移除运单页面的冗余备注搜索框
4.  优化轧辊列表的检索和展示逻辑,新增厂家筛选选项
5.  补充磨削班组的下拉选择选项,新增字典配置
6.  优化页面样式和交互细节
2026-06-01 11:27:05 +08:00
43f4692a72 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-05-30 18:00:04 +08:00
9af5284ff3 feat: 多页面功能优化与新增 2026-05-30 18:00:01 +08:00
62da44382a fix(wms/attendance): 优化午休打卡模式识别逻辑
1. 重构打卡记录分割逻辑,将原简单中值法改为基于时间区间和间隔检测的智能分割
2. 新增午休打卡模式检测:支持区间内长间隔、提前下班+午饭回来、午休晚归三种场景识别
3. 当检测到午休打卡模式时,按实际打卡间隔进行合理分割;未检测到时回退使用原中值法
4. 提升考勤统计的准确性,避免因午休打卡时间分布不均导致的上下班时段误判
2026-05-30 17:38:13 +08:00
6a5220ad78 feat(mes/roll/grind): 增加厂家搜索筛选和CR类型选项
1. 新增厂家搜索输入框和筛选逻辑
2. 新增CR类型的单选筛选按钮
3. 在辊子列表中展示厂家信息
4. 优化有效当前辊径的默认返回逻辑
2026-05-30 15:05:43 +08:00
3b7ae10499 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-05-30 14:31:23 +08:00
6044413384 fix(wms): 统一发货单导出逻辑并修复弹窗拦截问题
1. 替换原有的window.open弹窗导出为a标签下载,解决浏览器拦截弹窗的问题
2. 统一使用Date.now()替代new Date().getTime()优化代码
3. 新增释放URL对象的代码避免内存泄漏
4. 调整线圈页面批量移出发货单按钮的显示条件
2026-05-30 14:31:20 +08:00
91d1236c37 feat(cost): 为成本项新增查询条件
- 在CostItem实体类、Bo业务对象和Vo视图对象中新增queryCondition字段,用于存储JSON格式的查询条件
- 更新CostItemMapper.xml映射文件以支持新字段的数据映射
- 在CostItemServiceImpl服务实现中添加新字段的查询条件支持,实现按查询条件过滤成本项的功能
2026-05-30 13:44:31 +08:00
020863d1ef feat(qc): 添加化学成分和物理性能检测字段
- 在QcChemicalItem实体类中新增铝、钛、铬、镍、铜、氮、铁、硼等化学成分字段
- 在QcChemicalItemBo业务对象中同步添加对应的化学成分属性
- 更新QcChemicalItemMapper.xml映射文件以支持新字段的数据映射
- 在QcChemicalItemServiceImpl服务实现中添加新字段的查询条件支持
- 在QcChemicalItemVo视图对象中添加化学成分字段并配置Excel导出
- 在QcPhysicalItem实体类中新增规定塑性延伸强度、镀层表面结构、镀层重量等物理性能字段
- 在QcPhysicalItemBo业务对象中添加对应的物理性能属性
- 更新QcPhysicalItemMapper.xml映射文件以支持新的物理性能字段映射
- 在QcPhysicalItemServiceImpl服务实现中添加新物理性能字段的查询条件支持
- 在QcPhysicalItemVo视图对象中添加物理性能字段并配置Excel导出功能
2026-05-30 11:04:02 +08:00
jhd
6832209e98 Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-05-30 10:47:52 +08:00
3a0f729669 feat(attendanceCheck): 新增员工考勤详情弹窗功能
1.  为员工列表列添加详情按钮,点击可查看个人考勤详情
2.  新增个人考勤汇总卡片,展示考勤统计数据
3.  支持表格和日历两种明细视图,根据天数自动切换
4.  添加考勤日历视图样式与状态标识
5.  补充相关计算属性与工具方法支撑新功能
2026-05-29 17:13:57 +08:00
aad568f320 feat(mes,wms): 新增设备送检审批流程及相关功能
1. 新增设备送检审批的API接口层
2. 在待办页面添加设备送检审批标签页
3. 完善设备巡检日报的送检提交功能
4. 修复报表模板查询的参数传递问题
5. 优化设备送检审批单的业务逻辑处理
2026-05-29 17:05:23 +08:00
d6099a781f Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-05-29 16:27:28 +08:00
e23098b766 feat(wms/report): 给成品线圈查询添加按创建时间筛选条件,并增加备注搜索项
1.  在wms报表模板页面的成品线圈查询中,补充byCreateTimeStart和byCreateTimeEnd参数,替换原有的startTime和endTime参数
2.  在CoilSelector组件中新增备注搜索输入框,仅在orderBy存在时显示
2026-05-29 16:27:25 +08:00
37ea2b7d78 feat(qc): 为质检任务新增厂家卷号字段
在质检任务实体、业务对象、值对象及映射文件中新增supplierCoilNos字段,用于记录厂家卷号集合(多个使用英文逗号分隔)。同时,在服务实现类中为查询条件添加对该字段的模糊匹配支持,实现按厂家卷号过滤质检任务的功能。
2026-05-29 16:19:04 +08:00
c707a0356f Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-05-29 16:10:09 +08:00
484f63f9cc feat(wms/coil): 新增钢卷物料个性化导出功能
1.  后端新增导出列元数据接口 `/exportColumns`,返回字段名与中文列名的映射。
2.  后端新增个性化导出接口 `/exportCustom`,支持通过 `columns` 参数指定导出的字段集合,利用增强的 `ExcelUtil.exportExcel` 方法实现按需导出。
3.  前端钢卷接收报表页面新增自定义导出弹窗,支持按列分组展示、搜索、全选/反选/清空列,并调用新接口实现仅导出选中列的数据。
4.  在导出VO中补充“班组”字段的Excel映射注解。
2026-05-29 16:09:58 +08:00
1f32171800 feat(aps): 新增排产单明细批量导入功能 2026-05-29 16:00:20 +08:00
jhd
5a16a9d2b1 wip在产大屏 2026-05-29 15:53:26 +08:00
6147ad2252 feat(aps/plan): 为排产单明细新增排产日期字段
在排产单明细实体、业务对象、值对象及映射文件中新增detailDate字段,用于记录排产日期(字符串格式,如'2025-12-29')。同时,在服务实现类中为查询条件添加对该字段的筛选支持,实现按排产日期过滤排产单明细的功能。
2026-05-29 15:40:46 +08:00
5e9bf6069e feat(mes/eqp): 新增设备巡检审批功能
新增设备巡检审批(按产线+时间范围审批)模块,包含以下内容:
1. 新增EqpEquipmentInspectionApproval实体类、Bo、Vo,定义审批相关字段
2. 新增EqpEquipmentInspectionApprovalController,提供增删改查及导出接口
3. 新增EqpEquipmentInspectionApprovalMapper及XML映射文件
4. 新增IEqpEquipmentInspectionApprovalService接口及ServiceImpl实现类,实现分页查询、新增、修改、删除等业务逻辑
5. 支持按产线、时间范围、申请人、审批状态等条件进行筛选查询
2026-05-29 15:24:52 +08:00
3cc37ae3d3 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-05-29 14:33:51 +08:00
5b4ea8f486 feat(aps/plan): 新增批量新增排产单明细接口
1. 在ApsPlanDetailController中新增batchAdd接口,支持批量新增排产单明细
2. 在ApsPlanDetailServiceImpl中实现insertBatchByBo方法,批量插入前进行实体校验
3. 在IApsPlanDetailService中声明批量新增接口方法
2026-05-29 14:33:19 +08:00
b8ed505971 feat(wms,crm,cost): 完成多模块功能更新与优化
1. 新增发货单明细统计接口调用
2. 移除成本页面复制配置按钮
3. 隐藏CRM合同订单编辑标签页
4. 优化发货单页面订单编号自动补全功能
5. 新增钢卷管理发货计划筛选与批量移单功能
2026-05-29 14:28:56 +08:00
6f488c74fc feat(wms/delivery): 新增根据发货计划ID查询已绑定钢卷功能,优化钢卷查询备注匹配
1. 在发货计划明细服务层新增getBoundCoilIdsByPlanId接口,支持根据计划ID和时间段筛选已绑定的钢卷ID列表
2. 在发货计划明细控制器中扩展已绑定钢卷查询接口,新增planId参数,优先按计划ID查询,兼容原有时间段查询逻辑
3. 在钢卷服务实现中为钢卷查询条件增加remark字段的模糊匹配支持,提升查询灵活性
2026-05-29 14:01:44 +08:00
1b65444ab3 refactor(wms/coil): 统一排产单表格展示样式并优化页面布局 2026-05-29 13:00:33 +08:00
125e07eed4 feat(mes/eqp/check): 替换字典选型为动态产线下拉选单
1. 统一替换页面中原有的dict-select为通过接口获取的动态产线列表
2. 新增产线默认选中酸轧线的逻辑
3. 修复产线参数传递不匹配的问题,同步前后端参数字段
2026-05-29 11:41:48 +08:00
82a54e3200 refactor(mes/eqp): 将设备巡检记录的产线字段类型从字符串改为长整型
1. 在EqpEquipmentInspectionRecordBo中将productionLine字段类型由String改为Long
2. 在EqpEquipmentInspectionRecordServiceImpl的查询条件中,将字符串非空判断改为Long非空判断
3. 统一前后端数据类型,为后续关联产线主键做准备
2026-05-29 11:16:22 +08:00
327ae685c1 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-05-29 11:15:14 +08:00
df643a8e4e refactor(mes/eqp): 将设备备件的产线字段类型从字符串改为长整型
1. 在EqpEquipmentPart实体类、Bo和Vo中将productionLine字段类型由String改为Long
2. 在EqpEquipmentPartServiceImpl的查询条件中,将字符串非空判断改为Long非空判断
3. 统一前后端数据类型,为后续关联产线主键做准备
2026-05-29 11:15:05 +08:00
1229 changed files with 127379 additions and 24493 deletions

2
.gitignore vendored
View File

@@ -63,3 +63,5 @@ nbdist/
*.local.*
*.py
*.pyc
*.json
*.toml

View File

@@ -1,9 +0,0 @@
---
alwaysApply: true
scene: git_message
---
使用中文编写提交信息, 提交信息格式为:
```
<type>(<scope>): <subject>
```

View File

@@ -0,0 +1,20 @@
-- 删除「采购需求」「采购看板」菜单前的备份 生成于脚本 库:klp-oa
-- 回滚:执行下面的 INSERT 即可恢复菜单与角色授权
INSERT INTO sys_menu (menu_id,menu_name,parent_id,order_num,path,component,query_param,is_frame,is_cache,menu_type,visible,status,perms,icon,create_by,create_time,update_by,update_time,remark) VALUES (1990706561827045378,'采购需求',1954721010120728578,0,'requirement','erp/requirement/index',NULL,1,0,'C','0','0',NULL,'nested','admin','2025-11-18 17:00:05','admin','2026-02-01 22:39:54','');
INSERT INTO sys_menu (menu_id,menu_name,parent_id,order_num,path,component,query_param,is_frame,is_cache,menu_type,visible,status,perms,icon,create_by,create_time,update_by,update_time,remark) VALUES (1990706888819179521,'采购看板',1954721010120728578,6,'dashboard','erp/dashboard/index',NULL,1,0,'C','0','0',NULL,'dashboard','admin','2025-11-18 17:01:23','admin','2026-05-08 19:06:02','');
INSERT INTO sys_role_menu (role_id,menu_id) VALUES (1993591990145687554,1990706561827045378);
INSERT INTO sys_role_menu (role_id,menu_id) VALUES (1993591990145687554,1990706888819179521);
-- 第二批删除:供应商库/采购订单/收货记录/退货管理/采购汇总
INSERT INTO sys_menu (menu_id,menu_name,parent_id,order_num,path,component,query_param,is_frame,is_cache,menu_type,visible,status,perms,icon,create_by,create_time,update_by,update_time,remark) VALUES (1955113252714999810,'供应商库',1954721010120728578,1,'supplier','erp/supplier/index',NULL,1,0,'C','0','0',NULL,'people','admin','2025-08-12 11:44:58','admin','2026-02-01 22:40:28','');
INSERT INTO sys_menu (menu_id,menu_name,parent_id,order_num,path,component,query_param,is_frame,is_cache,menu_type,visible,status,perms,icon,create_by,create_time,update_by,update_time,remark) VALUES (1990705902968995841,'采购订单',1954721010120728578,1,'order','erp/order/index',NULL,1,0,'C','0','0',NULL,'edit','admin','2025-11-18 16:57:27','admin','2025-11-18 17:03:49','');
INSERT INTO sys_menu (menu_id,menu_name,parent_id,order_num,path,component,query_param,is_frame,is_cache,menu_type,visible,status,perms,icon,create_by,create_time,update_by,update_time,remark) VALUES (1990706263360372737,'收货记录',1954721010120728578,1,'receipt','erp/receipt/index',NULL,1,0,'C','0','1',NULL,'log','admin','2025-11-18 16:58:53','admin','2026-05-08 19:06:09','');
INSERT INTO sys_menu (menu_id,menu_name,parent_id,order_num,path,component,query_param,is_frame,is_cache,menu_type,visible,status,perms,icon,create_by,create_time,update_by,update_time,remark) VALUES (1990706419627556866,'采购汇总',1954721010120728578,13,'report','erp/report/index',NULL,1,0,'C','0','1',NULL,'druid','admin','2025-11-18 16:59:31','admin','2026-05-08 19:05:51','');
INSERT INTO sys_menu (menu_id,menu_name,parent_id,order_num,path,component,query_param,is_frame,is_cache,menu_type,visible,status,perms,icon,create_by,create_time,update_by,update_time,remark) VALUES (1990706698213228545,'退货管理',1954721010120728578,5,'return','erp/return/index',NULL,1,0,'C','0','1',NULL,'guide','admin','2025-11-18 17:00:37','admin','2026-05-08 19:06:06','');
INSERT INTO sys_role_menu (role_id,menu_id) VALUES (1993591990145687554,1955113252714999810);
INSERT INTO sys_role_menu (role_id,menu_id) VALUES (1993591990145687554,1990705902968995841);
INSERT INTO sys_role_menu (role_id,menu_id) VALUES (1993591990145687554,1990706263360372737);
INSERT INTO sys_role_menu (role_id,menu_id) VALUES (1993591990145687554,1990706419627556866);
INSERT INTO sys_role_menu (role_id,menu_id) VALUES (1993591990145687554,1990706698213228545);
qin

View File

@@ -0,0 +1,7 @@
-- ========================================
-- 电子请购单 — 增量变更 1增加审批意见字段
-- ========================================
ALTER TABLE `erp_purchase_requisition`
ADD COLUMN `first_approval_opinion` VARCHAR(500) DEFAULT NULL COMMENT '一审审批意见' AFTER `remark`,
ADD COLUMN `second_approval_opinion` VARCHAR(500) DEFAULT NULL COMMENT '二审审批意见' AFTER `first_approval_opinion`;

View File

@@ -0,0 +1,83 @@
-- ========================================
-- 电子请购单 — 数据库建表脚本
-- 表结构:主表 + 明细表,全部文本字段,不关联任何现有表
-- 对应文档docs/科仑普请购采购单(1).docx
-- ========================================
-- ----------------------------
-- 主表:请购及采购单
-- ----------------------------
DROP TABLE IF EXISTS `erp_purchase_requisition`;
CREATE TABLE `erp_purchase_requisition` (
`req_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
-- 头部(请购人填写)
`req_dept` VARCHAR(100) DEFAULT NULL COMMENT '请购部门',
`item_name` VARCHAR(200) DEFAULT NULL COMMENT '品名',
`specification` VARCHAR(200) DEFAULT NULL COMMENT '规格',
`unit` VARCHAR(20) DEFAULT NULL COMMENT '单位',
`quantity` VARCHAR(50) DEFAULT NULL COMMENT '请购量',
-- 类别与日期
`category` VARCHAR(50) DEFAULT NULL COMMENT '类别',
`required_date` VARCHAR(50) DEFAULT NULL COMMENT '需求日期',
-- 说明
`purpose_desc` VARCHAR(500) DEFAULT NULL COMMENT '用途说明',
`use_dept` VARCHAR(100) DEFAULT NULL COMMENT '使用部门',
-- 采购处理(采购单位填写)
`inspection_condition` VARCHAR(200) DEFAULT NULL COMMENT '品检条件',
`trial_days` VARCHAR(50) DEFAULT NULL COMMENT '试用天数',
`prev_purchase_record` VARCHAR(500) DEFAULT NULL COMMENT '前期采购记录',
`purchase_proposal` VARCHAR(500) DEFAULT NULL COMMENT '采购拟办',
`payment_terms` VARCHAR(200) DEFAULT NULL COMMENT '付款条件',
`total_amount` VARCHAR(200) DEFAULT NULL COMMENT '采购金额',
-- 审批签名8级
`sign_purchase_chairman` VARCHAR(64) DEFAULT NULL COMMENT '董事长(采购单位)',
`sign_purchase_manager` VARCHAR(64) DEFAULT NULL COMMENT '部长/厂长(采购单位)',
`sign_purchase_director` VARCHAR(64) DEFAULT NULL COMMENT '主任(采购单位)',
`sign_purchase_handler` VARCHAR(64) DEFAULT NULL COMMENT '经办(采购单位)',
`sign_request_gm` VARCHAR(64) DEFAULT NULL COMMENT '生产总经理(请购单位)',
`sign_request_factory_mgr` VARCHAR(64) DEFAULT NULL COMMENT '厂长(请购单位)',
`sign_request_director` VARCHAR(64) DEFAULT NULL COMMENT '主任(请购单位)',
`sign_request_handler` VARCHAR(64) DEFAULT NULL COMMENT '经办(请购单位)',
-- 底部
`unload_location` VARCHAR(50) DEFAULT NULL COMMENT '指定卸货位',
`unload_other` VARCHAR(200) DEFAULT NULL COMMENT '卸货其他位置',
-- 状态与控制
`form_status` VARCHAR(20) NOT NULL DEFAULT '0' COMMENT '状态:0=请购草稿 1=请购审批中 2=请购已通过 3=采购处理中 4=已完成 5=已驳回',
`del_flag` VARCHAR(2) NOT NULL DEFAULT '0' COMMENT '删除标志 0=存在 2=删除',
`create_by` VARCHAR(64) DEFAULT NULL COMMENT '创建人',
`create_time` DATETIME DEFAULT NULL COMMENT '创建时间',
`update_by` VARCHAR(64) DEFAULT NULL COMMENT '更新人',
`update_time` DATETIME DEFAULT NULL COMMENT '更新时间',
`remark` VARCHAR(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`req_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='请购及采购单(科仑普)';
-- ----------------------------
-- 明细表请购及采购单明细8行
-- ----------------------------
DROP TABLE IF EXISTS `erp_purchase_requisition_item`;
CREATE TABLE `erp_purchase_requisition_item` (
`item_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '明细ID',
`req_id` BIGINT NOT NULL COMMENT '关联请购单ID → erp_purchase_requisition.req_id',
`seq` VARCHAR(10) NOT NULL COMMENT '项次',
`item_name` VARCHAR(200) DEFAULT NULL COMMENT '品名',
`specification` VARCHAR(200) DEFAULT NULL COMMENT '规格',
`unit` VARCHAR(20) DEFAULT NULL COMMENT '单位',
`quantity` VARCHAR(50) DEFAULT NULL COMMENT '请购量',
`del_flag` VARCHAR(2) NOT NULL DEFAULT '0' COMMENT '删除标志',
`create_by` VARCHAR(64) DEFAULT NULL COMMENT '创建人',
`create_time` DATETIME DEFAULT NULL COMMENT '创建时间',
`update_by` VARCHAR(64) DEFAULT NULL COMMENT '更新人',
`update_time` DATETIME DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`item_id`),
KEY `idx_req_id` (`req_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='请购及采购单明细';

208
docs/purchase-plan-ddl.sql Normal file
View File

@@ -0,0 +1,208 @@
-- 采购计划 (erp_purchase_plan) 相关 DDL
-- 在主库 jdbc:mysql://140.143.206.120:13306/klp-oa-test 上执行
-- 1. 采购计划头
CREATE TABLE IF NOT EXISTS `erp_purchase_plan` (
`plan_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '计划ID',
`plan_no` VARCHAR(64) NOT NULL COMMENT '采购计划号',
`plan_status` CHAR(1) NOT NULL DEFAULT '0' COMMENT '计划状态: 0-进行中 1-已完成归档',
`audit_status` CHAR(1) NOT NULL DEFAULT '0' COMMENT '审核状态: 0-待审核 1-通过 2-驳回',
`audit_opinion` VARCHAR(512) DEFAULT NULL COMMENT '申请/审核意见',
`auditor` VARCHAR(64) DEFAULT NULL COMMENT '审核人',
`audit_time` DATETIME DEFAULT NULL COMMENT '审核时间',
`supplier` VARCHAR(128) DEFAULT NULL COMMENT '供货商',
`purchase_date` DATE DEFAULT NULL COMMENT '采购日期',
`plan_weight` DECIMAL(14,3) NOT NULL DEFAULT 0 COMMENT '计划总重量(T)',
`arrived_weight` DECIMAL(14,3) NOT NULL DEFAULT 0 COMMENT '已到货重量(T)',
`del_flag` CHAR(1) NOT NULL DEFAULT '0' COMMENT '删除标志: 0-存在 2-删除',
`create_by` VARCHAR(64) DEFAULT NULL,
`create_time` DATETIME DEFAULT NULL,
`update_by` VARCHAR(64) DEFAULT NULL,
`update_time` DATETIME DEFAULT NULL,
`remark` VARCHAR(512) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`plan_id`),
UNIQUE KEY `uk_plan_no` (`plan_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='采购计划头';
-- 2. 采购计划明细(多规格行,字段对齐 crm_order_item
CREATE TABLE IF NOT EXISTS `erp_purchase_plan_item` (
`item_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '明细ID',
`plan_id` BIGINT NOT NULL COMMENT '关联计划ID',
`product_type` VARCHAR(64) DEFAULT NULL COMMENT '产品(如热轧卷板)',
`material` VARCHAR(64) DEFAULT NULL COMMENT '材质',
`grade` VARCHAR(64) DEFAULT NULL COMMENT '牌号',
`coil_no` VARCHAR(64) DEFAULT NULL COMMENT '卷号',
`width` VARCHAR(64) DEFAULT NULL COMMENT '宽度(mm可为区间文本对齐 crm_order_item)',
`thickness` VARCHAR(64) DEFAULT NULL COMMENT '厚度(mm可为区间文本)',
`width_tolerance` VARCHAR(64) DEFAULT '0' COMMENT '宽度公差(自由文本)',
`thickness_tolerance` VARCHAR(64) DEFAULT '0' COMMENT '厚度公差(自由文本)',
`weight` DECIMAL(14,3) DEFAULT NULL COMMENT '重量(T)',
`quantity` INT DEFAULT NULL COMMENT '数量(件/卷数,来自合同 product_num)',
`arrived_weight` DECIMAL(14,3) NOT NULL DEFAULT 0 COMMENT '已到货重量(T)由到货Excel按牌号+规格累加',
`item_status` CHAR(1) NOT NULL DEFAULT '0' COMMENT '到货状态: 0-未到货 1-部分到货 2-已到货',
`supplier` VARCHAR(128) DEFAULT NULL COMMENT '供货商',
`del_flag` CHAR(1) NOT NULL DEFAULT '0' COMMENT '删除标志',
`create_by` VARCHAR(64) DEFAULT NULL,
`create_time` DATETIME DEFAULT NULL,
`update_by` VARCHAR(64) DEFAULT NULL,
`update_time` DATETIME DEFAULT NULL,
`remark` VARCHAR(512) DEFAULT NULL,
PRIMARY KEY (`item_id`),
KEY `idx_plan_id` (`plan_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='采购计划明细';
-- 3. 计划↔销售合同(crm_order) 中间表(多对多,挂合同头)
CREATE TABLE IF NOT EXISTS `erp_purchase_plan_contract_rel` (
`rel_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '关系ID',
`plan_id` BIGINT NOT NULL COMMENT '采购计划ID',
`order_id` BIGINT NOT NULL COMMENT '销售合同ID(crm_order.order_id)',
`del_flag` CHAR(1) NOT NULL DEFAULT '0' COMMENT '删除标志',
`create_by` VARCHAR(64) DEFAULT NULL,
`create_time` DATETIME DEFAULT NULL,
`update_by` VARCHAR(64) DEFAULT NULL,
`update_time` DATETIME DEFAULT NULL,
`remark` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`rel_id`),
KEY `idx_plan_id` (`plan_id`),
KEY `idx_order_id` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='采购计划-销售合同关联表';
-- 4. 到货明细(对应上传的到货 Excel一行一卷独立于 WMS
CREATE TABLE IF NOT EXISTS `erp_purchase_plan_delivery` (
`delivery_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '到货明细ID',
`plan_id` BIGINT NOT NULL COMMENT '关联计划ID',
`arrival_date` DATE DEFAULT NULL COMMENT '日期',
`grade` VARCHAR(64) DEFAULT NULL COMMENT '牌号',
`spec` VARCHAR(64) DEFAULT NULL COMMENT '规格(厚×宽)',
`coil_no` VARCHAR(64) DEFAULT NULL COMMENT '卷号',
`coil_weight` DECIMAL(14,3) DEFAULT NULL COMMENT '单卷重量(T)',
`truck_no` VARCHAR(64) DEFAULT NULL COMMENT '车号',
`truck_weight` DECIMAL(14,3) DEFAULT NULL COMMENT '整车数量(T)',
`piece_count` INT DEFAULT NULL COMMENT '件数',
`sales_code` VARCHAR(64) DEFAULT NULL COMMENT '销售代码',
`arrival_station` VARCHAR(64) DEFAULT NULL COMMENT '钢厂到站',
`del_flag` CHAR(1) NOT NULL DEFAULT '0' COMMENT '删除标志',
`create_by` VARCHAR(64) DEFAULT NULL,
`create_time` DATETIME DEFAULT NULL,
`update_by` VARCHAR(64) DEFAULT NULL,
`update_time` DATETIME DEFAULT NULL,
`remark` VARCHAR(512) DEFAULT NULL,
PRIMARY KEY (`delivery_id`),
KEY `idx_plan_id` (`plan_id`),
KEY `idx_coil_no` (`coil_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='采购计划到货明细';
-- 5. 到货上传批次(每上传一份到货表格记一条,便于随时回看每一次上传)
CREATE TABLE IF NOT EXISTS `erp_purchase_plan_delivery_batch` (
`batch_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '批次ID',
`plan_id` BIGINT NOT NULL COMMENT '关联计划ID',
`file_name` VARCHAR(255) DEFAULT NULL COMMENT '文件名',
`row_count` INT DEFAULT 0 COMMENT '本次到货行数',
`matched_count` INT DEFAULT 0 COMMENT '本次匹配上明细卷号的卷数',
`arrived_percent` DECIMAL(6,2) DEFAULT 0 COMMENT '上传后到货百分比快照',
`del_flag` CHAR(1) NOT NULL DEFAULT '0' COMMENT '删除标志',
`create_by` VARCHAR(64) DEFAULT NULL,
`create_time` DATETIME DEFAULT NULL,
`update_by` VARCHAR(64) DEFAULT NULL,
`update_time` DATETIME DEFAULT NULL,
`remark` VARCHAR(512) DEFAULT NULL,
PRIMARY KEY (`batch_id`),
KEY `idx_plan_id` (`plan_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='采购计划到货上传批次';
-- 6. 供应商往来流水台账
CREATE TABLE IF NOT EXISTS `erp_supplier_transaction` (
`txn_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '往来流水ID',
`supplier_id` BIGINT NOT NULL COMMENT '关联供应商ID',
`txn_date` DATE DEFAULT NULL COMMENT '发生日期',
`txn_type` CHAR(1) NOT NULL DEFAULT '1' COMMENT '类型: 1-采购应付 2-付款 3-退货 4-其他',
`amount` DECIMAL(16,2) NOT NULL DEFAULT 0 COMMENT '金额',
`doc_no` VARCHAR(64) DEFAULT NULL COMMENT '单据号',
`del_flag` CHAR(1) NOT NULL DEFAULT '0' COMMENT '删除标志',
`create_by` VARCHAR(64) DEFAULT NULL,
`create_time` DATETIME DEFAULT NULL,
`update_by` VARCHAR(64) DEFAULT NULL,
`update_time` DATETIME DEFAULT NULL,
`remark` VARCHAR(512) DEFAULT NULL,
PRIMARY KEY (`txn_id`),
KEY `idx_supplier_id` (`supplier_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='供应商往来流水台账';
-- ====== 既有表增列(幂等:列不存在才加) ======
SET @c := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'erp_purchase_plan_delivery' AND COLUMN_NAME = 'batch_id');
SET @s := IF(@c = 0, 'ALTER TABLE erp_purchase_plan_delivery ADD COLUMN batch_id BIGINT NULL COMMENT ''关联上传批次ID'' AFTER plan_id', 'SELECT 1');
PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- 到货行是否 WMS 钢卷表已确认到货(supplier_coil_no 存在且 data_type<>10)
SET @c := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'erp_purchase_plan_delivery' AND COLUMN_NAME = 'arrived');
SET @s := IF(@c = 0, 'ALTER TABLE erp_purchase_plan_delivery ADD COLUMN arrived TINYINT NOT NULL DEFAULT 0 COMMENT ''是否WMS确认到货:1是0否'' AFTER batch_id', 'SELECT 1');
PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- 计划要求总数量(卷/件) = Σ明细数量
SET @c := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'erp_purchase_plan' AND COLUMN_NAME = 'plan_qty');
SET @s := IF(@c = 0, 'ALTER TABLE erp_purchase_plan ADD COLUMN plan_qty INT NOT NULL DEFAULT 0 COMMENT ''计划要求总数量(卷/件)'' AFTER arrived_weight', 'SELECT 1');
PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- 已到货卷数 = WMS确认到货的上传卷数
SET @c := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'erp_purchase_plan' AND COLUMN_NAME = 'arrived_count');
SET @s := IF(@c = 0, 'ALTER TABLE erp_purchase_plan ADD COLUMN arrived_count INT NOT NULL DEFAULT 0 COMMENT ''已到货卷数'' AFTER plan_qty', 'SELECT 1');
PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- 2026-06-29 大改:采购计划→采购合同;要求改为 规格+总重量+厂商;到货区分已到/在途
SET @c := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'erp_purchase_plan_item' AND COLUMN_NAME = 'spec');
SET @s := IF(@c = 0, 'ALTER TABLE erp_purchase_plan_item ADD COLUMN spec VARCHAR(128) DEFAULT NULL COMMENT ''规格'' AFTER plan_id', 'SELECT 1');
PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @c := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'erp_purchase_plan_item' AND COLUMN_NAME = 'manufacturer');
SET @s := IF(@c = 0, 'ALTER TABLE erp_purchase_plan_item ADD COLUMN manufacturer VARCHAR(128) DEFAULT NULL COMMENT ''厂商(手填,历史记忆)'' AFTER spec', 'SELECT 1');
PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @c := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'erp_purchase_plan_delivery' AND COLUMN_NAME = 'in_transit');
SET @s := IF(@c = 0, 'ALTER TABLE erp_purchase_plan_delivery ADD COLUMN in_transit TINYINT NOT NULL DEFAULT 0 COMMENT ''是否在途:1是0否(钢卷表存在且data_type=10)'' AFTER arrived', 'SELECT 1');
PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @c := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'erp_purchase_plan' AND COLUMN_NAME = 'in_transit_count');
SET @s := IF(@c = 0, 'ALTER TABLE erp_purchase_plan ADD COLUMN in_transit_count INT NOT NULL DEFAULT 0 COMMENT ''在途卷数'' AFTER arrived_count', 'SELECT 1');
PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @c := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'erp_purchase_plan' AND COLUMN_NAME = 'in_transit_weight');
SET @s := IF(@c = 0, 'ALTER TABLE erp_purchase_plan ADD COLUMN in_transit_weight DECIMAL(14,3) NOT NULL DEFAULT 0 COMMENT ''在途重量(T)'' AFTER in_transit_count', 'SELECT 1');
PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- ============ 菜单 ============
-- 采购目录挂在「生产辅助」(path=helper) 下;父 id 按 path 动态解析,兼容不同环境的不同 menu_id。
-- 整段可重复执行(叶子菜单用 REPLACE目录用 存在判断 + 归位 UPDATE
-- 1) 解析「生产辅助」目录 id
SET @helper_id = (SELECT menu_id FROM (SELECT menu_id FROM sys_menu WHERE path = 'helper' AND parent_id = 0 LIMIT 1) t);
-- 2) 确保「采购」目录存在(不存在则在「生产辅助」下创建;用派生表规避同表 INSERT...SELECT 限制)
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark)
SELECT 2100000000000000000, '采购', @helper_id, 50, 'purchase', '', '', 1, 0, 'M', '0', '0', '', 'shopping', 'admin', sysdate(), '采购目录'
FROM dual
WHERE NOT EXISTS (SELECT 1 FROM (SELECT menu_id FROM sys_menu WHERE path = 'purchase' AND menu_type = 'M') x);
-- 3) 无论新建还是已存在确保「采购」目录归位到「生产辅助」下并设为显示visible=0否则其下所有菜单都不会出现在侧边栏
UPDATE sys_menu SET parent_id = @helper_id, visible = '0', status = '0' WHERE path = 'purchase' AND menu_type = 'M';
-- 4) 解析「采购」目录 id供下方叶子菜单使用
SET @purchase_id = (SELECT menu_id FROM (SELECT menu_id FROM sys_menu WHERE path = 'purchase' AND menu_type = 'M' LIMIT 1) t);
-- 5) 采购计划 + 按钮REPLACE 可重复执行)
REPLACE INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) VALUES
(2100000000000000001, '采购合同', @purchase_id, 2, 'purchasePlan', 'erp/purchasePlan/index', '', 1, 0, 'C', '0', '0', 'erp:purchasePlan:list', 'form', 'admin', sysdate(), '采购合同菜单'),
(2100000000000000002, '采购合同查询', 2100000000000000001, 1, '', '', '', 1, 0, 'F', '0', '0', 'erp:purchasePlan:query', '#', 'admin', sysdate(), ''),
(2100000000000000003, '采购合同新增', 2100000000000000001, 2, '', '', '', 1, 0, 'F', '0', '0', 'erp:purchasePlan:add', '#', 'admin', sysdate(), ''),
(2100000000000000004, '采购合同修改', 2100000000000000001, 3, '', '', '', 1, 0, 'F', '0', '0', 'erp:purchasePlan:edit', '#', 'admin', sysdate(), ''),
(2100000000000000005, '采购合同删除', 2100000000000000001, 4, '', '', '', 1, 0, 'F', '0', '0', 'erp:purchasePlan:remove', '#', 'admin', sysdate(), ''),
(2100000000000000006, '到货导入', 2100000000000000001, 5, '', '', '', 1, 0, 'F', '0', '0', 'erp:purchasePlan:import', '#', 'admin', sysdate(), '');
-- 6) 采购审核 + 按钮REPLACE 可重复执行)
REPLACE INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) VALUES
(2100000000000000010, '采购审核', @purchase_id, 3, 'purchaseAudit', 'erp/purchaseAudit/index', '', 1, 0, 'C', '0', '0', 'erp:purchasePlan:auditList', 'validCode', 'admin', sysdate(), '采购审核菜单'),
(2100000000000000011, '审核操作', 2100000000000000010, 1, '', '', '', 1, 0, 'F', '0', '0', 'erp:purchasePlan:audit', '#', 'admin', sysdate(), '');
-- 7) 到货记录(审核通过的计划上传到货表格、按卷号比对、到货百分比)
REPLACE INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) VALUES
(2100000000000000020, '到货记录', @purchase_id, 4, 'purchaseDelivery', 'erp/purchaseDelivery/index', '', 1, 0, 'C', '0', '0', 'erp:purchasePlan:list', 'truck', 'admin', sysdate(), '到货记录与卷号比对');

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,25 @@
-- =============================================================
-- 线上线下库对齐修复脚本
-- 用于 klp-oa线上和 klp-oa-test线下
-- =============================================================
SET NAMES utf8mb4;
-- ==================== 第一部分:补字典(两边都执行) ====================
-- 1.1 regrade_quality_type 字典类型
INSERT IGNORE INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time, update_by, update_time, remark)
VALUES ('改判后质量状态', 'regrade_quality_type', '0', 'admin', NOW(), 'admin', NOW(), '');
-- 1.2 regrade_quality_type 字典数据
INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
VALUES (1, '协议销售', 'protocol_sale', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW()),
(2, '转分剪', 'to_slitting', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW()),
(3, '降级', 'downgrade', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW()),
(4, '返修', 'rework', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW()),
(5, '报废', 'scrap', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW());
-- 1.3 quality_review_status 补充缺失数据
INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
VALUES (2, '待审批', '2', 'quality_review_status', '', 'warning', 'Y', '0', 'admin', NOW()),
(3, '已通过', '3', 'quality_review_status', '', 'success', 'Y', '0', 'admin', NOW()),
(4, '已驳回', '4', 'quality_review_status', '', 'danger', 'Y', '0', 'admin', NOW());

View File

@@ -0,0 +1,51 @@
-- =============================================================
-- 线上线下库对齐修复修复版v2
-- 适配 dict_code / dict_id 非自增的表结构
-- =============================================================
SET NAMES utf8mb4;
-- ==================== 1. 补字典类型 ====================
SET @max_dict_id = (SELECT COALESCE(MAX(dict_id), 0) FROM sys_dict_type);
INSERT IGNORE INTO sys_dict_type (dict_id, dict_name, dict_type, status, create_by, create_time)
VALUES (@max_dict_id + 1, '改判后质量状态', 'regrade_quality_type', '0', 'admin', NOW());
-- ==================== 2. 补字典数据 ====================
SET @max_code = (SELECT COALESCE(MAX(dict_code), 0) FROM sys_dict_data);
SET @code = @max_code + 1;
-- quality_review_status 缺失的3条
INSERT IGNORE INTO sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
VALUES (@code, 2, '待审批', '2', 'quality_review_status', '', 'warning', 'Y', '0', 'admin', NOW());
SET @code = @code + 1;
INSERT IGNORE INTO sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
VALUES (@code, 3, '已通过', '3', 'quality_review_status', '', 'success', 'Y', '0', 'admin', NOW());
SET @code = @code + 1;
INSERT IGNORE INTO sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
VALUES (@code, 4, '已驳回', '4', 'quality_review_status', '', 'danger', 'Y', '0', 'admin', NOW());
SET @code = @code + 1;
-- regrade_quality_type 5条
INSERT IGNORE INTO sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
VALUES (@code, 1, '协议销售', 'protocol_sale', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW());
SET @code = @code + 1;
INSERT IGNORE INTO sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
VALUES (@code, 2, '转分剪', 'to_slitting', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW());
SET @code = @code + 1;
INSERT IGNORE INTO sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
VALUES (@code, 3, '降级', 'downgrade', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW());
SET @code = @code + 1;
INSERT IGNORE INTO sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
VALUES (@code, 4, '返修', 'rework', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW());
SET @code = @code + 1;
INSERT IGNORE INTO sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
VALUES (@code, 5, '报废', 'scrap', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW());
-- ==================== 3. 验证 ====================
SELECT 'Dict fix OK' AS result;

69
docs/sql_align_dev.sql Normal file
View File

@@ -0,0 +1,69 @@
-- =============================================================
-- 线下库 klp-oa-test 菜单对齐修复
-- 将质量评审菜单从"质量管理"下移到"评审流程"目录下
-- 并补充次品钢卷、O级卷菜单
-- =============================================================
SET NAMES utf8mb4;
-- ==================== 1. 清理旧的质量评审菜单 ====================
DELETE FROM sys_role_menu WHERE menu_id IN (2100000000000000036,2100000000000000037,2100000000000000038,2100000000000000039,2100000000000000040,2100000000000000041,2100000000000000042,2100000000000000043);
DELETE FROM sys_menu WHERE menu_id IN (2100000000000000036,2100000000000000037,2100000000000000038,2100000000000000039,2100000000000000040,2100000000000000041,2100000000000000042,2100000000000000043);
-- 计算可用菜单ID
SET @max_id = (SELECT COALESCE(MAX(menu_id), 0) FROM sys_menu);
-- ==================== 2. 创建"评审流程"目录(挂在质量管理下) ====================
SET @parent_quality = 2068954238598967297; -- 质量管理
SET @id_review_dir = @max_id + 1;
INSERT IGNORE INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, is_frame, is_cache, menu_type, visible, status, icon, create_by, create_time, update_by, update_time)
VALUES (@id_review_dir, '评审流程', @parent_quality, 5, 'review', 1, 0, 'M', '0', '0', 'guide', 'admin', NOW(), 'admin', NOW());
-- ==================== 3. 在评审流程下创建子菜单 ====================
SET @parent = @id_review_dir;
SET @id = @max_id + 2;
-- 次品钢卷 (order=4)
INSERT IGNORE INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, icon, create_by, create_time)
VALUES (@id, '次品钢卷', @parent, 4, 'rubbish', 'wms/coil/views/scrap', 1, 0, 'C', '0', '0', 'checkbox', 'admin', NOW());
SET @id = @id + 1;
-- O级卷 (order=5)
INSERT IGNORE INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, icon, create_by, create_time)
VALUES (@id, 'O级卷', @parent, 5, 'jishu', 'wms/coil/views/jishu', 1, 0, 'C', '0', '0', 'checkbox', 'admin', NOW());
SET @id = @id + 1;
-- 质量评审 (order=6)
SET @id_review_menu = @id;
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time)
VALUES (@id_review_menu, '质量评审', @parent, 6, 'qualityReview', 'mes/qc/qualityReview/index', 1, 0, 'C', '0', '0', 'qc:qualityReview:list', 'guide', 'admin', NOW());
SET @id = @id + 1;
-- 质量评审待审批 (order=7, 隐藏)
SET @id_review_todo = @id;
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time)
VALUES (@id_review_todo, '质量评审待审批', @parent, 7, 'qualityReviewTodo', 'mes/qc/qualityReview/todo', 1, 0, 'C', '1', '0', 'qc:qualityReview:approve', 'checkbox', 'admin', NOW());
SET @id = @id + 1;
-- ==================== 4. 按钮权限(挂在质量评审菜单下) ====================
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, menu_type, visible, status, perms, create_by, create_time)
VALUES (@id, '质量评审新增', @id_review_menu, 1, 'F', '0', '0', 'qc:qualityReview:add', 'admin', NOW()); SET @id = @id + 1;
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, menu_type, visible, status, perms, create_by, create_time)
VALUES (@id, '质量评审修改', @id_review_menu, 2, 'F', '0', '0', 'qc:qualityReview:edit', 'admin', NOW()); SET @id = @id + 1;
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, menu_type, visible, status, perms, create_by, create_time)
VALUES (@id, '质量评审删除', @id_review_menu, 3, 'F', '0', '0', 'qc:qualityReview:delete', 'admin', NOW()); SET @id = @id + 1;
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, menu_type, visible, status, perms, create_by, create_time)
VALUES (@id, '质量评审提交送审', @id_review_menu, 4, 'F', '0', '0', 'qc:qualityReview:submit', 'admin', NOW()); SET @id = @id + 1;
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, menu_type, visible, status, perms, create_by, create_time)
VALUES (@id, '质量评审审批', @id_review_menu, 5, 'F', '0', '0', 'qc:qualityReview:approve', 'admin', NOW()); SET @id = @id + 1;
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, menu_type, visible, status, perms, create_by, create_time)
VALUES (@id, '质量评审执行改判', @id_review_menu, 6, 'F', '0', '0', 'qc:qualityReview:execute', 'admin', NOW());
-- ==================== 5. 授权admin角色 ====================
INSERT IGNORE INTO sys_role_menu (role_id, menu_id) VALUES
(1, @parent_quality), (1, @id_review_dir),
(1, @id_review_menu), (1, @id_review_todo);
-- 按钮权限
INSERT IGNORE INTO sys_role_menu (role_id, menu_id) SELECT 1, menu_id FROM sys_menu WHERE parent_id = @id_review_menu AND menu_type = 'F';
-- ==================== 6. 验证 ====================
SELECT 'Dev align OK' AS result;

38
docs/sql_fix_online.sql Normal file
View File

@@ -0,0 +1,38 @@
-- =============================================================
-- 线上 klp-oa 库修复脚本
-- 1. 删除乱码父菜单
-- 2. 补充缺失字典
-- =============================================================
SET NAMES utf8mb4;
-- ========== 1. 清理乱码父菜单 ==========
DELETE FROM sys_role_menu WHERE menu_id = 2100000000000000035;
DELETE FROM sys_menu WHERE menu_id = 2100000000000000035;
-- ========== 2. 补充缺失字典类型 ==========
INSERT IGNORE INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time, update_by, update_time, remark)
VALUES ('改判后质量状态', 'regrade_quality_type', '0', 'admin', NOW(), 'admin', NOW(), '');
-- ========== 3. 补充缺失字典数据 ==========
-- quality_review_status 缺的3条
INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
VALUES (2, '待审批', '2', 'quality_review_status', '', 'warning', 'Y', '0', 'admin', NOW());
INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
VALUES (3, '已通过', '3', 'quality_review_status', '', 'success', 'Y', '0', 'admin', NOW());
INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
VALUES (4, '已驳回', '4', 'quality_review_status', '', 'danger', 'Y', '0', 'admin', NOW());
-- regrade_quality_type 全部5条
INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
VALUES (1, '协议销售', 'protocol_sale', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW());
INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
VALUES (2, '转分剪', 'to_slitting', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW());
INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
VALUES (3, '降级', 'downgrade', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW());
INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
VALUES (4, '返修', 'rework', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW());
INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
VALUES (5, '报废', 'scrap', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW());
-- ========== 4. 验证 ==========
SELECT 'OK' as result FROM sys_dict_type WHERE dict_type = 'regrade_quality_type' LIMIT 1;

View File

@@ -0,0 +1,153 @@
-- =============================================================
-- 质量评审流程 - 安装脚本
-- 用法: mysql -h 140.143.206.120 -P 13306 -u klp -p 数据库名 --default-character-set=utf8mb4 < 本文件
-- =============================================================
SET NAMES utf8mb4;
-- ========== 1. 彻底清理所有质量评审相关数据 ==========
-- 删除角色-菜单关联
DELETE FROM sys_role_menu WHERE menu_id IN (SELECT menu_id FROM sys_menu WHERE perms LIKE '%qualityReview%');
DELETE FROM sys_role_menu WHERE menu_id IN (SELECT menu_id FROM sys_menu WHERE menu_name = '质量评审' OR menu_name = '质量评审待审批');
-- 删除菜单本身
DELETE FROM sys_menu WHERE perms LIKE '%qualityReview%';
DELETE FROM sys_menu WHERE menu_name = '质量评审';
DELETE FROM sys_menu WHERE menu_name = '质量评审待审批';
-- 删除字典
DELETE FROM sys_dict_data WHERE dict_type = 'quality_review_status';
DELETE FROM sys_dict_data WHERE dict_type = 'regrade_quality_type';
DELETE FROM sys_dict_type WHERE dict_type = 'quality_review_status';
DELETE FROM sys_dict_type WHERE dict_type = 'regrade_quality_type';
-- 删表
DROP TABLE IF EXISTS qc_quality_review_log;
DROP TABLE IF EXISTS qc_quality_review_coil;
DROP TABLE IF EXISTS qc_quality_review;
-- ========== 2. 建表 ==========
CREATE TABLE IF NOT EXISTS `qc_quality_review` (
`review_id` bigint NOT NULL AUTO_INCREMENT COMMENT '评审单主键',
`review_no` varchar(50) NOT NULL COMMENT '评审单编号',
`product_name` varchar(100) DEFAULT NULL COMMENT '产品名称',
`transmit_dept` varchar(50) DEFAULT NULL COMMENT '传递部门',
`transmit_user` varchar(50) DEFAULT NULL COMMENT '传递人',
`transmit_date` date DEFAULT NULL COMMENT '传递日期',
`prod_date_range` varchar(50) DEFAULT NULL COMMENT '生产日期范围',
`flow_status` tinyint(1) DEFAULT '1' COMMENT '流程状态: 1=待提交 2=待审批 3=已通过 4=已驳回',
`dept_opinion` text COMMENT '品质部评审意见',
`dept_sign` varchar(50) DEFAULT NULL COMMENT '品质部签字人',
`dept_sign_date` date DEFAULT NULL COMMENT '品质部签字日期',
`leader_opinion` text COMMENT '领导审批意见',
`leader_sign` varchar(50) DEFAULT NULL COMMENT '领导签字人',
`leader_sign_date` date DEFAULT NULL COMMENT '领导签字日期',
`reject_reason` varchar(500) DEFAULT NULL COMMENT '驳回原因',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`del_flag` tinyint(1) DEFAULT '0' COMMENT '删除标志',
`create_by` varchar(50) DEFAULT NULL,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_by` varchar(50) DEFAULT NULL,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`review_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='质量评审单';
CREATE TABLE IF NOT EXISTS `qc_quality_review_coil` (
`detail_id` bigint NOT NULL AUTO_INCREMENT COMMENT '明细主键',
`review_id` bigint NOT NULL COMMENT '关联评审单ID',
`group_seq` int DEFAULT NULL COMMENT '序号',
`group_remark` varchar(200) DEFAULT NULL COMMENT '组备注',
`coil_id` bigint DEFAULT NULL COMMENT '钢卷ID',
`current_coil_no` varchar(50) DEFAULT NULL COMMENT '产品卷号',
`supplier_coil_no` varchar(50) DEFAULT NULL COMMENT '原料卷号',
`spec` varchar(50) DEFAULT NULL COMMENT '规格',
`net_weight` decimal(10,3) DEFAULT NULL COMMENT '卷重(t)',
`defect_desc` text COMMENT '缺陷描述',
`before_quality` varchar(20) DEFAULT NULL COMMENT '改判前质量等级',
`regrade_quality` varchar(50) DEFAULT NULL COMMENT '改判后质量状态',
`execute_status` tinyint(1) DEFAULT '0' COMMENT '执行状态: 0=待执行 1=已执行',
`execute_time` datetime DEFAULT NULL COMMENT '执行时间',
`remark` varchar(500) DEFAULT NULL,
`del_flag` tinyint(1) DEFAULT '0',
`create_by` varchar(50) DEFAULT NULL,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_by` varchar(50) DEFAULT NULL,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`detail_id`),
KEY `idx_review_id` (`review_id`),
KEY `idx_coil_id` (`coil_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='质量评审钢卷明细';
CREATE TABLE IF NOT EXISTS `qc_quality_review_log` (
`log_id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志主键',
`review_id` bigint NOT NULL COMMENT '关联评审单ID',
`action` varchar(20) NOT NULL COMMENT '动作: submit/approve/reject',
`operator` varchar(50) DEFAULT NULL COMMENT '操作人',
`opinion` text COMMENT '审批意见',
`operate_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间',
`create_by` varchar(50) DEFAULT NULL,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`log_id`),
KEY `idx_review_id` (`review_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='质量评审审批日志';
-- ========== 3. 字典 ==========
INSERT IGNORE INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time, update_by, update_time, remark)
VALUES ('Quality Review Status', 'quality_review_status', '0', 'admin', NOW(), 'admin', NOW(), '');
INSERT IGNORE INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time, update_by, update_time, remark)
VALUES ('Regrade Quality Type', 'regrade_quality_type', '0', 'admin', NOW(), 'admin', NOW(), '');
INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time) VALUES (1, '待提交', '1', 'quality_review_status', '', 'info', 'Y', '0', 'admin', NOW());
INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time) VALUES (2, '待审批', '2', 'quality_review_status', '', 'warning', 'Y', '0', 'admin', NOW());
INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time) VALUES (3, '已通过', '3', 'quality_review_status', '', 'success', 'Y', '0', 'admin', NOW());
INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time) VALUES (4, '已驳回', '4', 'quality_review_status', '', 'danger', 'Y', '0', 'admin', NOW());
INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time) VALUES (1, '协议销售', 'protocol_sale', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW());
INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time) VALUES (2, '转分剪', 'to_slitting', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW());
INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time) VALUES (3, '降级', 'downgrade', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW());
INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time) VALUES (4, '返修', 'rework', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW());
INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time) VALUES (5, '报废', 'scrap', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW());
-- ========== 4. 创建菜单 ==========
-- 父菜单: 质量模块 (path=quality, menu_id=2068954238598967297)
SET @parent_id = 2068954238598967297;
SET @max_order = (SELECT COALESCE(MAX(order_num), 0) FROM sys_menu WHERE parent_id = @parent_id);
SET @max_id = (SELECT COALESCE(MAX(menu_id), 0) FROM sys_menu);
SET @id1 = @max_id + 1;
SET @id2 = @max_id + 2;
SET @id3 = @max_id + 3;
SET @id4 = @max_id + 4;
SET @id5 = @max_id + 5;
SET @id6 = @max_id + 6;
SET @id7 = @max_id + 7;
SET @id8 = @max_id + 8;
-- 质量评审菜单 (type=C 菜单)
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time)
VALUES (@id1, '质量评审', @parent_id, @max_order + 1, 'qualityReview', 'mes/qc/qualityReview/index', 1, 0, 'C', '0', '0', 'qc:qualityReview:list', 'guide', 'admin', NOW());
-- 质量评审待审批 (type=C 隐藏)
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time)
VALUES (@id2, '质量评审待审批', @parent_id, @max_order + 2, 'qualityReviewTodo', 'mes/qc/qualityReview/todo', 1, 0, 'C', '1', '0', 'qc:qualityReview:approve', 'checkbox', 'admin', NOW());
-- 按钮权限 (type=F)
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, menu_type, visible, status, perms, create_by, create_time)
VALUES (@id3, '质量评审新增', @id1, 1, 'F', '0', '0', 'qc:qualityReview:add', 'admin', NOW());
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, menu_type, visible, status, perms, create_by, create_time)
VALUES (@id4, '质量评审修改', @id1, 2, 'F', '0', '0', 'qc:qualityReview:edit', 'admin', NOW());
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, menu_type, visible, status, perms, create_by, create_time)
VALUES (@id5, '质量评审删除', @id1, 3, 'F', '0', '0', 'qc:qualityReview:delete', 'admin', NOW());
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, menu_type, visible, status, perms, create_by, create_time)
VALUES (@id6, '质量评审提交送审', @id1, 4, 'F', '0', '0', 'qc:qualityReview:submit', 'admin', NOW());
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, menu_type, visible, status, perms, create_by, create_time)
VALUES (@id7, '质量评审审批', @id1, 5, 'F', '0', '0', 'qc:qualityReview:approve', 'admin', NOW());
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, menu_type, visible, status, perms, create_by, create_time)
VALUES (@id8, '质量评审执行改判', @id1, 6, 'F', '0', '0', 'qc:qualityReview:execute', 'admin', NOW());
-- ========== 5. 授权 admin 角色 ==========
INSERT IGNORE INTO sys_role_menu (role_id, menu_id) VALUES
(1, @parent_id), (1, @id1), (1, @id2),
(1, @id3), (1, @id4), (1, @id5),
(1, @id6), (1, @id7), (1, @id8);
-- ========== 6. 验证 ==========
SELECT CONCAT('Tables: ', COUNT(*)) AS result FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME LIKE 'qc_quality_review%';
SELECT CONCAT('Dict: ', dict_type) AS result FROM sys_dict_type WHERE dict_type = 'quality_review_status';
SELECT CONCAT('Menu: ', menu_name, ' -> parent_id=', parent_id) AS result FROM sys_menu WHERE perms = 'qc:qualityReview:list';

View File

@@ -129,6 +129,28 @@
<artifactId>klp-cost</artifactId>
</dependency>
<dependency>
<groupId>com.klp</groupId>
<artifactId>klp-flow</artifactId>
</dependency>
<!-- 产品和工艺模块-->
<dependency>
<groupId>com.klp</groupId>
<artifactId>klp-pt</artifactId>
</dependency>
<!-- 工艺模型配置模块-->
<dependency>
<groupId>com.klp</groupId>
<artifactId>klp-pltcm</artifactId>
</dependency>
<!-- 性能管理模块-->
<dependency>
<groupId>com.klp</groupId>
<artifactId>klp-perf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>

View File

@@ -361,6 +361,15 @@ public class SqlServerApiClient {
);
}
public ExecuteSqlResponse queryExcoilByHotCoilId(String hotCoilId) {
return executeSql(
"oracle",
"select * from JXPLTCM.PLTCM_PDO_EXCOIL where HOT_COILID = :hotCoilId",
singletonParam("hotCoilId", hotCoilId)
);
}
public ExecuteSqlResponse queryPlanListByHotCoilIdLike(String hotCoilId, int page, int pageSize) {
int endRow = page * pageSize;
int startRow = endRow - pageSize;
@@ -504,7 +513,7 @@ public class SqlServerApiClient {
params.put("endRow", endRow);
StringBuilder where = new StringBuilder();
if (coilId != null && !coilId.trim().isEmpty()) {
where.append(" AND UPPER(EXCOILID) LIKE '%' || UPPER(:coilId) || '%'");
where.append(" AND (UPPER(EXCOILID) LIKE '%' || UPPER(:coilId) || '%' OR UPPER(HOT_COILID) LIKE '%' || UPPER(:coilId) || '%')");
params.put("coilId", coilId.trim());
}
if (startDate != null && !startDate.trim().isEmpty()) {
@@ -524,7 +533,7 @@ public class SqlServerApiClient {
Map<String, Object> params = new java.util.HashMap<>();
StringBuilder where = new StringBuilder();
if (coilId != null && !coilId.trim().isEmpty()) {
where.append(" AND UPPER(EXCOILID) LIKE '%' || UPPER(:coilId) || '%'");
where.append(" AND (UPPER(EXCOILID) LIKE '%' || UPPER(:coilId) || '%' OR UPPER(HOT_COILID) LIKE '%' || UPPER(:coilId) || '%')");
params.put("coilId", coilId.trim());
}
if (startDate != null && !startDate.trim().isEmpty()) {

View File

@@ -122,7 +122,10 @@ public class SqlServerApiBusinessService {
* 计划详情:按热卷号查询。
*/
public PlanDetailView getPlanByHotCoilId(String hotCoilId) {
return PlanDetailView.fromExecuteSqlResponse(hotCoilId, client.queryPlanByHotCoilId(hotCoilId));
SqlServerApiClient.ExecuteSqlResponse planResponse = client.queryPlanByHotCoilId(hotCoilId);
SqlServerApiClient.ExecuteSqlResponse excoilResponse = null;
excoilResponse = client.queryExcoilByHotCoilId(hotCoilId);
return PlanDetailView.fromExecuteSqlResponse(hotCoilId, planResponse, excoilResponse);
}
/**
@@ -249,6 +252,49 @@ public class SqlServerApiBusinessService {
);
}
/**
* 测试用:统计 V_VBDA_GAUGE 中各 THICK 列的非空/非零数量,
* 用于排查"末架出口厚度恒为 0"问题——确认实际数据落在哪一列。
*/
public Map<String, Object> getGaugeStats(String matId) {
List<Map<String, Object>> rows = asRowList(client.queryGaugeByMatId(matId));
String[] cols = {"THICK0", "THICK1", "THICK4", "THICK5",
"THICK0REF", "THICK1REF", "THICK4REF", "THICK5REF"};
Map<String, Object> stats = new LinkedHashMap<>();
for (String col : cols) {
long nonNull = 0, nonZero = 0;
Double min = null, max = null;
for (Map<String, Object> r : rows) {
Object raw = r.get(col);
if (raw == null) raw = r.get(col.toLowerCase());
if (raw == null) continue;
nonNull++;
Number n = asNumber(raw);
if (n == null) continue;
double d = n.doubleValue();
if (d != 0.0) nonZero++;
if (min == null || d < min) min = d;
if (max == null || d > max) max = d;
}
Map<String, Object> info = new LinkedHashMap<>();
info.put("nonNullCount", nonNull);
info.put("nonZeroCount", nonZero);
info.put("min", min);
info.put("max", max);
stats.put(col, info);
}
Map<String, Object> result = new LinkedHashMap<>();
result.put("matId", matId);
result.put("totalRows", rows.size());
result.put("columnStats", stats);
List<Map<String, Object>> samples = new ArrayList<>();
if (!rows.isEmpty()) samples.add(rows.get(0));
if (rows.size() > 1) samples.add(rows.get(rows.size() / 2));
if (rows.size() > 2) samples.add(rows.get(rows.size() - 1));
result.put("sampleRows", samples);
return result;
}
/**
* 轧辊数据:返回全部在辊/备辊数据。
*/
@@ -378,11 +424,13 @@ public class SqlServerApiBusinessService {
private final String coilId;
private final List<Map<String, Object>> rows;
private final Map<String, Object> firstRow;
private final List<Map<String, Object>> excoilRows;
public PlanDetailView(String coilId, List<Map<String, Object>> rows, Map<String, Object> firstRow) {
public PlanDetailView(String coilId, List<Map<String, Object>> rows, Map<String, Object> firstRow, List<Map<String, Object>> excoilRows) {
this.coilId = coilId;
this.rows = rows;
this.firstRow = firstRow;
this.excoilRows = excoilRows;
}
public String getCoilId() {
@@ -397,10 +445,21 @@ public class SqlServerApiBusinessService {
return firstRow;
}
public List<Map<String, Object>> getExcoilRows() {
return excoilRows;
}
public static PlanDetailView fromExecuteSqlResponse(String coilId, SqlServerApiClient.ExecuteSqlResponse response) {
List<Map<String, Object>> rows = asRowList(response);
Map<String, Object> firstRow = rows.isEmpty() ? Collections.<String, Object>emptyMap() : rows.get(0);
return new PlanDetailView(coilId, rows, firstRow);
return new PlanDetailView(coilId, rows, firstRow, Collections.<Map<String, Object>>emptyList());
}
public static PlanDetailView fromExecuteSqlResponse(String coilId, SqlServerApiClient.ExecuteSqlResponse response, SqlServerApiClient.ExecuteSqlResponse excoilResponse) {
List<Map<String, Object>> rows = asRowList(response);
Map<String, Object> firstRow = rows.isEmpty() ? Collections.<String, Object>emptyMap() : rows.get(0);
List<Map<String, Object>> excoilRows = asRowList(excoilResponse);
return new PlanDetailView(coilId, rows, firstRow, excoilRows);
}
}

View File

@@ -94,6 +94,15 @@ public class SqlServerApiController {
return R.ok(businessService.getRealtimeData(matId));
}
/**
* 测试用V_VBDA_GAUGE 各 THICK 列非空/非零统计 + 样本行。
* 用于定位"末架出口厚度恒为 0"问题。
*/
@GetMapping("/test/gauge-stats/{matId}")
public R<Map<String, Object>> testGaugeStats(@PathVariable String matId) {
return R.ok(businessService.getGaugeStats(matId));
}
/**
* 轧辊数据type / status 均可选,不传则返回全量。
*/

View File

@@ -0,0 +1,68 @@
package com.klp.web.controller.monitor;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.klp.common.core.controller.BaseController;
import com.klp.common.core.domain.R;
import com.klp.system.domain.bo.OperPerformanceQuery;
import com.klp.system.domain.vo.OperMenuGroupVO;
import com.klp.system.domain.vo.OperModuleStatVO;
import com.klp.system.domain.vo.OperPersonVO;
import com.klp.system.domain.vo.OperSummaryVO;
import com.klp.system.service.ISysOperLogService;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 绩效汇总
*
* @author Reasonix
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/monitor/performance")
public class OperPerformanceController extends BaseController {
private final ISysOperLogService operLogService;
/**
* 绩效概览统计
*/
@SaCheckPermission("monitor:performance:list")
@GetMapping("/summary")
public R<OperSummaryVO> summary(OperPerformanceQuery query) {
return R.ok(operLogService.selectPerformanceSummary(query));
}
/**
* 人员绩效列表(含模块明细)
*/
@SaCheckPermission("monitor:performance:list")
@GetMapping("/person")
public R<List<OperPersonVO>> person(OperPerformanceQuery query) {
return R.ok(operLogService.selectPersonPerformance(query));
}
/**
* 模块使用排行
*/
@SaCheckPermission("monitor:performance:list")
@GetMapping("/module")
public R<List<OperModuleStatVO>> module(OperPerformanceQuery query) {
return R.ok(operLogService.selectModuleRanking(query));
}
/**
* 按菜单分组绩效统计oper_page 匹配一级菜单 path
*/
@SaCheckPermission("monitor:performance:list")
@GetMapping("/menuGroup")
public R<List<OperMenuGroupVO>> menuGroup(OperPerformanceQuery query) {
return R.ok(operLogService.selectMenuGroupPerformance(query));
}
}

View File

@@ -0,0 +1,50 @@
package com.klp.web.controller.system;
import java.util.List;
import lombok.RequiredArgsConstructor;
import javax.validation.constraints.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.klp.common.annotation.RepeatSubmit;
import com.klp.common.annotation.Log;
import com.klp.common.core.controller.BaseController;
import com.klp.common.core.domain.R;
import com.klp.common.core.validate.AddGroup;
import com.klp.common.enums.BusinessType;
import com.klp.system.domain.vo.SysFileCommentVo;
import com.klp.system.domain.bo.SysFileCommentBo;
import com.klp.system.service.ISysFileCommentService;
/**
* 文件评论
*
* @author klp
* @date 2026-07-04
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/system/file/comment")
public class SysFileCommentController extends BaseController {
private final ISysFileCommentService iSysFileCommentService;
/**
* 查询文件评论列表
*/
@GetMapping("/list/{fileId}")
public R<List<SysFileCommentVo>> list(@NotNull(message = "文件ID不能为空") @PathVariable Long fileId) {
return R.ok(iSysFileCommentService.queryListByFileId(fileId));
}
/**
* 新增文件评论
*/
@Log(title = "文件评论", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody SysFileCommentBo bo) {
return toAjax(iSysFileCommentService.insertByBo(bo));
}
}

View File

@@ -0,0 +1,117 @@
package com.klp.web.controller.system;
import java.util.List;
import java.util.Arrays;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.klp.common.annotation.RepeatSubmit;
import com.klp.common.annotation.Log;
import com.klp.common.core.controller.BaseController;
import com.klp.common.core.domain.PageQuery;
import com.klp.common.core.domain.R;
import com.klp.common.core.validate.AddGroup;
import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil;
import com.klp.system.domain.vo.SysFileVo;
import com.klp.system.domain.bo.SysFileBo;
import com.klp.system.service.ISysFileService;
import com.klp.common.core.page.TableDataInfo;
/**
* 文件主信息
*
* @author klp
* @date 2026-06-30
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/system/file")
public class SysFileController extends BaseController {
private final ISysFileService iSysFileService;
/**
* 查询文件主信息列表
*/
@GetMapping("/list")
public TableDataInfo<SysFileVo> list(SysFileBo bo, PageQuery pageQuery) {
return iSysFileService.queryPageList(bo, pageQuery);
}
/**
* 导出文件主信息列表
*/
@Log(title = "文件主信息", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(SysFileBo bo, HttpServletResponse response) {
List<SysFileVo> list = iSysFileService.queryList(bo);
ExcelUtil.exportExcel(list, "文件主信息", SysFileVo.class, response);
}
/**
* 获取文件主信息详细信息
*
* @param fileId 主键
*/
@GetMapping("/{fileId}")
public R<SysFileVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long fileId) {
return R.ok(iSysFileService.queryById(fileId));
}
/**
* 新增文件主信息
*/
@Log(title = "文件主信息", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Long> add(@Validated(AddGroup.class) @RequestBody SysFileBo bo) {
iSysFileService.insertByBo(bo);
return R.ok(bo.getFileId());
}
/**
* 修改文件主信息
*/
@Log(title = "文件主信息", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysFileBo bo) {
return toAjax(iSysFileService.updateByBo(bo));
}
/**
* 删除文件主信息
*
* @param fileIds 主键串
*/
@Log(title = "文件主信息", businessType = BusinessType.DELETE)
@DeleteMapping("/{fileIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] fileIds) {
return toAjax(iSysFileService.deleteWithValidByIds(Arrays.asList(fileIds), true));
}
/**
* 文件浏览次数 +1
*/
@PutMapping("/incrementView/{fileId}")
public R<Void> incrementView(@NotNull(message = "主键不能为空") @PathVariable Long fileId) {
iSysFileService.incrementViewCount(fileId);
return R.ok();
}
/**
* 查询与我相关的文件(私有文件且当前用户在可见用户列表中)
*/
@GetMapping("/relatedToMe")
public TableDataInfo<SysFileVo> relatedToMe(SysFileBo bo, PageQuery pageQuery) {
return iSysFileService.queryPageListRelatedToMe(bo, pageQuery);
}
}

View File

@@ -0,0 +1,99 @@
package com.klp.web.controller.system;
import java.util.List;
import java.util.Arrays;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.klp.common.annotation.RepeatSubmit;
import com.klp.common.annotation.Log;
import com.klp.common.core.controller.BaseController;
import com.klp.common.core.domain.PageQuery;
import com.klp.common.core.domain.R;
import com.klp.common.core.validate.AddGroup;
import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil;
import com.klp.system.domain.vo.SysFileVisibleUserVo;
import com.klp.system.domain.bo.SysFileVisibleUserBo;
import com.klp.system.service.ISysFileVisibleUserService;
import com.klp.common.core.page.TableDataInfo;
/**
* 私有文件可见用户多对多关联
*
* @author klp
* @date 2026-06-30
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/system/fileVisibleUser")
public class SysFileVisibleUserController extends BaseController {
private final ISysFileVisibleUserService iSysFileVisibleUserService;
/**
* 查询私有文件可见用户多对多关联列表
*/
@GetMapping("/list")
public TableDataInfo<SysFileVisibleUserVo> list(SysFileVisibleUserBo bo, PageQuery pageQuery) {
return iSysFileVisibleUserService.queryPageList(bo, pageQuery);
}
/**
* 导出私有文件可见用户多对多关联列表
*/
@Log(title = "私有文件可见用户多对多关联", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(SysFileVisibleUserBo bo, HttpServletResponse response) {
List<SysFileVisibleUserVo> list = iSysFileVisibleUserService.queryList(bo);
ExcelUtil.exportExcel(list, "私有文件可见用户多对多关联", SysFileVisibleUserVo.class, response);
}
/**
* 获取私有文件可见用户多对多关联详细信息
*
* @param visibleId 主键
*/
@GetMapping("/{visibleId}")
public R<SysFileVisibleUserVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long visibleId) {
return R.ok(iSysFileVisibleUserService.queryById(visibleId));
}
/**
* 新增私有文件可见用户多对多关联
*/
@Log(title = "私有文件可见用户多对多关联", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody SysFileVisibleUserBo bo) {
return toAjax(iSysFileVisibleUserService.insertByBo(bo));
}
/**
* 修改私有文件可见用户多对多关联
*/
@Log(title = "私有文件可见用户多对多关联", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysFileVisibleUserBo bo) {
return toAjax(iSysFileVisibleUserService.updateByBo(bo));
}
/**
* 删除私有文件可见用户多对多关联
*
* @param visibleIds 主键串
*/
@Log(title = "私有文件可见用户多对多关联", businessType = BusinessType.DELETE)
@DeleteMapping("/{visibleIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] visibleIds) {
return toAjax(iSysFileVisibleUserService.deleteWithValidByIds(Arrays.asList(visibleIds), true));
}
}

View File

@@ -84,6 +84,8 @@ public class SysMenuController extends BaseController {
public R<Void> add(@Validated @RequestBody SysMenu menu) {
if (!menuService.checkMenuNameUnique(menu)) {
return R.fail("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
} else if (StringUtils.isNotBlank(menu.getMenuKey()) && !menuService.checkMenuKeyUnique(menu)) {
return R.fail("新增菜单'" + menu.getMenuName() + "'失败,菜单唯一标识'" + menu.getMenuKey() + "'已存在");
} else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) {
return R.fail("新增菜单'" + menu.getMenuName() + "'失败地址必须以http(s)://开头");
}
@@ -99,6 +101,8 @@ public class SysMenuController extends BaseController {
public R<Void> edit(@Validated @RequestBody SysMenu menu) {
if (!menuService.checkMenuNameUnique(menu)) {
return R.fail("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
} else if (StringUtils.isNotBlank(menu.getMenuKey()) && !menuService.checkMenuKeyUnique(menu)) {
return R.fail("修改菜单'" + menu.getMenuName() + "'失败,菜单唯一标识'" + menu.getMenuKey() + "'已存在");
} else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) {
return R.fail("修改菜单'" + menu.getMenuName() + "'失败地址必须以http(s)://开头");
} else if (menu.getMenuId().equals(menu.getParentId())) {
@@ -124,4 +128,29 @@ public class SysMenuController extends BaseController {
}
return toAjax(menuService.deleteMenuById(menuId));
}
/**
* 根据 menuKey 获取菜单信息(供流程图等外部固定引用跳转)
*
* @param menuKey 菜单唯一标识
*/
@GetMapping("/getByKey")
public R<SysMenu> getByKey(@RequestParam String menuKey) {
SysMenu menu = menuService.selectMenuByMenuKey(menuKey);
if (menu == null) {
return R.fail("菜单唯一标识 '" + menuKey + "' 不存在");
}
return R.ok(menu);
}
/**
* 为现有菜单自动生成 menu_key仅处理 menu_key 为空且类型为 C/M 的菜单)
*/
@SaCheckPermission("system:menu:edit")
@Log(title = "菜单管理", businessType = BusinessType.UPDATE)
@PostMapping("/generateMenuKeys")
public R<Void> generateMenuKeys() {
int count = menuService.generateMenuKeys();
return R.ok("成功为 " + count + " 个菜单生成 menu_key");
}
}

View File

@@ -74,6 +74,24 @@ public class SysUserController extends BaseController {
return userService.selectPageUserList(user, pageQuery);
}
/**
* 根据角色标识查询用户列表(用于选择审批人等场景)
*/
@SaCheckLogin
@GetMapping("/selectUserByRole/{roleKey}")
public R<List<SysUser>> selectUserByRoleKey(@PathVariable String roleKey) {
return R.ok(userService.selectUserByRoleKey(roleKey));
}
/**
* 查询请购审批人列表(角色标识 glc
*/
@SaCheckLogin
@GetMapping("/approverUsers/list")
public R<List<SysUser>> approverUsers() {
return R.ok(userService.selectUserByRoleKey("glc"));
}
/**
* 导出用户列表
*/

View File

@@ -0,0 +1,105 @@
-- ------------------------------------------------------------
-- 质量评审流程 - 异常产品评审审批单
-- V15__qc_quality_review.sql
-- ------------------------------------------------------------
-- 1. 字典类型
INSERT INTO `sys_dict_type` VALUES (NULL, '质量评审状态', 'quality_review_status', '0', 'admin', NOW(), '', NULL, '质量评审单流程状态');
INSERT INTO `sys_dict_type` VALUES (NULL, '改判后质量状态', 'regrade_quality_type', '0', 'admin', NOW(), '', NULL, '领导审批时指定的改判结果');
-- 2. 字典数据 - 质量评审状态
INSERT INTO `sys_dict_data` VALUES (NULL, 1, '待提交', '1', 'quality_review_status', '', 'info', 'Y', '0', 'admin', NOW(), '', NULL, '');
INSERT INTO `sys_dict_data` VALUES (NULL, 2, '待审批', '2', 'quality_review_status', '', 'warning', 'Y', '0', 'admin', NOW(), '', NULL, '');
INSERT INTO `sys_dict_data` VALUES (NULL, 3, '已通过', '3', 'quality_review_status', '', 'success', 'Y', '0', 'admin', NOW(), '', NULL, '');
INSERT INTO `sys_dict_data` VALUES (NULL, 4, '已驳回', '4', 'quality_review_status', '', 'danger', 'Y', '0', 'admin', NOW(), '', NULL, '');
-- 3. 字典数据 - 改判后质量状态
INSERT INTO `sys_dict_data` VALUES (NULL, 1, '协议销售', 'protocol_sale', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW(), '', NULL, '');
INSERT INTO `sys_dict_data` VALUES (NULL, 2, '转分剪', 'to_slitting', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW(), '', NULL, '');
INSERT INTO `sys_dict_data` VALUES (NULL, 3, '降级', 'downgrade', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW(), '', NULL, '');
INSERT INTO `sys_dict_data` VALUES (NULL, 4, '返修', 'rework', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW(), '', NULL, '');
INSERT INTO `sys_dict_data` VALUES (NULL, 5, '报废', 'scrap', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW(), '', NULL, '');
-- 4. 质量评审主表
CREATE TABLE `qc_quality_review` (
`review_id` bigint NOT NULL AUTO_INCREMENT COMMENT '评审单主键',
`review_no` varchar(50) NOT NULL COMMENT '评审单编号QR-2026-XXXX',
`product_name` varchar(100) DEFAULT NULL COMMENT '产品名称',
`transmit_dept` varchar(50) DEFAULT '品质部' COMMENT '传递部门',
`transmit_user` varchar(50) DEFAULT NULL COMMENT '传递人',
`transmit_date` date DEFAULT NULL COMMENT '传递日期',
`prod_date_range` varchar(50) DEFAULT NULL COMMENT '生产日期范围',
-- 流程状态
`flow_status` tinyint(1) DEFAULT '1' COMMENT '流程状态1=待提交 2=待审批 3=已通过 4=已驳回',
-- 品质部评审
`dept_opinion` text COMMENT '品质部评审意见',
`dept_sign` varchar(50) DEFAULT NULL COMMENT '品质部签字人',
`dept_sign_date` date DEFAULT NULL COMMENT '品质部签字日期',
-- 领导审批
`leader_opinion` text COMMENT '领导审批意见',
`leader_sign` varchar(50) DEFAULT NULL COMMENT '领导签字人',
`leader_sign_date` date DEFAULT NULL COMMENT '领导签字日期',
`reject_reason` varchar(500) DEFAULT NULL COMMENT '驳回原因',
-- 公共基础字段
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`del_flag` tinyint(1) DEFAULT '0' COMMENT '删除标志0=正常1=已删除)',
`create_by` varchar(50) DEFAULT '' COMMENT '创建人',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(50) DEFAULT '' COMMENT '更新人',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`review_id`) USING BTREE,
UNIQUE KEY `uk_review_no` (`review_no`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='质量评审单';
-- 5. 质量评审钢卷明细表
CREATE TABLE `qc_quality_review_coil` (
`detail_id` bigint NOT NULL AUTO_INCREMENT COMMENT '明细主键',
`review_id` bigint NOT NULL COMMENT '关联评审单ID',
-- 钢卷分组信息
`group_seq` int DEFAULT NULL COMMENT '序号1,2,3...',
`group_remark` varchar(200) DEFAULT NULL COMMENT '组备注(如"含3个钢卷"',
-- 钢卷信息
`coil_id` bigint DEFAULT NULL COMMENT '钢卷ID关联wms_material_coil',
`current_coil_no` varchar(50) DEFAULT NULL COMMENT '产品卷号',
`supplier_coil_no` varchar(50) DEFAULT NULL COMMENT '原料卷号',
`spec` varchar(50) DEFAULT NULL COMMENT '规格如1.35×1250',
`net_weight` decimal(10,3) DEFAULT NULL COMMENT '卷重(t)',
-- 缺陷与改判
`defect_desc` text COMMENT '缺陷描述',
`before_quality` varchar(20) DEFAULT NULL COMMENT '改判前质量等级(系统自动带出)',
`regrade_quality` varchar(50) DEFAULT NULL COMMENT '改判后质量状态字典regrade_quality_type',
`execute_status` tinyint(1) DEFAULT '0' COMMENT '执行状态0=待执行 1=已执行',
`execute_time` datetime DEFAULT NULL COMMENT '执行时间',
-- 公共基础字段
`remark` varchar(500) DEFAULT NULL,
`del_flag` tinyint(1) DEFAULT '0',
`create_by` varchar(50) DEFAULT '',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_by` varchar(50) DEFAULT '',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`detail_id`) USING BTREE,
KEY `idx_review_id` (`review_id`) USING BTREE,
KEY `idx_coil_id` (`coil_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='质量评审钢卷明细';
-- 6. 质量评审审批日志表
CREATE TABLE `qc_quality_review_log` (
`log_id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志主键',
`review_id` bigint NOT NULL COMMENT '关联评审单ID',
`action` varchar(20) NOT NULL COMMENT '动作submit=提交 approve=通过 reject=驳回',
`operator` varchar(50) DEFAULT NULL COMMENT '操作人',
`opinion` text COMMENT '审批意见',
`operate_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间',
`create_by` varchar(50) DEFAULT '',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`log_id`) USING BTREE,
KEY `idx_review_id` (`review_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='质量评审审批日志';

View File

@@ -0,0 +1,10 @@
-- ------------------------------------------------------------
-- 质量评审 — 钢卷明细增加逻辑库区字段
-- V16__qc_quality_review_warehouse.sql
-- ------------------------------------------------------------
ALTER TABLE `qc_quality_review_coil`
ADD COLUMN `before_warehouse_id` bigint DEFAULT NULL COMMENT '改判前逻辑库区ID' AFTER `before_quality`,
ADD COLUMN `before_warehouse_name` varchar(100) DEFAULT NULL COMMENT '改判前逻辑库区名称' AFTER `before_warehouse_id`,
ADD COLUMN `target_warehouse_id` bigint DEFAULT NULL COMMENT '改判后目标库区ID' AFTER `regrade_quality`,
ADD COLUMN `target_warehouse_name` varchar(100) DEFAULT NULL COMMENT '改判后目标库区名称' AFTER `target_warehouse_id`;

View File

@@ -36,6 +36,9 @@ CREATE TABLE IF NOT EXISTS wms_furnace_plan_coil (
plan_coil_id BIGINT AUTO_INCREMENT PRIMARY KEY,
plan_id BIGINT NOT NULL COMMENT '计划ID',
coil_id BIGINT NOT NULL COMMENT '钢卷ID',
logic_warehouse_id BIGINT NULL COMMENT '逻辑库区去向(钢卷退火后目标逻辑库区)',
furnace_level TINYINT(1) NULL COMMENT '炉火层级1=一层2=二层3=三层)',
contract_id BIGINT NULL COMMENT '合同ID',
del_flag TINYINT DEFAULT 0 COMMENT '删除标记(0正常 1删除)',
create_by VARCHAR(64) NULL,
update_by VARCHAR(64) NULL,

View File

@@ -76,6 +76,16 @@ public class ApsPlanDetailController extends BaseController {
return toAjax(iApsPlanDetailService.insertByBo(bo));
}
/**
* 批量新增排产单明细
*/
@Log(title = "排产单明细", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/batch")
public R<Void> batchAdd(@Validated(AddGroup.class) @RequestBody List<ApsPlanDetailBo> boList) {
return toAjax(iApsPlanDetailService.insertBatchByBo(boList));
}
/**
* 修改排产单明细
*/

View File

@@ -226,5 +226,9 @@ public class ApsPlanDetailBo extends BaseEntity {
*/
private String remark;
/**
* 排产日期(字符串格式,例如 '2025-12-29')
*/
private String detailDate;
}

View File

@@ -52,6 +52,11 @@ public class ApsPlanSheetBo extends BaseEntity {
*/
private String planType;
/**
* 排产文件
*/
private String apsUrl;
/**
* 排产人
*/

View File

@@ -184,6 +184,10 @@ public class ApsPlanDetail extends BaseEntity {
* 备注
*/
private String remark;
/**
* 排产日期(字符串格式,例如 '2025-12-29')
*/
private String detailDate;
/**
* 删除标记(0正常 1删除)
*/

View File

@@ -49,6 +49,10 @@ public class ApsPlanSheet extends BaseEntity {
* 排产类型
*/
private String planType;
/**
* 排产文件
*/
private String apsUrl;
/**
* 排产人
*/

View File

@@ -261,6 +261,12 @@ public class ApsPlanDetailVo {
@ExcelProperty(value = "备注")
private String remark;
/**
* 排产日期(字符串格式,例如 '2025-12-29')
*/
@ExcelProperty(value = "排产日期")
private String detailDate;
/**
* 技术附件
*/

View File

@@ -60,6 +60,12 @@ public class ApsPlanSheetVo {
@ExcelProperty(value = "排产类型")
private String planType;
/**
* 排产文件
*/
@ExcelProperty(value = "排产文件")
private String apsUrl;
/**
* 排产人
*/

View File

@@ -43,6 +43,11 @@ public interface IApsPlanDetailService {
*/
Boolean insertByBo(ApsPlanDetailBo bo);
/**
* 批量新增排产单明细
*/
Boolean insertBatchByBo(List<ApsPlanDetailBo> boList);
/**
* 修改排产单明细
*/

View File

@@ -101,6 +101,7 @@ public class ApsPlanDetailServiceImpl implements IApsPlanDetailService {
qw.eq(StringUtils.isNotBlank(bo.getSampleReq()), "d.sample_req", bo.getSampleReq());
qw.eq(bo.getStartTime() != null, "d.start_time", bo.getStartTime());
qw.eq(bo.getEndTime() != null, "d.end_time", bo.getEndTime());
qw.eq(StringUtils.isNotBlank(bo.getDetailDate()), "d.detail_date", bo.getDetailDate());
//根据创建时间倒叙
qw.orderByDesc("d.create_time");
return qw;
@@ -168,6 +169,7 @@ public class ApsPlanDetailServiceImpl implements IApsPlanDetailService {
lqw.eq(StringUtils.isNotBlank(bo.getSampleReq()), ApsPlanDetail::getSampleReq, bo.getSampleReq());
lqw.eq(bo.getStartTime() != null, ApsPlanDetail::getStartTime, bo.getStartTime());
lqw.eq(bo.getEndTime() != null, ApsPlanDetail::getEndTime, bo.getEndTime());
lqw.eq(StringUtils.isNotBlank(bo.getDetailDate()), ApsPlanDetail::getDetailDate, bo.getDetailDate());
return lqw;
}
@@ -185,6 +187,16 @@ public class ApsPlanDetailServiceImpl implements IApsPlanDetailService {
return flag;
}
/**
* 批量新增排产单明细
*/
@Override
public Boolean insertBatchByBo(List<ApsPlanDetailBo> boList) {
List<ApsPlanDetail> list = BeanUtil.copyToList(boList, ApsPlanDetail.class);
list.forEach(this::validEntityBeforeSave);
return baseMapper.insertBatch(list);
}
/**
* 修改排产单明细
*/

View File

@@ -44,6 +44,7 @@
<result property="startTime" column="start_time"/>
<result property="endTime" column="end_time"/>
<result property="remark" column="remark"/>
<result property="detailDate" column="detail_date"/>
<result property="delFlag" column="del_flag"/>
<result property="createBy" column="create_by"/>
<result property="updateBy" column="update_by"/>

View File

@@ -11,6 +11,7 @@
<result property="lineName" column="line_name"/>
<result property="planCode" column="plan_code"/>
<result property="planType" column="plan_type"/>
<result property="apsUrl" column="aps_url"/>
<result property="scheduler" column="scheduler"/>
<result property="remark" column="remark"/>
<result property="delFlag" column="del_flag"/>
@@ -27,6 +28,7 @@
s.line_name AS lineName,
s.plan_code AS planCode,
s.plan_type AS planType,
s.aps_url AS apsUrl,
s.scheduler AS scheduler,
s.remark AS masterRemark,
d.remark AS detailRemark,

View File

@@ -35,6 +35,12 @@ public class SysMenu extends TreeEntity<SysMenu> {
@Size(min = 0, max = 50, message = "菜单名称长度不能超过{max}个字符")
private String menuName;
/**
* 菜单唯一标识(外部固定引用,不受目录变动影响)
*/
@Size(min = 0, max = 64, message = "菜单唯一标识长度不能超过{max}个字符")
private String menuKey;
/**
* 显示顺序
*/
@@ -96,6 +102,11 @@ public class SysMenu extends TreeEntity<SysMenu> {
*/
private String icon;
/**
* 样式
*/
private String style;
/**
* 备注
*/

View File

@@ -96,6 +96,11 @@ public class OperLogEvent implements Serializable {
*/
private String errorMsg;
/**
* 页面路由
*/
private String operPage;
/**
* 操作时间
*/

View File

@@ -26,9 +26,15 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
* Excel相关处理
@@ -149,6 +155,33 @@ public class ExcelUtil {
builder.doWrite(list);
}
/**
* 导出excel仅导出指定列
*
* @param list 导出数据集合
* @param sheetName 工作表的名称
* @param clazz 实体类
* @param includeColumnFieldNames 需要导出的字段名集合Java字段名非Excel列名
* @param response 响应体
*/
public static <T> void exportExcel(List<T> list, String sheetName, Class<T> clazz,
Set<String> includeColumnFieldNames,
HttpServletResponse response) {
try {
resetResponse(sheetName, response);
ServletOutputStream os = response.getOutputStream();
EasyExcel.write(os, clazz)
.autoCloseStream(false)
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
.registerConverter(new ExcelBigNumberConvert())
.includeColumnFieldNames(includeColumnFieldNames)
.sheet(sheetName)
.doWrite(list);
} catch (IOException e) {
throw new RuntimeException("导出Excel异常");
}
}
/**
* 单表多数据模板导出 模板格式为 {.属性}
*
@@ -325,4 +358,67 @@ public class ExcelUtil {
return IdUtil.fastSimpleUUID() + "_" + filename + ".xlsx";
}
/**
* 导出excel按指定顺序的列导出使用动态表头
*
* @param list 导出数据集合
* @param sheetName 工作表的名称
* @param orderedFields 按导出顺序排列的Java字段名列表
* @param fieldLabelMap Java字段名 -> Excel列头中文名 映射
* @param response 响应体
*/
public static <T> void exportExcelOrdered(List<T> list, String sheetName,
List<String> orderedFields,
Map<String, String> fieldLabelMap,
HttpServletResponse response) {
if (orderedFields == null || orderedFields.isEmpty()) {
throw new IllegalArgumentException("导出列不能为空");
}
// 构建动态表头
List<List<String>> heads = orderedFields.stream()
.map(f -> Collections.singletonList(fieldLabelMap.getOrDefault(f, f)))
.collect(Collectors.toList());
// 构建数据行
List<List<Object>> data = new ArrayList<>(list.size());
if (!list.isEmpty()) {
Map<String, Field> fieldCache = new HashMap<>();
Class<?> clazz = list.get(0).getClass();
for (T vo : list) {
List<Object> row = new ArrayList<>(orderedFields.size());
for (String fieldName : orderedFields) {
Field field = fieldCache.computeIfAbsent(fieldName, k -> {
try {
Field f = clazz.getDeclaredField(k);
f.setAccessible(true);
return f;
} catch (NoSuchFieldException e) {
return null;
}
});
try {
row.add(field != null ? field.get(vo) : null);
} catch (IllegalAccessException e) {
row.add(null);
}
}
data.add(row);
}
}
try {
resetResponse(sheetName, response);
ServletOutputStream os = response.getOutputStream();
EasyExcel.write(os)
.head(heads)
.autoCloseStream(false)
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
.registerConverter(new ExcelBigNumberConvert())
.sheet(sheetName)
.doWrite(data);
} catch (IOException e) {
throw new RuntimeException("导出Excel异常", e);
}
}
}

View File

@@ -0,0 +1,109 @@
package com.klp.cost.controller;
import java.util.List;
import java.util.Arrays;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.klp.common.annotation.RepeatSubmit;
import com.klp.common.annotation.Log;
import com.klp.common.core.controller.BaseController;
import com.klp.common.core.domain.PageQuery;
import com.klp.common.core.domain.R;
import com.klp.common.core.validate.AddGroup;
import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil;
import com.klp.cost.domain.vo.CostProdMetricResultVo;
import com.klp.cost.domain.bo.CostProdMetricResultBo;
import com.klp.cost.service.ICostProdMetricResultService;
import com.klp.common.core.page.TableDataInfo;
/**
* 生产指标计算结果
*
* @author klp
* @date 2026-06-17
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/cost/prodMetricResult")
public class CostProdMetricResultController extends BaseController {
private final ICostProdMetricResultService iCostProdMetricResultService;
/**
* 查询生产指标计算结果列表
*/
@GetMapping("/list")
public TableDataInfo<CostProdMetricResultVo> list(CostProdMetricResultBo bo, PageQuery pageQuery) {
return iCostProdMetricResultService.queryPageList(bo, pageQuery);
}
/**
* 导出生产指标计算结果列表
*/
@Log(title = "生产指标计算结果", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(CostProdMetricResultBo bo, HttpServletResponse response) {
List<CostProdMetricResultVo> list = iCostProdMetricResultService.queryList(bo);
ExcelUtil.exportExcel(list, "生产指标计算结果", CostProdMetricResultVo.class, response);
}
/**
* 获取生产指标计算结果详细信息
*
* @param resultId 主键
*/
@GetMapping("/{resultId}")
public R<CostProdMetricResultVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long resultId) {
return R.ok(iCostProdMetricResultService.queryById(resultId));
}
/**
* 新增生产指标计算结果
*/
@Log(title = "生产指标计算结果", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody CostProdMetricResultBo bo) {
return toAjax(iCostProdMetricResultService.insertByBo(bo));
}
/**
* 批量保存生产指标计算结果(先删除再插入)
*/
@Log(title = "生产指标计算结果", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/batch")
public R<Void> batchSave(@RequestBody CostProdMetricResultBo bo) {
return toAjax(iCostProdMetricResultService.batchSaveWithDelete(bo));
}
/**
* 修改生产指标计算结果
*/
@Log(title = "生产指标计算结果", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody CostProdMetricResultBo bo) {
return toAjax(iCostProdMetricResultService.updateByBo(bo));
}
/**
* 删除生产指标计算结果
*
* @param resultIds 主键串
*/
@Log(title = "生产指标计算结果", businessType = BusinessType.DELETE)
@DeleteMapping("/{resultIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] resultIds) {
return toAjax(iCostProdMetricResultService.deleteWithValidByIds(Arrays.asList(resultIds), true));
}
}

View File

@@ -44,6 +44,10 @@ public class CostItem extends BaseEntity {
* 备注
*/
private String remark;
/**
* 查询条件JSON格式
*/
private String queryCondition;
/**
* 删除标识 0=正常 2=删除
*/

View File

@@ -42,13 +42,21 @@ public class CostProdMetric extends BaseEntity {
*/
private String metricFormula;
/**
* 指标计算结果值
* 单价
*/
private BigDecimal metricValue;
/**
* 是否使用单价 0=否 1=是
*/
private Integer usePrice;
/**
* 备注
*/
private String remark;
/**
* 标签
*/
private String tags;
/**
* 删除标识 0=正常 2=删除
*/

View File

@@ -0,0 +1,60 @@
package com.klp.cost.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 生产指标计算结果对象 cost_prod_metric_result
*
* @author klp
* @date 2026-06-17
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("cost_prod_metric_result")
public class CostProdMetricResult extends BaseEntity {
private static final long serialVersionUID=1L;
/**
* 主键ID
*/
@TableId(value = "result_id")
private Long resultId;
/**
* 报表ID关联生产日报
*/
private Long reportId;
/**
* 指标ID关联cost_prod_metric
*/
private Long metricId;
/**
* 计算日期
*/
private Date metricDate;
/**
* 班组
*/
private String teamGroup;
/**
* 计算值
*/
private BigDecimal calcValue;
/**
* 标签
*/
private String tags;
/**
* 删除标识 0=正常 2=删除
*/
@TableLogic
private Long delFlag;
}

View File

@@ -47,5 +47,10 @@ public class CostItemBo extends BaseEntity {
*/
private String remark;
/**
* 查询条件JSON格式
*/
private String queryCondition;
}

View File

@@ -44,6 +44,20 @@ public class CostProdDetailBo extends BaseEntity {
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date detailDate;
/**
* 日期起
*/
@JsonFormat(pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date detailDateStart;
/**
* 日期止
*/
@JsonFormat(pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date detailDateEnd;
/**
* 成本项目ID
*/

View File

@@ -44,14 +44,23 @@ public class CostProdMetricBo extends BaseEntity {
private String metricFormula;
/**
* 指标计算结果值
* 单价
*/
private BigDecimal metricValue;
/**
* 是否使用单价 0=否 1=是
*/
private Integer usePrice;
/**
* 备注
*/
private String remark;
/**
* 标签
*/
private String tags;
}

View File

@@ -0,0 +1,86 @@
package com.klp.cost.domain.bo;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.*;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
/**
* 生产指标计算结果业务对象 cost_prod_metric_result
*
* @author klp
* @date 2026-06-17
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class CostProdMetricResultBo extends BaseEntity {
/**
* 主键ID
*/
private Long resultId;
/**
* 报表ID关联生产日报
*/
private Long reportId;
/**
* 指标ID关联cost_prod_metric
*/
private Long metricId;
/**
* 计算日期
*/
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd")
private Date metricDate;
/**
* 计算日期起
*/
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd")
private Date metricDateStart;
/**
* 计算日期止
*/
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd")
private Date metricDateEnd;
/**
* 班组
*/
private String teamGroup;
/**
* 计算值
*/
private BigDecimal calcValue;
/**
* 标签
*/
private String tags;
/**
* 要删除的主键ID集合
*/
private List<Long> resultIds;
/**
* 要批量插入的数据集合
*/
private List<CostProdMetricResultBo> prodMetricResultList;
}

View File

@@ -55,5 +55,11 @@ public class CostItemVo {
@ExcelProperty(value = "备注")
private String remark;
/**
* 查询条件JSON格式
*/
@ExcelProperty(value = "查询条件JSON格式")
private String queryCondition;
}

View File

@@ -0,0 +1,70 @@
package com.klp.cost.domain.vo;
import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.klp.common.annotation.ExcelDictFormat;
import com.klp.common.convert.ExcelDictConvert;
import lombok.Data;
/**
* 生产指标计算结果视图对象 cost_prod_metric_result
*
* @author klp
* @date 2026-06-17
*/
@Data
@ExcelIgnoreUnannotated
public class CostProdMetricResultVo {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long resultId;
/**
* 报表ID关联生产日报
*/
@ExcelProperty(value = "报表ID", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "关=联生产日报")
private Long reportId;
/**
* 指标ID关联cost_prod_metric
*/
@ExcelProperty(value = "指标ID", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "关=联cost_prod_metric")
private Long metricId;
/**
* 计算日期
*/
@ExcelProperty(value = "计算日期")
private Date metricDate;
/**
* 班组
*/
@ExcelProperty(value = "班组")
private String teamGroup;
/**
* 计算值
*/
@ExcelProperty(value = "计算值")
private BigDecimal calcValue;
/**
* 标签
*/
@ExcelProperty(value = "标签")
private String tags;
}

View File

@@ -52,16 +52,27 @@ public class CostProdMetricVo {
private String metricFormula;
/**
* 指标计算结果值
* 单价
*/
@ExcelProperty(value = "指标计算结果值")
@ExcelProperty(value = "单价")
private BigDecimal metricValue;
/**
* 是否使用单价 0=否 1=是
*/
@ExcelProperty(value = "是否使用单价")
private Integer usePrice;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
/**
* 标签
*/
@ExcelProperty(value = "标签")
private String tags;
}

View File

@@ -0,0 +1,15 @@
package com.klp.cost.mapper;
import com.klp.cost.domain.CostProdMetricResult;
import com.klp.cost.domain.vo.CostProdMetricResultVo;
import com.klp.common.core.mapper.BaseMapperPlus;
/**
* 生产指标计算结果Mapper接口
*
* @author klp
* @date 2026-06-17
*/
public interface CostProdMetricResultMapper extends BaseMapperPlus<CostProdMetricResultMapper, CostProdMetricResult, CostProdMetricResultVo> {
}

View File

@@ -0,0 +1,54 @@
package com.klp.cost.service;
import com.klp.cost.domain.CostProdMetricResult;
import com.klp.cost.domain.vo.CostProdMetricResultVo;
import com.klp.cost.domain.bo.CostProdMetricResultBo;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 生产指标计算结果Service接口
*
* @author klp
* @date 2026-06-17
*/
public interface ICostProdMetricResultService {
/**
* 查询生产指标计算结果
*/
CostProdMetricResultVo queryById(Long resultId);
/**
* 查询生产指标计算结果列表
*/
TableDataInfo<CostProdMetricResultVo> queryPageList(CostProdMetricResultBo bo, PageQuery pageQuery);
/**
* 查询生产指标计算结果列表
*/
List<CostProdMetricResultVo> queryList(CostProdMetricResultBo bo);
/**
* 新增生产指标计算结果
*/
Boolean insertByBo(CostProdMetricResultBo bo);
/**
* 修改生产指标计算结果
*/
Boolean updateByBo(CostProdMetricResultBo bo);
/**
* 校验并批量删除生产指标计算结果信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 批量保存生产指标计算结果(先删除再插入)
*/
Boolean batchSaveWithDelete(CostProdMetricResultBo bo);
}

View File

@@ -65,6 +65,7 @@ public class CostItemServiceImpl implements ICostItemService {
lqw.like(StringUtils.isNotBlank(bo.getItemName()), CostItem::getItemName, bo.getItemName());
lqw.eq(StringUtils.isNotBlank(bo.getCategory()), CostItem::getCategory, bo.getCategory());
lqw.eq(StringUtils.isNotBlank(bo.getUnit()), CostItem::getUnit, bo.getUnit());
lqw.eq(StringUtils.isNotBlank(bo.getQueryCondition()), CostItem::getQueryCondition, bo.getQueryCondition());
return lqw;
}

View File

@@ -67,6 +67,8 @@ public class CostProdDetailServiceImpl implements ICostProdDetailService {
lqw.eq(bo.getReportId() != null, CostProdDetail::getReportId, bo.getReportId());
lqw.eq(StringUtils.isNotBlank(bo.getShift()), CostProdDetail::getShift, bo.getShift());
lqw.eq(bo.getDetailDate() != null, CostProdDetail::getDetailDate, bo.getDetailDate());
lqw.between(bo.getDetailDateStart() != null && bo.getDetailDateEnd() != null,
CostProdDetail::getDetailDate, bo.getDetailDateStart(), bo.getDetailDateEnd());
lqw.eq(bo.getItemId() != null, CostProdDetail::getItemId, bo.getItemId());
lqw.eq(bo.getQuantity() != null, CostProdDetail::getQuantity, bo.getQuantity());
lqw.eq(bo.getUnitPrice() != null, CostProdDetail::getUnitPrice, bo.getUnitPrice());

View File

@@ -0,0 +1,137 @@
package com.klp.cost.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.klp.common.utils.StringUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.klp.cost.domain.bo.CostProdMetricResultBo;
import com.klp.cost.domain.vo.CostProdMetricResultVo;
import com.klp.cost.domain.CostProdMetricResult;
import com.klp.cost.mapper.CostProdMetricResultMapper;
import com.klp.cost.service.ICostProdMetricResultService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.stream.Collectors;
/**
* 生产指标计算结果Service业务层处理
*
* @author klp
* @date 2026-06-17
*/
@RequiredArgsConstructor
@Service
public class CostProdMetricResultServiceImpl implements ICostProdMetricResultService {
private final CostProdMetricResultMapper baseMapper;
/**
* 查询生产指标计算结果
*/
@Override
public CostProdMetricResultVo queryById(Long resultId){
return baseMapper.selectVoById(resultId);
}
/**
* 查询生产指标计算结果列表
*/
@Override
public TableDataInfo<CostProdMetricResultVo> queryPageList(CostProdMetricResultBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<CostProdMetricResult> lqw = buildQueryWrapper(bo);
Page<CostProdMetricResultVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询生产指标计算结果列表
*/
@Override
public List<CostProdMetricResultVo> queryList(CostProdMetricResultBo bo) {
LambdaQueryWrapper<CostProdMetricResult> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<CostProdMetricResult> buildQueryWrapper(CostProdMetricResultBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<CostProdMetricResult> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getReportId() != null, CostProdMetricResult::getReportId, bo.getReportId());
lqw.eq(bo.getMetricId() != null, CostProdMetricResult::getMetricId, bo.getMetricId());
lqw.eq(bo.getMetricDate() != null, CostProdMetricResult::getMetricDate, bo.getMetricDate());
lqw.between(bo.getMetricDateStart() != null && bo.getMetricDateEnd() != null,
CostProdMetricResult::getMetricDate, bo.getMetricDateStart(), bo.getMetricDateEnd());
lqw.eq(StringUtils.isNotBlank(bo.getTeamGroup()), CostProdMetricResult::getTeamGroup, bo.getTeamGroup());
lqw.eq(bo.getCalcValue() != null, CostProdMetricResult::getCalcValue, bo.getCalcValue());
lqw.eq(StringUtils.isNotBlank(bo.getTags()), CostProdMetricResult::getTags, bo.getTags());
return lqw;
}
/**
* 新增生产指标计算结果
*/
@Override
public Boolean insertByBo(CostProdMetricResultBo bo) {
CostProdMetricResult add = BeanUtil.toBean(bo, CostProdMetricResult.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setResultId(add.getResultId());
}
return flag;
}
/**
* 修改生产指标计算结果
*/
@Override
public Boolean updateByBo(CostProdMetricResultBo bo) {
CostProdMetricResult update = BeanUtil.toBean(bo, CostProdMetricResult.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(CostProdMetricResult entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除生产指标计算结果
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
/**
* 批量保存(先删除再插入)
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean batchSaveWithDelete(CostProdMetricResultBo bo) {
if (CollUtil.isNotEmpty(bo.getProdMetricResultList())) {
if (CollUtil.isNotEmpty(bo.getResultIds())) {
baseMapper.deleteBatchIds(bo.getResultIds());
}
List<CostProdMetricResult> list = bo.getProdMetricResultList().stream()
.map(item -> BeanUtil.toBean(item, CostProdMetricResult.class))
.collect(Collectors.toList());
return baseMapper.insertBatch(list);
}
return false;
}
}

View File

@@ -66,6 +66,8 @@ public class CostProdMetricServiceImpl implements ICostProdMetricService {
lqw.like(StringUtils.isNotBlank(bo.getMetricName()), CostProdMetric::getMetricName, bo.getMetricName());
lqw.eq(StringUtils.isNotBlank(bo.getMetricFormula()), CostProdMetric::getMetricFormula, bo.getMetricFormula());
lqw.eq(bo.getMetricValue() != null, CostProdMetric::getMetricValue, bo.getMetricValue());
lqw.eq(bo.getUsePrice() != null, CostProdMetric::getUsePrice, bo.getUsePrice());
lqw.like(StringUtils.isNotBlank(bo.getTags()), CostProdMetric::getTags, bo.getTags());
return lqw;
}

View File

@@ -71,7 +71,10 @@ public class CostProdReportServiceImpl implements ICostProdReportService {
lqw.eq(StringUtils.isNotBlank(bo.getLineType()), CostProdReport::getLineType, bo.getLineType());
lqw.eq(bo.getInputWeight() != null, CostProdReport::getInputWeight, bo.getInputWeight());
lqw.eq(bo.getOutputWeight() != null, CostProdReport::getOutputWeight, bo.getOutputWeight());
lqw.apply(bo.getReportDate() != null, "DATE_FORMAT(report_date, '%Y-%m') = {0}", bo.getReportDate());
if (bo.getReportDate() != null) {
String monthStr = new java.text.SimpleDateFormat("yyyy-MM").format(bo.getReportDate());
lqw.apply("DATE_FORMAT(report_date, '%Y-%m') = {0}", monthStr);
}
return lqw;
}

View File

@@ -11,6 +11,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="category" column="category"/>
<result property="unit" column="unit"/>
<result property="remark" column="remark"/>
<result property="queryCondition" column="query_condition"/>
<result property="delFlag" column="del_flag"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>

View File

@@ -11,7 +11,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="metricName" column="metric_name"/>
<result property="metricFormula" column="metric_formula"/>
<result property="metricValue" column="metric_value"/>
<result property="usePrice" column="use_price"/>
<result property="remark" column="remark"/>
<result property="tags" column="tags"/>
<result property="delFlag" column="del_flag"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.klp.cost.mapper.CostProdMetricResultMapper">
<resultMap type="com.klp.cost.domain.CostProdMetricResult" id="CostProdMetricResultResult">
<result property="resultId" column="result_id"/>
<result property="reportId" column="report_id"/>
<result property="metricId" column="metric_id"/>
<result property="metricDate" column="metric_date"/>
<result property="teamGroup" column="team_group"/>
<result property="calcValue" column="calc_value"/>
<result property="tags" column="tags"/>
<result property="delFlag" column="del_flag"/>
<result property="createTime" column="create_time"/>
<result property="updateTime" column="update_time"/>
<result property="createBy" column="create_by"/>
<result property="updateBy" column="update_by"/>
</resultMap>
</mapper>

View File

@@ -1,10 +1,13 @@
package com.klp.crm.controller;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;
import java.util.Date;
import java.util.stream.Collectors;
import cn.hutool.core.bean.BeanUtil;
import com.klp.aps.domain.bo.ApsPlanDetailBo;
import com.klp.aps.domain.bo.ApsPlanSheetBo;
import lombok.RequiredArgsConstructor;
@@ -23,6 +26,7 @@ import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil;
import com.klp.crm.domain.vo.CrmOrderVo;
import com.klp.crm.domain.vo.CrmOrderExportVo;
import com.klp.crm.domain.bo.CrmOrderBo;
import com.klp.crm.service.ICrmOrderService;
import com.klp.common.core.page.TableDataInfo;
@@ -65,6 +69,35 @@ public class CrmOrderController extends BaseController {
ExcelUtil.exportExcel(list, "正式订单主", CrmOrderVo.class, response);
}
/**
* 导出正式订单主列表(业务精简字段,用于合同编辑详情页导出)
*/
@Log(title = "正式订单主", businessType = BusinessType.EXPORT)
@PostMapping("/exportDetail")
public void exportDetail(@RequestBody CrmOrderBo bo, HttpServletResponse response) {
List<CrmOrderVo> list = iCrmOrderService.queryList(bo);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
List<CrmOrderExportVo> exportList = list.stream().map(vo -> {
CrmOrderExportVo export = new CrmOrderExportVo();
BeanUtil.copyProperties(vo, export);
// 日期格式化
export.setSignTime(vo.getSignTime() != null ? sdf.format(vo.getSignTime()) : null);
export.setDeliveryDate(vo.getDeliveryDate() != null ? sdf.format(vo.getDeliveryDate()) : null);
// 状态转文本
if (vo.getStatus() != null) {
switch (vo.getStatus().intValue()) {
case 0: export.setStatus("草稿"); break;
case 1: export.setStatus("已生效"); break;
case 2: export.setStatus("已作废"); break;
case 3: export.setStatus("已完成"); break;
default: export.setStatus(String.valueOf(vo.getStatus())); break;
}
}
return export;
}).collect(Collectors.toList());
ExcelUtil.exportExcel(exportList, "合同编辑详情", CrmOrderExportVo.class, response);
}
/**
* 获取正式订单主详细信息
*

View File

@@ -1,7 +1,11 @@
package com.klp.crm.controller;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Arrays;
import java.util.stream.Collectors;
import cn.hutool.core.bean.BeanUtil;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
@@ -18,10 +22,15 @@ import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil;
import com.klp.crm.domain.vo.CrmOrderItemVo;
import com.klp.crm.domain.vo.CrmOrderItemExportVo;
import com.klp.crm.domain.vo.CrmContractOrderFinanceVo;
import com.klp.crm.domain.bo.CrmOrderItemBo;
import com.klp.crm.domain.bo.OrderCoilQueryBo;
import com.klp.crm.domain.bo.SalesmanCoilQueryBo;
import com.klp.crm.domain.bo.ContractCoilQueryBo;
import com.klp.crm.service.ICrmOrderItemService;
import com.klp.domain.vo.WmsMaterialCoilVo;
import com.klp.domain.bo.WmsMaterialCoilBo;
import com.klp.common.core.page.TableDataInfo;
/**
@@ -56,6 +65,30 @@ public class CrmOrderItemController extends BaseController {
ExcelUtil.exportExcel(list, "正式订单明细", CrmOrderItemVo.class, response);
}
/**
* 导出正式订单明细列表(业务精简字段,用于订单明细列表页导出)
*/
@Log(title = "正式订单明细", businessType = BusinessType.EXPORT)
@PostMapping("/exportDetail")
public void exportDetail(@RequestBody CrmOrderItemBo bo, HttpServletResponse response) {
List<CrmOrderItemVo> list = iCrmOrderItemService.queryList(bo);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
List<CrmOrderItemExportVo> exportList = list.stream().map(vo -> {
CrmOrderItemExportVo export = new CrmOrderItemExportVo();
BeanUtil.copyProperties(vo, export);
// 日期格式化
export.setSignTime(vo.getSignTime() != null ? sdf.format(vo.getSignTime()) : null);
// 展平 orderInfo 中的 salesman、orderCode、contractName
if (vo.getOrderInfo() != null) {
export.setSalesman(vo.getOrderInfo().getSalesman());
export.setOrderCode(vo.getOrderInfo().getOrderCode());
export.setContractName(vo.getOrderInfo().getContractName());
}
return export;
}).collect(Collectors.toList());
ExcelUtil.exportExcel(exportList, "订单明细列表", CrmOrderItemExportVo.class, response);
}
/**
* 获取正式订单明细详细信息
*
@@ -105,18 +138,63 @@ public class CrmOrderItemController extends BaseController {
@PathVariable Long contractId) {
return R.ok(iCrmOrderItemService.queryFinanceAndObjectionByContractId(contractId));
}
// 根据订单id查询发货单据中的配卷。
@GetMapping("/coils/order/{orderId}")
public R<List<WmsMaterialCoilVo>> getCoilsByOrderId(@NotNull(message = "订单ID不能为空")
@PathVariable Long orderId) {
return R.ok(iCrmOrderItemService.queryCoilsByOrderId(orderId));
// ==================== 钢卷查询(统一使用 POST + RequestBody BO ====================
/**
* 根据订单ID分页查询发货配卷支持钢卷信息筛选
*/
@PostMapping("/coils/order/query")
public TableDataInfo<WmsMaterialCoilVo> getCoilsByOrderId(@RequestBody @Validated OrderCoilQueryBo bo) {
return iCrmOrderItemService.queryCoilsByOrderId(bo.getOrderId(), toPageQuery(bo), bo.getCoilBo());
}
/**
* 根据销售员分页查询生产成果,支持钢卷信息筛选
*/
@PostMapping("/coils/salesman/query")
public TableDataInfo<WmsMaterialCoilVo> getCoilsBySalesman(@RequestBody @Validated SalesmanCoilQueryBo bo) {
return iCrmOrderItemService.queryCoilsBySalesman(bo.getSalesman(), toPageQuery(bo), bo.getCoilBo());
}
/**
* 根据合同ID分页查询生产成果支持钢卷信息筛选
*/
@PostMapping("/coils/contract/query")
public TableDataInfo<WmsMaterialCoilVo> getCoilsByContractIdPaginated(@RequestBody @Validated ContractCoilQueryBo bo) {
return iCrmOrderItemService.queryCoilsByContractIdPaginated(bo.getOrderId(), toPageQuery(bo), bo.getCoilBo());
}
/**
* 根据订单ID统计配卷汇总支持钢卷信息筛选
*/
@PostMapping("/coils/order/statistics")
public R<java.util.Map<String, java.math.BigDecimal>> getCoilsByOrderIdStatistics(@RequestBody @Validated OrderCoilQueryBo bo) {
return R.ok(iCrmOrderItemService.queryCoilsByOrderIdStatistics(bo.getOrderId(), bo.getCoilBo()));
}
/**
* 根据销售员统计生产成果汇总,支持钢卷信息筛选
*/
@PostMapping("/coils/salesman/statistics")
public R<java.util.Map<String, java.math.BigDecimal>> getCoilsBySalesmanStatistics(@RequestBody @Validated SalesmanCoilQueryBo bo) {
return R.ok(iCrmOrderItemService.queryCoilsBySalesmanStatistics(bo.getSalesman(), bo.getCoilBo()));
}
/**
* 根据合同ID统计生产成果汇总支持钢卷信息筛选
*/
@PostMapping("/coils/contract/statistics")
public R<java.util.Map<String, java.math.BigDecimal>> getCoilsByContractIdStatistics(@RequestBody @Validated ContractCoilQueryBo bo) {
return R.ok(iCrmOrderItemService.queryCoilsByContractIdStatistics(bo.getOrderId(), bo.getCoilBo()));
}
// ==================== 已有接口 ====================
// 根据合同id查询发货单据中的配卷。
@GetMapping("/coils/contract/{contractId}")
public R<List<WmsMaterialCoilVo>> getCoilsByContractId(@NotNull(message = "合同ID不能为空")
@PathVariable Long contractId) {
return R.ok(iCrmOrderItemService.queryCoilsByContractId(contractId));
@PathVariable Long orderId) {
return R.ok(iCrmOrderItemService.queryCoilsByContractId(orderId));
}
// 根据客户id查询该客户下属订单关联的异议和财务信息。
@@ -132,4 +210,17 @@ public class CrmOrderItemController extends BaseController {
@PathVariable String customerId) {
return R.ok(iCrmOrderItemService.queryCoilsByCustomerId(customerId));
}
// ==================== 私有辅助方法 ====================
private PageQuery toPageQuery(OrderCoilQueryBo bo) { return buildPageQuery(bo.getPageNum(), bo.getPageSize()); }
private PageQuery toPageQuery(SalesmanCoilQueryBo bo) { return buildPageQuery(bo.getPageNum(), bo.getPageSize()); }
private PageQuery toPageQuery(ContractCoilQueryBo bo) { return buildPageQuery(bo.getPageNum(), bo.getPageSize()); }
private PageQuery buildPageQuery(Integer pageNum, Integer pageSize) {
PageQuery pageQuery = new PageQuery();
pageQuery.setPageNum(pageNum);
pageQuery.setPageSize(pageSize);
return pageQuery;
}
}

View File

@@ -85,6 +85,15 @@ public class CrmSalesReportController extends BaseController {
return R.ok(stats);
}
/**
* 查询省份统计数据
*/
@GetMapping("/provinceStats")
public R<List<CrmSalesReportVo.ProvinceStat>> getProvinceStats(CrmSalesReportBo bo) {
List<CrmSalesReportVo.ProvinceStat> stats = iCrmSalesReportService.queryProvinceStats(bo);
return R.ok(stats);
}
/**
* 导出销售报表订单明细
*/

View File

@@ -0,0 +1,31 @@
package com.klp.crm.domain.bo;
import com.klp.domain.bo.WmsMaterialCoilBo;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* 合同钢卷查询请求对象
*
* @author klp
* @date 2026-07-09
*/
@Data
public class ContractCoilQueryBo implements Serializable {
private static final long serialVersionUID = 1L;
/** 合同ID必填 */
@NotNull(message = "合同ID不能为空")
private Long orderId;
/** 分页页码 */
private Integer pageNum;
/** 分页大小 */
private Integer pageSize;
/** 钢卷筛选条件 */
private WmsMaterialCoilBo coilBo;
}

View File

@@ -265,4 +265,14 @@ public class CrmOrderBo extends BaseEntity {
@JsonFormat(pattern = "yyyy-MM-dd")
private Date deliveryDateEnd;
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd")
private Date bindDateStart;
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd")
private Date bindDateEnd;
private Boolean onlyBoundSchedule;
}

View File

@@ -0,0 +1,31 @@
package com.klp.crm.domain.bo;
import com.klp.domain.bo.WmsMaterialCoilBo;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* 订单钢卷查询请求对象
*
* @author klp
* @date 2026-07-09
*/
@Data
public class OrderCoilQueryBo implements Serializable {
private static final long serialVersionUID = 1L;
/** 订单ID必填 */
@NotNull(message = "订单ID不能为空")
private Long orderId;
/** 分页页码 */
private Integer pageNum;
/** 分页大小 */
private Integer pageSize;
/** 钢卷筛选条件 */
private WmsMaterialCoilBo coilBo;
}

View File

@@ -0,0 +1,31 @@
package com.klp.crm.domain.bo;
import com.klp.domain.bo.WmsMaterialCoilBo;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
/**
* 销售员钢卷查询请求对象
*
* @author klp
* @date 2026-07-09
*/
@Data
public class SalesmanCoilQueryBo implements Serializable {
private static final long serialVersionUID = 1L;
/** 销售员(必填) */
@NotBlank(message = "销售员不能为空")
private String salesman;
/** 分页页码 */
private Integer pageNum;
/** 分页大小 */
private Integer pageSize;
/** 钢卷筛选条件 */
private WmsMaterialCoilBo coilBo;
}

View File

@@ -0,0 +1,76 @@
package com.klp.crm.domain.vo;
import java.math.BigDecimal;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
/**
* 合同编辑详情导出视图对象
* 仅包含页面表格展示的业务字段19列
*
* @author klp
* @date 2026-07-06
*/
@Data
@ExcelIgnoreUnannotated
public class CrmOrderExportVo {
@ExcelProperty(value = "合同号")
private String contractCode;
@ExcelProperty(value = "供方")
private String supplier;
@ExcelProperty(value = "需方")
private String customer;
@ExcelProperty(value = "业务员")
private String salesman;
@ExcelProperty(value = "签订日期")
private String signTime;
@ExcelProperty(value = "交货日期")
private String deliveryDate;
@ExcelProperty(value = "签订地点")
private String signLocation;
@ExcelProperty(value = "供方地址")
private String supplierAddress;
@ExcelProperty(value = "供方电话")
private String supplierPhone;
@ExcelProperty(value = "供方开户行")
private String supplierBank;
@ExcelProperty(value = "供方账号")
private String supplierAccount;
@ExcelProperty(value = "需方地址")
private String customerAddress;
@ExcelProperty(value = "需方电话")
private String customerPhone;
@ExcelProperty(value = "需方开户行")
private String customerBank;
@ExcelProperty(value = "需方账号")
private String customerAccount;
@ExcelProperty(value = "订单金额")
private BigDecimal orderAmount;
@ExcelProperty(value = "已收款")
private BigDecimal receivedAmount;
@ExcelProperty(value = "状态")
private String status;
@ExcelProperty(value = "备注")
private String remark;
}

View File

@@ -0,0 +1,127 @@
package com.klp.crm.domain.vo;
import java.math.BigDecimal;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
/**
* 订单明细列表导出视图对象
* 仅包含页面表格展示的业务字段32列
*
* @author klp
* @date 2026-07-06
*/
@Data
@ExcelIgnoreUnannotated
public class CrmOrderItemExportVo {
// ========== 合同信息(联表) ==========
@ExcelProperty(value = "合同号")
private String contractCode;
@ExcelProperty(value = "合同名称")
private String contractName;
@ExcelProperty(value = "需方")
private String customer;
@ExcelProperty(value = "供方")
private String supplier;
@ExcelProperty(value = "业务员")
private String salesman;
@ExcelProperty(value = "签订时间")
private String signTime;
@ExcelProperty(value = "订单编号")
private String orderCode;
// ========== 明细标识 ==========
@ExcelProperty(value = "明细ID")
private Long itemId;
@ExcelProperty(value = "订单ID")
private Long orderId;
// ========== 产品规格 ==========
@ExcelProperty(value = "产品类型")
private String productType;
@ExcelProperty(value = "原料规格")
private String rawMaterialSpec;
@ExcelProperty(value = "成品规格")
private String finishedProductSpec;
@ExcelProperty(value = "数量")
private Long productNum;
@ExcelProperty(value = "材质")
private String material;
@ExcelProperty(value = "等级")
private String grade;
@ExcelProperty(value = "宽度")
private String width;
@ExcelProperty(value = "厚度")
private String thickness;
@ExcelProperty(value = "宽度公差")
private String widthTolerance;
@ExcelProperty(value = "厚度公差")
private String thicknessTolerance;
@ExcelProperty(value = "重量")
private BigDecimal weight;
// ========== 价格 ==========
@ExcelProperty(value = "合同定价")
private BigDecimal contractPrice;
@ExcelProperty(value = "明细金额")
private BigDecimal itemAmount;
// ========== 加工要求 ==========
@ExcelProperty(value = "表面处理")
private String surfaceTreatment;
@ExcelProperty(value = "包装要求")
private String packagingReq;
@ExcelProperty(value = "切边要求")
private String edgeCuttingReq;
@ExcelProperty(value = "表面质量")
private String surfaceQuality;
// ========== 其他 ==========
@ExcelProperty(value = "特殊要求")
private String specialRequire;
@ExcelProperty(value = "用途")
private String purpose;
@ExcelProperty(value = "备注")
private String remark;
@ExcelProperty(value = "定制人")
private String customizer;
@ExcelProperty(value = "发货人")
private String shipper;
@ExcelProperty(value = "排产批次")
private String productionBatch;
}

View File

@@ -234,6 +234,12 @@ public class CrmOrderItemVo {
@ExcelProperty(value = "交货日期")
private Date deliveryDate;
/**
* 销售员(联表查询直接映射)
*/
@ExcelProperty(value = "销售员")
private String salesman;
/**
* 订单信息
*/

View File

@@ -290,4 +290,35 @@ public class CrmSalesReportVo {
@ExcelProperty(value = "销售金额")
private BigDecimal salesAmount;
}
/**
* 省份统计内部类
*/
@Data
public static class ProvinceStat {
/**
* 省份
*/
@ExcelProperty(value = "省份")
private String province;
/**
* 客户数量
*/
@ExcelProperty(value = "客户数量")
private Integer customerCount;
/**
* 订单数量
*/
@ExcelProperty(value = "订单数量")
private Integer orderCount;
/**
* 销售金额
*/
@ExcelProperty(value = "销售金额")
private BigDecimal salesAmount;
}
}

View File

@@ -12,4 +12,9 @@ import com.klp.common.core.mapper.BaseMapperPlus;
*/
public interface CrmCustomerMapper extends BaseMapperPlus<CrmCustomerMapper, CrmCustomer, CrmCustomerVo> {
/**
* 查询当前最大的customer_code用于自动生成新编码
*/
String selectMaxCustomerCode();
}

View File

@@ -54,4 +54,12 @@ public interface CrmSalesReportMapper {
* @return 行业统计列表
*/
List<CrmSalesReportVo.IndustryStat> selectIndustryStats(@Param("bo") CrmSalesReportBo bo);
/**
* 查询省份统计数据
*
* @param bo 查询条件
* @return 省份统计列表
*/
List<CrmSalesReportVo.ProvinceStat> selectProvinceStats(@Param("bo") CrmSalesReportBo bo);
}

View File

@@ -11,6 +11,7 @@ import java.util.List;
import com.klp.crm.domain.vo.CrmContractOrderFinanceVo;
import com.klp.domain.vo.WmsMaterialCoilVo;
import com.klp.domain.bo.WmsMaterialCoilBo;
import java.util.List;
/**
@@ -57,14 +58,14 @@ public interface ICrmOrderItemService {
CrmContractOrderFinanceVo queryFinanceAndObjectionByContractId(Long contractId);
/**
* 根据订单ID查询发货单配卷
* 根据订单ID查询发货单配卷(分页)
*/
List<WmsMaterialCoilVo> queryCoilsByOrderId(Long orderId);
TableDataInfo<WmsMaterialCoilVo> queryCoilsByOrderId(Long orderId, PageQuery pageQuery, WmsMaterialCoilBo coilBo);
/**
* 根据合同ID查询发货单配卷
*/
List<WmsMaterialCoilVo> queryCoilsByContractId(Long contractId);
List<WmsMaterialCoilVo> queryCoilsByContractId(Long orderId);
/**
* 根据客户ID查询下属订单的异议和财务信息
@@ -75,4 +76,29 @@ public interface ICrmOrderItemService {
* 根据客户ID查询发货单配卷
*/
List<WmsMaterialCoilVo> queryCoilsByCustomerId(String customerId);
/**
* 根据销售员查询生产成果(钢卷列表)分页
*/
TableDataInfo<WmsMaterialCoilVo> queryCoilsBySalesman(String salesman, PageQuery pageQuery, WmsMaterialCoilBo coilBo);
/**
* 根据合同ID查询生产成果钢卷列表分页
*/
TableDataInfo<WmsMaterialCoilVo> queryCoilsByContractIdPaginated(Long orderId, PageQuery pageQuery, WmsMaterialCoilBo coilBo);
/**
* 根据订单ID统计配卷汇总数据数量、毛重、净重
*/
java.util.Map<String, java.math.BigDecimal> queryCoilsByOrderIdStatistics(Long orderId, WmsMaterialCoilBo coilBo);
/**
* 根据销售员统计生产成果汇总数据(数量、毛重、净重)
*/
java.util.Map<String, java.math.BigDecimal> queryCoilsBySalesmanStatistics(String salesman, WmsMaterialCoilBo coilBo);
/**
* 根据合同ID统计生产成果汇总数据数量、毛重、净重
*/
java.util.Map<String, java.math.BigDecimal> queryCoilsByContractIdStatistics(Long orderId, WmsMaterialCoilBo coilBo);
}

View File

@@ -72,4 +72,12 @@ public interface ICrmSalesReportService {
* @return 行业统计列表
*/
List<CrmSalesReportVo.IndustryStat> queryIndustryStats(CrmSalesReportBo bo);
/**
* 查询省份统计数据
*
* @param bo 查询条件
* @return 省份统计列表
*/
List<CrmSalesReportVo.ProvinceStat> queryProvinceStats(CrmSalesReportBo bo);
}

View File

@@ -91,6 +91,25 @@ public class CrmCustomerServiceImpl implements ICrmCustomerService {
@Override
public Boolean insertByBo(CrmCustomerBo bo) {
CrmCustomer add = BeanUtil.toBean(bo, CrmCustomer.class);
// 自动生成customer_code查询最大编码并加1
if (StringUtils.isBlank(add.getCustomerCode())) {
String maxCode = baseMapper.selectMaxCustomerCode();
if (StringUtils.isBlank(maxCode)) {
add.setCustomerCode("00001");
} else {
// 提取末尾数字后缀并递增,支持纯数字("00001")和带前缀("KH00001")两种格式
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("^(.*?)(\\d+)$");
java.util.regex.Matcher matcher = pattern.matcher(maxCode);
if (matcher.matches()) {
String prefix = matcher.group(1);
String numStr = matcher.group(2);
long num = Long.parseLong(numStr) + 1;
add.setCustomerCode(prefix + String.format("%0" + numStr.length() + "d", num));
} else {
add.setCustomerCode(maxCode + "1");
}
}
}
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {

View File

@@ -35,6 +35,8 @@ import com.klp.crm.service.ICrmOrderItemService;
import com.klp.mapper.WmsReceivableMapper;
import com.klp.mapper.WmsDeliveryWaybillMapper;
import com.klp.mapper.WmsDeliveryWaybillDetailMapper;
import com.klp.mapper.WmsCoilContractRelMapper;
import com.klp.domain.WmsCoilContractRel;
import com.klp.service.IWmsMaterialCoilService;
import java.util.*;
@@ -57,6 +59,7 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService {
private final WmsReceivableMapper wmsReceivableMapper;
private final WmsDeliveryWaybillMapper wmsDeliveryWaybillMapper;
private final WmsDeliveryWaybillDetailMapper wmsDeliveryWaybillDetailMapper;
private final WmsCoilContractRelMapper coilContractRelMapper;
private final IWmsMaterialCoilService iWmsMaterialCoilService;
/**
@@ -165,7 +168,11 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService {
Map<Long, CrmOrderVo> orderMap = orderList.stream()
.collect(Collectors.toMap(CrmOrderVo::getOrderId, o -> o, (a, b) -> a));
for (CrmOrderItemVo item : records) {
item.setOrderInfo(orderMap.get(item.getOrderId()));
CrmOrderVo order = orderMap.get(item.getOrderId());
item.setOrderInfo(order);
if (order != null) {
item.setSalesman(order.getSalesman());
}
}
}
@@ -253,33 +260,21 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService {
}
@Override
public CrmContractOrderFinanceVo queryFinanceAndObjectionByContractId(Long contractId) {
public CrmContractOrderFinanceVo queryFinanceAndObjectionByContractId(Long orderId) {
CrmContractOrderFinanceVo result = new CrmContractOrderFinanceVo();
LambdaQueryWrapper<CrmOrder> orderWrapper = new LambdaQueryWrapper<>();
orderWrapper.eq(CrmOrder::getContractId, contractId);
List<CrmOrder> orders = crmOrderMapper.selectList(orderWrapper);
if (orders == null || orders.isEmpty()) {
return result;
}
List<Long> orderIds = orders.stream()
.map(CrmOrder::getOrderId)
.collect(Collectors.toList());
LambdaQueryWrapper<CrmSalesObjection> objectionWrapper = new LambdaQueryWrapper<>();
objectionWrapper.in(CrmSalesObjection::getOrderId, orderIds);
objectionWrapper.in(CrmSalesObjection::getOrderId, orderId);
List<CrmSalesObjectionVo> objectionList = crmSalesObjectionMapper.selectVoList(objectionWrapper);
result.setObjectionList(objectionList);
LambdaQueryWrapper<com.klp.domain.WmsReceivable> receivableWrapper = new LambdaQueryWrapper<>();
receivableWrapper.in(WmsReceivable::getOrderId, orderIds);
receivableWrapper.in(WmsReceivable::getOrderId, orderId);
List<WmsReceivableVo> receivableList = wmsReceivableMapper.selectVoList(receivableWrapper);
result.setReceivableList(receivableList);
LambdaQueryWrapper<WmsDeliveryWaybill> waybillWrapper = new LambdaQueryWrapper<>();
waybillWrapper.in(WmsDeliveryWaybill::getOrderId, orderIds);
waybillWrapper.in(WmsDeliveryWaybill::getOrderId, orderId);
List<WmsDeliveryWaybillVo> wmsDeliveryWaybills = wmsDeliveryWaybillMapper.selectVoList(waybillWrapper);
result.setWmsDeliveryWaybills(wmsDeliveryWaybills);
@@ -287,16 +282,19 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService {
return result;
}
@Override
public List<WmsMaterialCoilVo> queryCoilsByOrderId(Long orderId) {
// ==================== 线圈ID解析辅助方法 ====================
/**
* 根据订单ID解析关联的线圈ID串通过发货单→发货单明细
* @return 逗号分隔的coilId字符串无数据返回null
*/
private String resolveCoilIdsByOrderId(Long orderId) {
LambdaQueryWrapper<WmsDeliveryWaybill> waybillWrapper = new LambdaQueryWrapper<>();
waybillWrapper.eq(WmsDeliveryWaybill::getOrderId, orderId);
List<WmsDeliveryWaybill> waybills = wmsDeliveryWaybillMapper.selectList(waybillWrapper);
if (waybills == null || waybills.isEmpty()) {
return Collections.emptyList();
return null;
}
List<Long> waybillIds = waybills.stream()
.map(WmsDeliveryWaybill::getWaybillId)
.collect(Collectors.toList());
@@ -304,43 +302,157 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService {
LambdaQueryWrapper<WmsDeliveryWaybillDetail> detailWrapper = new LambdaQueryWrapper<>();
detailWrapper.in(WmsDeliveryWaybillDetail::getWaybillId, waybillIds);
List<WmsDeliveryWaybillDetail> details = wmsDeliveryWaybillDetailMapper.selectList(detailWrapper);
if (details == null || details.isEmpty()) {
return Collections.emptyList();
return null;
}
String coilIds = details.stream()
return details.stream()
.map(WmsDeliveryWaybillDetail::getCoilId)
.map(String::valueOf)
.collect(Collectors.joining(","));
WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo();
coilBo.setCoilIds(coilIds);
return iWmsMaterialCoilService.queryList(coilBo);
}
@Override
public List<WmsMaterialCoilVo> queryCoilsByContractId(Long contractId) {
/**
* 根据销售员解析关联的线圈ID串通过crm_order→wms_coil_contract_rel
* @return 逗号分隔的coilId字符串无数据返回null
*/
private String resolveCoilIdsBySalesman(String salesman) {
LambdaQueryWrapper<CrmOrder> orderWrapper = new LambdaQueryWrapper<>();
orderWrapper.eq(CrmOrder::getContractId, contractId);
orderWrapper.eq(CrmOrder::getSalesman, salesman);
orderWrapper.eq(CrmOrder::getDelFlag, 0);
List<CrmOrder> orders = crmOrderMapper.selectList(orderWrapper);
if (orders == null || orders.isEmpty()) {
return Collections.emptyList();
return null;
}
List<Long> orderIds = orders.stream()
.map(CrmOrder::getOrderId)
.collect(Collectors.toList());
LambdaQueryWrapper<WmsDeliveryWaybill> waybillWrapper = new LambdaQueryWrapper<>();
waybillWrapper.in(WmsDeliveryWaybill::getOrderId, orderIds);
List<WmsDeliveryWaybill> waybills = wmsDeliveryWaybillMapper.selectList(waybillWrapper);
LambdaQueryWrapper<WmsCoilContractRel> relWrapper = new LambdaQueryWrapper<>();
relWrapper.in(WmsCoilContractRel::getContractId, orderIds);
relWrapper.eq(WmsCoilContractRel::getDelFlag, 0);
List<WmsCoilContractRel> rels = coilContractRelMapper.selectList(relWrapper);
if (rels == null || rels.isEmpty()) {
return null;
}
return rels.stream()
.map(WmsCoilContractRel::getCoilId)
.distinct()
.map(String::valueOf)
.collect(Collectors.joining(","));
}
/**
* 根据合同ID解析关联的线圈ID串通过crm_order→wms_coil_contract_rel
* @return 逗号分隔的coilId字符串无数据返回null
*/
private String resolveCoilIdsByContractId(Long orderId) {
LambdaQueryWrapper<WmsCoilContractRel> relWrapper = new LambdaQueryWrapper<>();
relWrapper.eq(WmsCoilContractRel::getContractId, orderId);
relWrapper.eq(WmsCoilContractRel::getDelFlag, 0);
List<WmsCoilContractRel> rels = coilContractRelMapper.selectList(relWrapper);
if (rels == null || rels.isEmpty()) {
return null;
}
return rels.stream()
.map(WmsCoilContractRel::getCoilId)
.distinct()
.map(String::valueOf)
.collect(Collectors.joining(","));
}
// ==================== 分页列表查询 ====================
@Override
public TableDataInfo<WmsMaterialCoilVo> queryCoilsByOrderId(Long orderId, PageQuery pageQuery, WmsMaterialCoilBo coilBo) {
String coilIds = resolveCoilIdsByOrderId(orderId);
if (coilIds == null) {
return new TableDataInfo<>();
}
if (coilBo == null) {
coilBo = new WmsMaterialCoilBo();
}
coilBo.setCoilIds(coilIds);
return iWmsMaterialCoilService.queryPageList(coilBo, pageQuery);
}
@Override
public TableDataInfo<WmsMaterialCoilVo> queryCoilsBySalesman(String salesman, PageQuery pageQuery, WmsMaterialCoilBo coilBo) {
String coilIds = resolveCoilIdsBySalesman(salesman);
if (coilIds == null) {
return new TableDataInfo<>();
}
if (coilBo == null) {
coilBo = new WmsMaterialCoilBo();
}
coilBo.setCoilIds(coilIds);
return iWmsMaterialCoilService.queryPageList(coilBo, pageQuery);
}
@Override
public TableDataInfo<WmsMaterialCoilVo> queryCoilsByContractIdPaginated(Long contractId, PageQuery pageQuery, WmsMaterialCoilBo coilBo) {
String coilIds = resolveCoilIdsByContractId(contractId);
if (coilIds == null) {
return new TableDataInfo<>();
}
if (coilBo == null) {
coilBo = new WmsMaterialCoilBo();
}
coilBo.setCoilIds(coilIds);
return iWmsMaterialCoilService.queryPageList(coilBo, pageQuery);
}
// ==================== 统计汇总查询 ====================
@Override
public Map<String, java.math.BigDecimal> queryCoilsByOrderIdStatistics(Long orderId, WmsMaterialCoilBo coilBo) {
String coilIds = resolveCoilIdsByOrderId(orderId);
if (coilIds == null) {
return emptyStatistics();
}
if (coilBo == null) {
coilBo = new WmsMaterialCoilBo();
}
coilBo.setCoilIds(coilIds);
return iWmsMaterialCoilService.getStatistics(coilBo);
}
@Override
public Map<String, java.math.BigDecimal> queryCoilsBySalesmanStatistics(String salesman, WmsMaterialCoilBo coilBo) {
String coilIds = resolveCoilIdsBySalesman(salesman);
if (coilIds == null) {
return emptyStatistics();
}
if (coilBo == null) {
coilBo = new WmsMaterialCoilBo();
}
coilBo.setCoilIds(coilIds);
return iWmsMaterialCoilService.getStatistics(coilBo);
}
@Override
public Map<String, java.math.BigDecimal> queryCoilsByContractIdStatistics(Long orderId, WmsMaterialCoilBo coilBo) {
String coilIds = resolveCoilIdsByContractId(orderId);
if (coilIds == null) {
return emptyStatistics();
}
if (coilBo == null) {
coilBo = new WmsMaterialCoilBo();
}
coilBo.setCoilIds(coilIds);
return iWmsMaterialCoilService.getStatistics(coilBo);
}
// ==================== 已有方法(非分页) ====================
@Override
public List<WmsMaterialCoilVo> queryCoilsByContractId(Long orderId) {
LambdaQueryWrapper<WmsDeliveryWaybill> waybillWrapper = new LambdaQueryWrapper<>();
waybillWrapper.eq(WmsDeliveryWaybill::getOrderId, orderId);
List<WmsDeliveryWaybill> waybills = wmsDeliveryWaybillMapper.selectList(waybillWrapper);
if (waybills == null || waybills.isEmpty()) {
return Collections.emptyList();
}
List<Long> waybillIds = waybills.stream()
.map(WmsDeliveryWaybill::getWaybillId)
.collect(Collectors.toList());
@@ -348,11 +460,9 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService {
LambdaQueryWrapper<WmsDeliveryWaybillDetail> detailWrapper = new LambdaQueryWrapper<>();
detailWrapper.in(WmsDeliveryWaybillDetail::getWaybillId, waybillIds);
List<WmsDeliveryWaybillDetail> details = wmsDeliveryWaybillDetailMapper.selectList(detailWrapper);
if (details == null || details.isEmpty()) {
return Collections.emptyList();
}
String coilIds = details.stream()
.map(WmsDeliveryWaybillDetail::getCoilId)
.map(String::valueOf)
@@ -370,11 +480,9 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService {
LambdaQueryWrapper<CrmOrder> orderWrapper = new LambdaQueryWrapper<>();
orderWrapper.eq(CrmOrder::getCustomerId, customerId);
List<CrmOrder> orders = crmOrderMapper.selectList(orderWrapper);
if (orders == null || orders.isEmpty()) {
return result;
}
List<Long> orderIds = orders.stream()
.map(CrmOrder::getOrderId)
.collect(Collectors.toList());
@@ -402,11 +510,9 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService {
LambdaQueryWrapper<CrmOrder> orderWrapper = new LambdaQueryWrapper<>();
orderWrapper.eq(CrmOrder::getCustomerId, customerId);
List<CrmOrder> orders = crmOrderMapper.selectList(orderWrapper);
if (orders == null || orders.isEmpty()) {
return Collections.emptyList();
}
List<Long> orderIds = orders.stream()
.map(CrmOrder::getOrderId)
.collect(Collectors.toList());
@@ -414,11 +520,9 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService {
LambdaQueryWrapper<WmsDeliveryWaybill> waybillWrapper = new LambdaQueryWrapper<>();
waybillWrapper.in(WmsDeliveryWaybill::getOrderId, orderIds);
List<WmsDeliveryWaybill> waybills = wmsDeliveryWaybillMapper.selectList(waybillWrapper);
if (waybills == null || waybills.isEmpty()) {
return Collections.emptyList();
}
List<Long> waybillIds = waybills.stream()
.map(WmsDeliveryWaybill::getWaybillId)
.collect(Collectors.toList());
@@ -426,11 +530,9 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService {
LambdaQueryWrapper<WmsDeliveryWaybillDetail> detailWrapper = new LambdaQueryWrapper<>();
detailWrapper.in(WmsDeliveryWaybillDetail::getWaybillId, waybillIds);
List<WmsDeliveryWaybillDetail> details = wmsDeliveryWaybillDetailMapper.selectList(detailWrapper);
if (details == null || details.isEmpty()) {
return Collections.emptyList();
}
String coilIds = details.stream()
.map(WmsDeliveryWaybillDetail::getCoilId)
.map(String::valueOf)
@@ -440,4 +542,12 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService {
coilBo.setCoilIds(coilIds);
return iWmsMaterialCoilService.queryList(coilBo);
}
private Map<String, java.math.BigDecimal> emptyStatistics() {
Map<String, java.math.BigDecimal> empty = new HashMap<>();
empty.put("total_count", java.math.BigDecimal.ZERO);
empty.put("total_gross_weight", java.math.BigDecimal.ZERO);
empty.put("total_net_weight", java.math.BigDecimal.ZERO);
return empty;
}
}

View File

@@ -107,6 +107,12 @@ public class CrmOrderServiceImpl implements ICrmOrderService {
return TableDataInfo.build(result);
}
extracted(records);
return TableDataInfo.build(result);
}
private void extracted(List<CrmOrderVo> records) {
Set<String> userNames = records.stream()
.flatMap(v -> java.util.stream.Stream.of(v.getCreateBy(), v.getUpdateBy()))
.filter(StringUtils::isNotBlank)
@@ -178,8 +184,6 @@ public class CrmOrderServiceImpl implements ICrmOrderService {
}
}
}
return TableDataInfo.build(result);
}
private QueryWrapper<CrmOrder> buildQueryWrapperPlus(CrmOrderBo bo) {
@@ -243,6 +247,24 @@ public class CrmOrderServiceImpl implements ICrmOrderService {
qw.lt(bo.getSignDateEnd() != null, "co.sign_time", addOneDay(bo.getSignDateEnd()));
qw.ge(bo.getDeliveryDateStart() != null, "co.delivery_date", bo.getDeliveryDateStart());
qw.lt(bo.getDeliveryDateEnd() != null, "co.delivery_date", addOneDay(bo.getDeliveryDateEnd()));
boolean applyBoundFilter = Boolean.TRUE.equals(bo.getOnlyBoundSchedule())
|| bo.getBindDateStart() != null
|| bo.getBindDateEnd() != null;
if (applyBoundFilter) {
StringBuilder existsSql = new StringBuilder();
List<Object> args = new ArrayList<>();
existsSql.append("exists (select 1 from sch_sale_schedule_rel rel where rel.del_flag = 0 and rel.order_id = co.order_id");
if (bo.getBindDateStart() != null) {
existsSql.append(" and rel.create_time >= {").append(args.size()).append("}");
args.add(bo.getBindDateStart());
}
if (bo.getBindDateEnd() != null) {
existsSql.append(" and rel.create_time < {").append(args.size()).append("}");
args.add(addOneDay(bo.getBindDateEnd()));
}
existsSql.append(")");
qw.apply(existsSql.toString(), args.toArray());
}
if(bo.getOrderIds() !=null){
qw.in(!bo.getOrderIds().isEmpty(), "co.order_id", bo.getOrderIds());
}
@@ -250,11 +272,9 @@ public class CrmOrderServiceImpl implements ICrmOrderService {
qw.eq("co.del_flag", 0);
//排序规则:
// 1. 置顶优先 (is_top=1 排在前面)
// 2. 状态为1(已生效)的排在前
// 3. 创建时间倒序
// 2. 合同号倒序KLPY+年月日+序号,降序最新在前
qw.orderByDesc("co.is_top")
.orderByDesc("CASE WHEN co.status = 1 THEN 1 ELSE 0 END")
.orderByDesc("co.create_time");
.orderByDesc("co.contract_code");
return qw;
}
@@ -264,7 +284,9 @@ public class CrmOrderServiceImpl implements ICrmOrderService {
@Override
public List<CrmOrderVo> queryList(CrmOrderBo bo) {
QueryWrapper<CrmOrder> lqw = buildQueryWrapperPlus(bo);
return baseMapper.selectVoPagePlus(lqw);
List<CrmOrderVo> crmOrderVos = baseMapper.selectVoPagePlus(lqw);
extracted(crmOrderVos);
return crmOrderVos;
}
/**
@@ -287,9 +309,37 @@ public class CrmOrderServiceImpl implements ICrmOrderService {
*/
@Override
public Boolean updateByBo(CrmOrderBo bo) {
// 查询旧订单获取原销售员和原合同编号,用于判断是否需要同步钢卷
CrmOrder oldOrder = null;
String oldSalesman = null;
String oldContractCode = null;
if (bo.getOrderId() != null) {
oldOrder = baseMapper.selectById(bo.getOrderId());
if (oldOrder != null) {
oldSalesman = oldOrder.getSalesman();
oldContractCode = oldOrder.getContractCode();
}
}
CrmOrder update = BeanUtil.toBean(bo, CrmOrder.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
boolean result = baseMapper.updateById(update) > 0;
// 如果销售员或合同编号变更,同步更新所有关联钢卷
if (result && oldOrder != null) {
String newSalesman = update.getSalesman();
String newContractCode = update.getContractCode();
boolean salesmanChanged = !Objects.equals(oldSalesman, newSalesman);
boolean contractCodeChanged = !Objects.equals(oldContractCode, newContractCode);
if (salesmanChanged || contractCodeChanged) {
coilContractRelMapper.updateCoilSaleNameByOrderId(
bo.getOrderId(),
StringUtils.isNotBlank(newSalesman) ? newSalesman : oldSalesman,
StringUtils.isNotBlank(newContractCode) ? newContractCode : oldContractCode);
}
}
return result;
}
/**

View File

@@ -136,4 +136,12 @@ public class CrmSalesReportServiceImpl implements ICrmSalesReportService {
public List<CrmSalesReportVo.IndustryStat> queryIndustryStats(CrmSalesReportBo bo) {
return baseMapper.selectIndustryStats(bo);
}
/**
* 查询省份统计数据
*/
@Override
public List<CrmSalesReportVo.ProvinceStat> queryProvinceStats(CrmSalesReportBo bo) {
return baseMapper.selectProvinceStats(bo);
}
}

View File

@@ -23,5 +23,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="delFlag" column="del_flag"/>
</resultMap>
<select id="selectMaxCustomerCode" resultType="String">
SELECT customer_code FROM crm_customer WHERE del_flag = 0 ORDER BY LENGTH(customer_code) DESC, customer_code DESC LIMIT 1
</select>
</mapper>

View File

@@ -74,6 +74,7 @@
<result property="customer" column="customer"/>
<result property="signTime" column="sign_time"/>
<result property="deliveryDate" column="delivery_date"/>
<result property="salesman" column="salesman"/>
</resultMap>
<!-- 根据订单ID列表查询订单明细 -->
@@ -155,7 +156,8 @@
o.supplier,
o.customer,
o.sign_time,
o.delivery_date
o.delivery_date,
o.salesman
FROM crm_order_item i
LEFT JOIN crm_order o ON i.order_id = o.order_id AND o.del_flag = 0
<where>

View File

@@ -268,4 +268,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
ORDER BY salesAmount DESC
</select>
<!-- 查询省份统计数据 -->
<select id="selectProvinceStats" resultType="com.klp.crm.domain.vo.CrmSalesReportVo$ProvinceStat">
SELECT
COALESCE(c.province, '其他') as province,
COUNT(DISTINCT c.customer_id) as customerCount,
COUNT(o.order_id) as orderCount,
COALESCE(SUM(o.order_amount), 0) as salesAmount
FROM crm_order o
LEFT JOIN crm_customer c ON o.customer_id = c.customer_id
<include refid="selectCondition"/>
GROUP BY c.province
ORDER BY salesAmount DESC
</select>
</mapper>

View File

@@ -31,4 +31,7 @@ public class CoilTotalMergedExportVo implements Serializable {
@ExcelProperty("总成本")
private Double totalCost;
@ExcelProperty("钢卷ID")
private Long coilId;
}

View File

@@ -0,0 +1,170 @@
package com.klp.erp.controller;
import com.klp.common.annotation.Log;
import com.klp.common.annotation.RepeatSubmit;
import com.klp.common.core.controller.BaseController;
import com.klp.common.core.domain.PageQuery;
import com.klp.common.core.domain.R;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.validate.AddGroup;
import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil;
import com.klp.erp.domain.bo.ErpPurchasePlanAuditBo;
import com.klp.erp.domain.bo.ErpPurchasePlanBo;
import com.klp.erp.domain.vo.ErpContractOptionVo;
import com.klp.erp.domain.vo.ErpPurchasePlanDeliveryVo;
import com.klp.erp.domain.vo.ErpPurchasePlanItemVo;
import com.klp.erp.domain.vo.ErpPurchasePlanVo;
import com.klp.erp.service.IErpPurchasePlanService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* 采购计划
*
* @author klp
* @date 2026-06-22
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/erp/purchasePlan")
public class ErpPurchasePlanController extends BaseController {
private final IErpPurchasePlanService iErpPurchasePlanService;
/** 查询采购计划列表 */
@GetMapping("/list")
public TableDataInfo<ErpPurchasePlanVo> list(ErpPurchasePlanBo bo, PageQuery pageQuery) {
return iErpPurchasePlanService.queryPageList(bo, pageQuery);
}
/** 总体到货进度统计(已完成 N / 共 M */
@GetMapping("/statistics")
public R<Map<String, Object>> statistics(ErpPurchasePlanBo bo) {
return R.ok(iErpPurchasePlanService.statistics(bo));
}
/** 导出采购计划列表 */
@Log(title = "采购计划", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(ErpPurchasePlanBo bo, HttpServletResponse response) {
List<ErpPurchasePlanVo> list = iErpPurchasePlanService.queryList(bo);
ExcelUtil.exportExcel(list, "采购计划", ErpPurchasePlanVo.class, response);
}
/** 获取采购计划详细信息 */
@GetMapping("/{planId}")
public R<ErpPurchasePlanVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long planId) {
return R.ok(iErpPurchasePlanService.queryById(planId));
}
/** 按销售合同取明细选合同自动带出明细1/2/3合同 -> 1/2/3/4明细 */
@GetMapping("/itemsByOrders")
public R<List<ErpPurchasePlanItemVo>> itemsByOrders(@RequestParam("orderIds") List<Long> orderIds) {
return R.ok(iErpPurchasePlanService.queryItemsByOrders(orderIds));
}
/** 合同列表左侧crm_order + 每个合同已有的采购计划数 */
@GetMapping("/contracts")
public TableDataInfo<ErpContractOptionVo> contracts(@RequestParam(value = "keyword", required = false) String keyword,
PageQuery pageQuery) {
return iErpPurchasePlanService.queryContractPage(keyword, pageQuery);
}
/** 某合同下的所有采购计划 */
@GetMapping("/byContract/{orderId}")
public R<List<ErpPurchasePlanVo>> byContract(@PathVariable Long orderId) {
return R.ok(iErpPurchasePlanService.queryPlansByContract(orderId));
}
/** 新增采购计划 */
@Log(title = "采购计划", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody ErpPurchasePlanBo bo) {
return toAjax(iErpPurchasePlanService.insertByBo(bo));
}
/** 修改采购计划 */
@Log(title = "采购计划", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody ErpPurchasePlanBo bo) {
return toAjax(iErpPurchasePlanService.updateByBo(bo));
}
/** 审核(通过/驳回 + 申请意见) */
@Log(title = "采购计划", businessType = BusinessType.UPDATE)
@PutMapping("/audit")
public R<Void> audit(@Validated @RequestBody ErpPurchasePlanAuditBo bo) {
return toAjax(iErpPurchasePlanService.audit(bo, getUsername()));
}
/** 送审 / 重新送审 */
@Log(title = "采购计划", businessType = BusinessType.UPDATE)
@PutMapping("/submit/{planId}")
public R<Void> submit(@NotNull(message = "主键不能为空") @PathVariable Long planId) {
return toAjax(iErpPurchasePlanService.submitForAudit(planId));
}
/** 删除采购计划 */
@Log(title = "采购计划", businessType = BusinessType.DELETE)
@DeleteMapping("/{planIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] planIds) {
return toAjax(iErpPurchasePlanService.deleteWithValidByIds(Arrays.asList(planIds), true));
}
/** 导入到货 Excel */
@Log(title = "采购计划-到货", businessType = BusinessType.IMPORT)
@PostMapping(value = "/{planId}/importDelivery", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R<Map<String, Object>> importDelivery(@PathVariable Long planId,
@RequestPart("file") MultipartFile file) throws Exception {
Map<String, Object> result = iErpPurchasePlanService.importDelivery(planId, file.getInputStream(), file.getOriginalFilename(), getUsername());
return R.ok(String.valueOf(result.get("message")), result);
}
/** 查询某计划的到货明细 */
@GetMapping("/{planId}/delivery")
public R<List<ErpPurchasePlanDeliveryVo>> deliveryList(@PathVariable Long planId) {
return R.ok(iErpPurchasePlanService.queryDeliveryList(planId));
}
/** 刷新到货:拿已上传卷号去 WMS 钢卷表实时复核,签收入库的自动翻为已到货(无需重传) */
@PutMapping("/{planId}/refreshArrival")
public R<Void> refreshArrival(@PathVariable Long planId) {
iErpPurchasePlanService.refreshProgress(planId);
return R.ok();
}
/** 厂商历史记忆(手填自动补全) */
@GetMapping("/manufacturers")
public R<List<String>> manufacturers(@RequestParam(value = "keyword", required = false) String keyword) {
return R.ok(iErpPurchasePlanService.queryManufacturers(keyword));
}
/** 到货记录页左侧:审核通过的合同分页 */
@GetMapping("/deliveryPlans")
public TableDataInfo<ErpPurchasePlanVo> deliveryPlans(@RequestParam(value = "keyword", required = false) String keyword,
PageQuery pageQuery) {
return iErpPurchasePlanService.queryDeliveryPlanPage(keyword, pageQuery);
}
/** 删除到货明细 */
@Log(title = "采购计划-到货", businessType = BusinessType.DELETE)
@DeleteMapping("/delivery/{deliveryId}")
public R<Void> deleteDelivery(@PathVariable Long deliveryId) {
return toAjax(iErpPurchasePlanService.deleteDelivery(deliveryId));
}
}

View File

@@ -0,0 +1,109 @@
package com.klp.erp.controller;
import com.klp.common.annotation.Log;
import com.klp.common.annotation.RepeatSubmit;
import com.klp.common.core.controller.BaseController;
import com.klp.common.core.domain.PageQuery;
import com.klp.common.core.domain.R;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.validate.AddGroup;
import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.klp.erp.domain.bo.ErpPurchaseRequisitionBo;
import com.klp.erp.domain.vo.ErpPurchaseRequisitionVo;
import com.klp.erp.service.IErpPurchaseRequisitionService;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Arrays;
import java.util.List;
/**
* 请购及采购单
*
* @author klp
* @date 2026-06-29
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/erp/purchaseRequisition")
public class ErpPurchaseRequisitionController extends BaseController {
private final IErpPurchaseRequisitionService iErpPurchaseRequisitionService;
/** 查询请购单列表 */
@GetMapping("/list")
public TableDataInfo<ErpPurchaseRequisitionVo> list(ErpPurchaseRequisitionBo bo, PageQuery pageQuery) {
return iErpPurchaseRequisitionService.queryPageList(bo, pageQuery);
}
/** 导出请购单列表 */
@Log(title = "请购及采购单", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(ErpPurchaseRequisitionBo bo, HttpServletResponse response) {
List<ErpPurchaseRequisitionVo> list = iErpPurchaseRequisitionService.queryList(bo);
ExcelUtil.exportExcel(list, "请购及采购单", ErpPurchaseRequisitionVo.class, response);
}
/** 获取请购单详细信息(含明细) */
@GetMapping("/{reqId}")
public R<ErpPurchaseRequisitionVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long reqId) {
return R.ok(iErpPurchaseRequisitionService.queryById(reqId));
}
/** 新增请购单 */
@Log(title = "请购及采购单", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody ErpPurchaseRequisitionBo bo) {
return toAjax(iErpPurchaseRequisitionService.insertByBo(bo));
}
/** 修改请购单 */
@Log(title = "请购及采购单", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody ErpPurchaseRequisitionBo bo) {
return toAjax(iErpPurchaseRequisitionService.updateByBo(bo));
}
/** 删除请购单 */
@Log(title = "请购及采购单", businessType = BusinessType.DELETE)
@DeleteMapping("/{reqIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] reqIds) {
return toAjax(iErpPurchaseRequisitionService.deleteWithValidByIds(Arrays.asList(reqIds), true));
}
/** 提交审批(草稿 → 审批中) */
@Log(title = "请购及采购单", businessType = BusinessType.UPDATE)
@SaCheckPermission("erp:purchaseRequisition:approve")
@PutMapping("/{reqId}/submit")
public R<Void> submitApproval(@NotNull(message = "主键不能为空") @PathVariable Long reqId,
@NotNull(message = "审批人不能为空") @RequestParam Long firstApproverId,
@NotEmpty(message = "审批人姓名不能为空") @RequestParam String firstApproverName) {
return toAjax(iErpPurchaseRequisitionService.submitApproval(reqId, firstApproverId, firstApproverName));
}
/** 审批通过(审批中 → 已通过) */
@Log(title = "请购及采购单", businessType = BusinessType.UPDATE)
@PutMapping("/{reqId}/approve")
public R<Void> approve(@NotNull(message = "主键不能为空") @PathVariable Long reqId,
@RequestParam(required = false) String approvalOpinion) {
return toAjax(iErpPurchaseRequisitionService.approve(reqId, approvalOpinion));
}
/** 驳回(审批中 → 已驳回) */
@Log(title = "请购及采购单", businessType = BusinessType.UPDATE)
@PutMapping("/{reqId}/reject")
public R<Void> reject(@NotNull(message = "主键不能为空") @PathVariable Long reqId,
@RequestParam(required = false) String approvalOpinion) {
return toAjax(iErpPurchaseRequisitionService.reject(reqId, approvalOpinion));
}
}

View File

@@ -0,0 +1,67 @@
package com.klp.erp.controller;
import com.klp.common.annotation.Log;
import com.klp.common.annotation.RepeatSubmit;
import com.klp.common.core.controller.BaseController;
import com.klp.common.core.domain.R;
import com.klp.common.core.validate.AddGroup;
import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType;
import com.klp.erp.domain.bo.ErpSupplierTransactionBo;
import com.klp.erp.domain.vo.ErpSupplierTransactionVo;
import com.klp.erp.service.IErpSupplierTransactionService;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* 供应商往来流水
*
* @author klp
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/erp/supplierTxn")
public class ErpSupplierTransactionController extends BaseController {
private final IErpSupplierTransactionService txnService;
/** 某供应商的往来流水(含逐笔余额) */
@GetMapping("/list")
public R<List<ErpSupplierTransactionVo>> list(@RequestParam("supplierId") Long supplierId) {
return R.ok(txnService.queryBySupplier(supplierId));
}
/** 某供应商的往来汇总 */
@GetMapping("/summary")
public R<Map<String, Object>> summary(@RequestParam("supplierId") Long supplierId) {
return R.ok(txnService.summary(supplierId));
}
@Log(title = "供应商往来", businessType = BusinessType.INSERT)
@RepeatSubmit
@PostMapping
public R<Void> add(@Validated(AddGroup.class) @RequestBody ErpSupplierTransactionBo bo) {
return toAjax(txnService.insertByBo(bo));
}
@Log(title = "供应商往来", businessType = BusinessType.UPDATE)
@RepeatSubmit
@PutMapping
public R<Void> edit(@Validated(EditGroup.class) @RequestBody ErpSupplierTransactionBo bo) {
return toAjax(txnService.updateByBo(bo));
}
@Log(title = "供应商往来", businessType = BusinessType.DELETE)
@DeleteMapping("/{txnIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] txnIds) {
return toAjax(txnService.deleteByIds(Arrays.asList(txnIds)));
}
}

View File

@@ -0,0 +1,78 @@
package com.klp.erp.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.util.Date;
/**
* 采购计划头对象 erp_purchase_plan
*
* @author klp
* @date 2026-06-22
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("erp_purchase_plan")
public class ErpPurchasePlan extends BaseEntity {
private static final long serialVersionUID = 1L;
/** 计划ID */
@TableId(value = "plan_id")
private Long planId;
/** 采购计划号 */
private String planNo;
/** 计划状态: 0-进行中 1-已完成归档 */
private String planStatus;
/** 审核状态: 0-待审核 1-通过 2-驳回 */
private String auditStatus;
/** 申请/审核意见 */
private String auditOpinion;
/** 审核人 */
private String auditor;
/** 审核时间 */
private Date auditTime;
/** 供货商 */
private String supplier;
/** 采购日期 */
private Date purchaseDate;
/** 计划总重量(T) */
private BigDecimal planWeight;
/** 已到货重量(T) = Σ到货卷(WMS已确认)单卷重量 */
private BigDecimal arrivedWeight;
/** 要求项数 = 明细行数 */
private Integer planQty;
/** 已到货卷数 = WMS确认到货的上传卷数 */
private Integer arrivedCount;
/** 在途卷数 = 钢卷表存在但 data_type=10 的上传卷数 */
private Integer inTransitCount;
/** 在途重量(T) */
private BigDecimal inTransitWeight;
/** 删除标志 */
@TableLogic
private String delFlag;
/** 备注 */
private String remark;
}

View File

@@ -0,0 +1,38 @@
package com.klp.erp.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 采购计划审核日志(每次审核留痕)
*
* @author klp
* @date 2026-06-25
*/
@Data
@TableName("erp_purchase_plan_audit_log")
public class ErpPurchasePlanAuditLog implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "log_id")
private Long logId;
private Long planId;
/** 审核结果: 1-通过 2-驳回 */
private String auditStatus;
/** 审核/驳回意见 */
private String auditOpinion;
private String auditor;
private Date auditTime;
private Date createTime;
}

View File

@@ -0,0 +1,39 @@
package com.klp.erp.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 采购计划-销售合同关联对象 erp_purchase_plan_contract_rel
*
* @author klp
* @date 2026-06-22
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("erp_purchase_plan_contract_rel")
public class ErpPurchasePlanContractRel extends BaseEntity {
private static final long serialVersionUID = 1L;
/** 关系ID */
@TableId(value = "rel_id")
private Long relId;
/** 采购计划ID */
private Long planId;
/** 销售合同ID(crm_order.order_id) */
private Long orderId;
/** 删除标志 */
@TableLogic
private String delFlag;
/** 备注 */
private String remark;
}

View File

@@ -0,0 +1,78 @@
package com.klp.erp.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.util.Date;
/**
* 采购计划到货明细对象 erp_purchase_plan_delivery
*
* @author klp
* @date 2026-06-22
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("erp_purchase_plan_delivery")
public class ErpPurchasePlanDelivery extends BaseEntity {
private static final long serialVersionUID = 1L;
/** 到货明细ID */
@TableId(value = "delivery_id")
private Long deliveryId;
/** 关联计划ID */
private Long planId;
/** 关联上传批次ID */
private Long batchId;
/** 是否WMS已确认到货: 1-是 0-否(卷号在钢卷表存在且 data_type<>10) */
private Integer arrived;
/** 是否在途: 1-是(卷号在钢卷表存在但 data_type=10) 0-否 */
private Integer inTransit;
/** 日期 */
private Date arrivalDate;
/** 牌号 */
private String grade;
/** 规格(厚×宽) */
private String spec;
/** 卷号 */
private String coilNo;
/** 单卷重量(T) */
private BigDecimal coilWeight;
/** 车号 */
private String truckNo;
/** 整车数量(T) */
private BigDecimal truckWeight;
/** 件数 */
private Integer pieceCount;
/** 销售代码 */
private String salesCode;
/** 钢厂到站 */
private String arrivalStation;
/** 删除标志 */
@TableLogic
private String delFlag;
/** 备注 */
private String remark;
}

View File

@@ -0,0 +1,50 @@
package com.klp.erp.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
/**
* 到货上传批次对象 erp_purchase_plan_delivery_batch
* 每上传一份到货 Excel 记一条批次,便于随时回看每一次上传。
*
* @author klp
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("erp_purchase_plan_delivery_batch")
public class ErpPurchasePlanDeliveryBatch extends BaseEntity {
private static final long serialVersionUID = 1L;
/** 批次ID */
@TableId(value = "batch_id")
private Long batchId;
/** 关联计划ID */
private Long planId;
/** 文件名 */
private String fileName;
/** 本次导入到货行数 */
private Integer rowCount;
/** 本次与明细卷号匹配上的卷数 */
private Integer matchedCount;
/** 上传后计划到货百分比快照(0-100) */
private BigDecimal arrivedPercent;
/** 删除标志 */
@TableLogic
private String delFlag;
/** 备注 */
private String remark;
}

View File

@@ -0,0 +1,83 @@
package com.klp.erp.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
/**
* 采购计划明细对象 erp_purchase_plan_item
*
* @author klp
* @date 2026-06-22
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("erp_purchase_plan_item")
public class ErpPurchasePlanItem extends BaseEntity {
private static final long serialVersionUID = 1L;
/** 明细ID */
@TableId(value = "item_id")
private Long itemId;
/** 关联计划ID */
private Long planId;
/** 规格 */
private String spec;
/** 厂商(手填,带历史记忆) */
private String manufacturer;
/** 产品(如热轧卷板) */
private String productType;
/** 材质 */
private String material;
/** 牌号 */
private String grade;
/** 卷号 */
private String coilNo;
/** 宽度(mm可为区间文本) */
private String width;
/** 厚度(mm可为区间文本) */
private String thickness;
/** 宽度公差 */
private String widthTolerance;
/** 厚度公差 */
private String thicknessTolerance;
/** 重量(T) */
private BigDecimal weight;
/** 数量(件/卷数) */
private Integer quantity;
/** 已到货重量(T)由到货Excel按牌号+规格累加 */
private BigDecimal arrivedWeight;
/** 到货状态: 0-未到货 1-部分到货 2-已到货 */
private String itemStatus;
/** 供货商 */
private String supplier;
/** 删除标志 */
@TableLogic
private String delFlag;
/** 备注 */
private String remark;
}

View File

@@ -0,0 +1,117 @@
package com.klp.erp.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 请购及采购单对象 erp_purchase_requisition
*
* @author klp
* @date 2026-06-29
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("erp_purchase_requisition")
public class ErpPurchaseRequisition extends BaseEntity {
private static final long serialVersionUID = 1L;
/** 主键 */
@TableId(value = "req_id")
private Long reqId;
/** 请购部门 */
private String reqDept;
/** 品名 */
private String itemName;
/** 规格 */
private String specification;
/** 单位 */
private String unit;
/** 请购量 */
private String quantity;
/** 类别 */
private String category;
/** 需求日期 */
private String requiredDate;
/** 用途说明 */
private String purposeDesc;
/** 使用部门 */
private String useDept;
/** 品检条件 */
private String inspectionCondition;
/** 试用天数 */
private String trialDays;
/** 前期采购记录 */
private String prevPurchaseRecord;
/** 采购拟办 */
private String purchaseProposal;
/** 付款条件 */
private String paymentTerms;
/** 采购金额 */
private String totalAmount;
/** 董事长(采购单位) */
private String signPurchaseChairman;
/** 部长/厂长(采购单位) */
private String signPurchaseManager;
/** 主任(采购单位) */
private String signPurchaseDirector;
/** 经办(采购单位) */
private String signPurchaseHandler;
/** 生产总经理(请购单位) */
private String signRequestGm;
/** 厂长(请购单位) */
private String signRequestFactoryMgr;
/** 主任(请购单位) */
private String signRequestDirector;
/** 经办(请购单位) */
private String signRequestHandler;
/** 指定卸货位 */
private String unloadLocation;
/** 卸货其他位置 */
private String unloadOther;
/** 状态 */
private String formStatus;
/** 删除标志 */
@TableLogic
private String delFlag;
/** 一审审批意见 */
private String firstApprovalOpinion;
/** 二审审批意见 */
private String secondApprovalOpinion;
/** 备注 */
private String remark;
}

View File

@@ -0,0 +1,48 @@
package com.klp.erp.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 请购及采购单明细对象 erp_purchase_requisition_item
*
* @author klp
* @date 2026-06-29
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("erp_purchase_requisition_item")
public class ErpPurchaseRequisitionItem extends BaseEntity {
private static final long serialVersionUID = 1L;
/** 明细ID */
@TableId(value = "item_id")
private Long itemId;
/** 关联请购单ID */
private Long reqId;
/** 项次 */
private String seq;
/** 品名 */
private String itemName;
/** 规格 */
private String specification;
/** 单位 */
private String unit;
/** 请购量 */
private String quantity;
/** 删除标志 */
@TableLogic
private String delFlag;
}

View File

@@ -0,0 +1,50 @@
package com.klp.erp.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.util.Date;
/**
* 供应商往来流水对象 erp_supplier_transaction
*
* @author klp
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("erp_supplier_transaction")
public class ErpSupplierTransaction extends BaseEntity {
private static final long serialVersionUID = 1L;
/** 往来流水ID */
@TableId(value = "txn_id")
private Long txnId;
/** 关联供应商ID */
private Long supplierId;
/** 发生日期 */
private Date txnDate;
/** 类型: 1-采购应付 2-付款 3-退货 4-其他 */
private String txnType;
/** 金额 */
private BigDecimal amount;
/** 单据号 */
private String docNo;
/** 删除标志 */
@TableLogic
private String delFlag;
/** 备注 */
private String remark;
}

View File

@@ -0,0 +1,26 @@
package com.klp.erp.domain.bo;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* 采购计划审核业务对象
*
* @author klp
* @date 2026-06-22
*/
@Data
public class ErpPurchasePlanAuditBo {
/** 计划ID */
@NotNull(message = "计划ID不能为空")
private Long planId;
/** 审核结果: 1-通过 2-驳回 */
@NotNull(message = "审核结果不能为空")
private String auditStatus;
/** 申请/审核意见 */
private String auditOpinion;
}

View File

@@ -0,0 +1,55 @@
package com.klp.erp.domain.bo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.klp.common.core.domain.BaseEntity;
import com.klp.common.core.validate.AddGroup;
import com.klp.common.core.validate.EditGroup;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotNull;
import java.util.Date;
import java.util.List;
/**
* 采购计划头业务对象 erp_purchase_plan
*
* @author klp
* @date 2026-06-22
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class ErpPurchasePlanBo extends BaseEntity {
/** 计划ID */
@NotNull(message = "计划ID不能为空", groups = {EditGroup.class})
private Long planId;
/** 采购计划号(为空时自动生成) */
private String planNo;
/** 综合搜索关键字:计划号 / 供货商 / 合同号 */
private String keyword;
/** 计划状态: 0-进行中 1-已完成归档 */
private String planStatus;
/** 审核状态: 0-待审核 1-通过 2-驳回 */
private String auditStatus;
/** 供货商 */
private String supplier;
/** 采购日期 */
@JsonFormat(pattern = "yyyy-MM-dd")
private Date purchaseDate;
/** 备注 */
private String remark;
/** 明细行 */
private List<ErpPurchasePlanItemBo> items;
/** 关联的销售合同ID列表(crm_order.order_id) */
private List<Long> orderIds;
}

View File

@@ -0,0 +1,66 @@
package com.klp.erp.domain.bo;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
/**
* 采购计划明细业务对象 erp_purchase_plan_item
*
* @author klp
* @date 2026-06-22
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class ErpPurchasePlanItemBo extends BaseEntity {
/** 明细ID */
private Long itemId;
/** 关联计划ID */
private Long planId;
/** 规格 */
private String spec;
/** 厂商(手填,带历史记忆) */
private String manufacturer;
/** 产品(如热轧卷板) */
private String productType;
/** 材质 */
private String material;
/** 牌号 */
private String grade;
/** 卷号 */
private String coilNo;
/** 宽度(mm可为区间文本) */
private String width;
/** 厚度(mm可为区间文本) */
private String thickness;
/** 宽度公差 */
private String widthTolerance;
/** 厚度公差 */
private String thicknessTolerance;
/** 重量(T) */
private BigDecimal weight;
/** 数量(件/卷数) */
private Integer quantity;
/** 供货商 */
private String supplier;
/** 备注 */
private String remark;
}

View File

@@ -0,0 +1,114 @@
package com.klp.erp.domain.bo;
import com.klp.common.core.domain.BaseEntity;
import com.klp.common.core.validate.EditGroup;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* 请购及采购单业务对象 erp_purchase_requisition
*
* @author klp
* @date 2026-06-29
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class ErpPurchaseRequisitionBo extends BaseEntity {
/** 主键 */
@NotNull(message = "主键不能为空", groups = {EditGroup.class})
private Long reqId;
/** 请购部门 */
private String reqDept;
/** 品名 */
private String itemName;
/** 规格 */
private String specification;
/** 单位 */
private String unit;
/** 请购量 */
private String quantity;
/** 类别 */
private String category;
/** 需求日期 */
private String requiredDate;
/** 用途说明 */
private String purposeDesc;
/** 使用部门 */
private String useDept;
/** 品检条件 */
private String inspectionCondition;
/** 试用天数 */
private String trialDays;
/** 前期采购记录 */
private String prevPurchaseRecord;
/** 采购拟办 */
private String purchaseProposal;
/** 付款条件 */
private String paymentTerms;
/** 采购金额 */
private String totalAmount;
/** 董事长(采购单位) */
private String signPurchaseChairman;
/** 部长/厂长(采购单位) */
private String signPurchaseManager;
/** 主任(采购单位) */
private String signPurchaseDirector;
/** 经办(采购单位) */
private String signPurchaseHandler;
/** 生产总经理(请购单位) */
private String signRequestGm;
/** 厂长(请购单位) */
private String signRequestFactoryMgr;
/** 主任(请购单位) */
private String signRequestDirector;
/** 经办(请购单位) */
private String signRequestHandler;
/** 指定卸货位 */
private String unloadLocation;
/** 卸货其他位置 */
private String unloadOther;
/** 状态 */
private String formStatus;
/** 一审审批意见 */
private String firstApprovalOpinion;
/** 二审审批意见 */
private String secondApprovalOpinion;
/** 备注 */
private String remark;
/** 明细行 */
private List<ErpPurchaseRequisitionItemBo> items;
}

View File

@@ -0,0 +1,37 @@
package com.klp.erp.domain.bo;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 请购及采购单明细业务对象 erp_purchase_requisition_item
*
* @author klp
* @date 2026-06-29
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class ErpPurchaseRequisitionItemBo extends BaseEntity {
/** 明细ID */
private Long itemId;
/** 关联请购单ID */
private Long reqId;
/** 项次 */
private String seq;
/** 品名 */
private String itemName;
/** 规格 */
private String specification;
/** 单位 */
private String unit;
/** 请购量 */
private String quantity;
}

Some files were not shown because too many files have changed in this diff Show More