diff --git a/docs/sql_align_databases.sql b/docs/sql_align_databases.sql new file mode 100644 index 000000000..6c15a8610 --- /dev/null +++ b/docs/sql_align_databases.sql @@ -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()); diff --git a/docs/sql_align_databases_v2.sql b/docs/sql_align_databases_v2.sql new file mode 100644 index 000000000..ec5506593 --- /dev/null +++ b/docs/sql_align_databases_v2.sql @@ -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; diff --git a/docs/sql_align_dev.sql b/docs/sql_align_dev.sql new file mode 100644 index 000000000..bdb76e58e --- /dev/null +++ b/docs/sql_align_dev.sql @@ -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; diff --git a/klp-admin/src/main/java/com/klp/framework/client/SqlServerApiClient.java b/klp-admin/src/main/java/com/klp/framework/client/SqlServerApiClient.java index 1df3862c4..e717d4f14 100644 --- a/klp-admin/src/main/java/com/klp/framework/client/SqlServerApiClient.java +++ b/klp-admin/src/main/java/com/klp/framework/client/SqlServerApiClient.java @@ -513,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()) { @@ -533,7 +533,7 @@ public class SqlServerApiClient { Map 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()) { diff --git a/klp-admin/src/main/java/com/klp/web/controller/system/SysFileCommentController.java b/klp-admin/src/main/java/com/klp/web/controller/system/SysFileCommentController.java new file mode 100644 index 000000000..af5316ac4 --- /dev/null +++ b/klp-admin/src/main/java/com/klp/web/controller/system/SysFileCommentController.java @@ -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(@NotNull(message = "文件ID不能为空") @PathVariable Long fileId) { + return R.ok(iSysFileCommentService.queryListByFileId(fileId)); + } + + /** + * 新增文件评论 + */ + @Log(title = "文件评论", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysFileCommentBo bo) { + return toAjax(iSysFileCommentService.insertByBo(bo)); + } +} diff --git a/klp-admin/src/main/java/com/klp/web/controller/system/SysFileController.java b/klp-admin/src/main/java/com/klp/web/controller/system/SysFileController.java index d2c287236..275b0e2b9 100644 --- a/klp-admin/src/main/java/com/klp/web/controller/system/SysFileController.java +++ b/klp-admin/src/main/java/com/klp/web/controller/system/SysFileController.java @@ -98,6 +98,15 @@ public class SysFileController extends BaseController { return toAjax(iSysFileService.deleteWithValidByIds(Arrays.asList(fileIds), true)); } + /** + * 文件浏览次数 +1 + */ + @PutMapping("/incrementView/{fileId}") + public R incrementView(@NotNull(message = "主键不能为空") @PathVariable Long fileId) { + iSysFileService.incrementViewCount(fileId); + return R.ok(); + } + /** * 查询与我相关的文件(私有文件且当前用户在可见用户列表中) */ diff --git a/klp-mes/src/main/java/com/klp/mes/qc/service/impl/QcQualityReviewServiceImpl.java b/klp-mes/src/main/java/com/klp/mes/qc/service/impl/QcQualityReviewServiceImpl.java index edcc61ea0..1325fc981 100644 --- a/klp-mes/src/main/java/com/klp/mes/qc/service/impl/QcQualityReviewServiceImpl.java +++ b/klp-mes/src/main/java/com/klp/mes/qc/service/impl/QcQualityReviewServiceImpl.java @@ -9,10 +9,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.klp.common.core.domain.PageQuery; import com.klp.common.core.page.TableDataInfo; import com.klp.common.utils.StringUtils; -import com.klp.domain.WmsCoilQualityRejudge; +import com.klp.common.helper.LoginHelper; import com.klp.domain.WmsMaterialCoil; -import com.klp.mapper.WmsCoilQualityRejudgeMapper; import com.klp.mapper.WmsMaterialCoilMapper; +import com.klp.service.IWmsMaterialCoilService; import com.klp.mes.qc.domain.QcQualityReview; import com.klp.mes.qc.domain.QcQualityReviewCoil; import com.klp.mes.qc.domain.QcQualityReviewLog; @@ -45,11 +45,14 @@ import java.util.stream.Collectors; @Service public class QcQualityReviewServiceImpl implements IQcQualityReviewService { + /** 技术部逻辑库ID(C/D级改判后移入此库区) */ + private static final Long TECH_WAREHOUSE_ID = 2019583656787259393L; + private final QcQualityReviewMapper baseMapper; private final QcQualityReviewCoilMapper coilMapper; private final QcQualityReviewLogMapper logMapper; private final WmsMaterialCoilMapper wmsMaterialCoilMapper; - private final WmsCoilQualityRejudgeMapper wmsCoilQualityRejudgeMapper; + private final IWmsMaterialCoilService wmsMaterialCoilService; /** * 查询评审单详情(含钢卷明细和审批日志) @@ -112,11 +115,19 @@ public class QcQualityReviewServiceImpl implements IQcQualityReviewService { } /** - * 修改评审单(仅草稿状态可修改) + * 修改评审单(仅草稿或已驳回状态可修改) */ @Override @Transactional(rollbackFor = Exception.class) public Boolean updateByBo(QcQualityReviewBo bo) { + // 校验:只有待提交或已驳回状态才能修改 + if (bo.getReviewId() != null) { + QcQualityReview exist = baseMapper.selectById(bo.getReviewId()); + if (exist != null && !Long.valueOf(1L).equals(exist.getFlowStatus()) + && !Long.valueOf(4L).equals(exist.getFlowStatus())) { + throw new RuntimeException("只有待提交或已驳回状态的评审单才能修改"); + } + } QcQualityReview update = BeanUtil.toBean(bo, QcQualityReview.class); validEntityBeforeSave(update); boolean flag = baseMapper.updateById(update) > 0; @@ -194,7 +205,7 @@ public class QcQualityReviewServiceImpl implements IQcQualityReviewService { .set(QcQualityReview::getRejectReason, null)); // 记录审批日志 - addLog(reviewId, "submit", "提交送审", null); + addLog(reviewId, "submit", "提交送审"); return true; } @@ -215,6 +226,20 @@ public class QcQualityReviewServiceImpl implements IQcQualityReviewService { throw new RuntimeException("请为每个钢卷指定改判后质量状态"); } + // 校验:coilRegradeList 是否覆盖了评审单中的所有有效钢卷 + List dbCoils = coilMapper.selectList( + Wrappers.lambdaQuery() + .eq(QcQualityReviewCoil::getReviewId, bo.getReviewId()) + .eq(QcQualityReviewCoil::getDelFlag, 0)); + Set regradedIds = bo.getCoilRegradeList().stream() + .map(QcQualityReviewApproveBo.CoilRegradeBo::getDetailId) + .collect(Collectors.toSet()); + for (QcQualityReviewCoil coil : dbCoils) { + if (!regradedIds.contains(coil.getDetailId())) { + throw new RuntimeException("钢卷【" + coil.getCurrentCoilNo() + "】未指定改判后质量状态"); + } + } + // 1. 更新主表流程状态 baseMapper.update(null, Wrappers.lambdaUpdate() .eq(QcQualityReview::getReviewId, bo.getReviewId()) @@ -231,7 +256,7 @@ public class QcQualityReviewServiceImpl implements IQcQualityReviewService { } // 3. 记录审批日志 - addLog(bo.getReviewId(), "approve", bo.getLeaderOpinion(), bo.getLeaderSign()); + addLog(bo.getReviewId(), "approve", bo.getLeaderOpinion()); return true; } @@ -259,7 +284,7 @@ public class QcQualityReviewServiceImpl implements IQcQualityReviewService { .set(QcQualityReview::getRejectReason, reason)); // 记录审批日志 - addLog(reviewId, "reject", reason, null); + addLog(reviewId, "reject", reason); return true; } @@ -289,20 +314,20 @@ public class QcQualityReviewServiceImpl implements IQcQualityReviewService { } Date now = new Date(); + String reason = "异常产品评审改判,评审单号:" + review.getReviewNo(); for (QcQualityReviewCoil coil : coilList) { - // 1. 写入 wms_coil_quality_rejudge 改判记录 - WmsCoilQualityRejudge rejudge = new WmsCoilQualityRejudge(); - rejudge.setCoilId(coil.getCoilId()); - rejudge.setBeforeQuality(coil.getBeforeQuality()); - rejudge.setAfterQuality(coil.getRegradeQuality()); - rejudge.setRejudgeReason("异常产品评审改判,评审单号:" + review.getReviewNo()); - wmsCoilQualityRejudgeMapper.insert(rejudge); - - // 2. 更新钢卷的 qualityStatus 为改判后的值 + // 1. 通过统一方法更新钢卷质量状态 + 自动记录改判日志 if (coil.getCoilId() != null && StringUtils.isNotBlank(coil.getRegradeQuality())) { + wmsMaterialCoilService.updateQualityStatus( + coil.getCoilId(), coil.getRegradeQuality(), reason); + } + + // 2. 根据改判后质量等级自动更新钢卷所在逻辑库区 + Long targetWarehouseId = determineTargetWarehouse(coil.getRegradeQuality()); + if (targetWarehouseId != null && coil.getCoilId() != null) { wmsMaterialCoilMapper.update(null, Wrappers.lambdaUpdate() .eq(WmsMaterialCoil::getCoilId, coil.getCoilId()) - .set(WmsMaterialCoil::getQualityStatus, coil.getRegradeQuality())); + .set(WmsMaterialCoil::getWarehouseId, targetWarehouseId)); } // 3. 更新明细执行状态 @@ -364,14 +389,14 @@ public class QcQualityReviewServiceImpl implements IQcQualityReviewService { } /** - * 添加审批日志 + * 添加审批日志(自动记录当前登录用户为操作人) */ - private void addLog(Long reviewId, String action, String opinion, String operator) { + private void addLog(Long reviewId, String action, String opinion) { QcQualityReviewLog log = new QcQualityReviewLog(); log.setReviewId(reviewId); log.setAction(action); log.setOpinion(opinion); - log.setOperator(operator); + log.setOperator(LoginHelper.getUsername()); log.setOperateTime(new Date()); logMapper.insert(log); } @@ -386,7 +411,29 @@ public class QcQualityReviewServiceImpl implements IQcQualityReviewService { return "QR-" + dateStr + "-" + String.format("%04d", count + 1); } + /** + * 根据改判后质量等级确定目标逻辑库区 + * O/A/B → 不移动,C+/C/C- → 技术部逻辑库,D+/D/D- → 技术部逻辑库 + */ + private Long determineTargetWarehouse(String regradeQuality) { + if (regradeQuality == null) return null; + // O/A/B 级不移动 + if ("O".equals(regradeQuality) || "A".equals(regradeQuality) || "B".equals(regradeQuality)) { + return null; + } + // C/D 级 → 技术部逻辑库 + if (regradeQuality.startsWith("C") || regradeQuality.startsWith("D")) { + return TECH_WAREHOUSE_ID; + } + return null; + } + private void validEntityBeforeSave(QcQualityReview entity) { - // TODO 数据校验 + if (StringUtils.isBlank(entity.getProductName())) { + throw new RuntimeException("产品名称不能为空"); + } + if (StringUtils.isBlank(entity.getTransmitDept())) { + entity.setTransmitDept("品质部"); + } } } diff --git a/klp-pt/src/main/java/com/klp/pt/controller/PtProductToleranceController.java b/klp-pt/src/main/java/com/klp/pt/controller/PtProductToleranceController.java index c45a70796..a19c0a164 100644 --- a/klp-pt/src/main/java/com/klp/pt/controller/PtProductToleranceController.java +++ b/klp-pt/src/main/java/com/klp/pt/controller/PtProductToleranceController.java @@ -1,4 +1,4 @@ -package com.klp.controller; +package com.klp.pt.controller; import java.util.List; import java.util.Arrays; @@ -17,9 +17,9 @@ 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.domain.vo.PtProductToleranceVo; -import com.klp.domain.bo.PtProductToleranceBo; -import com.klp.service.IPtProductToleranceService; +import com.klp.pt.domain.vo.PtProductToleranceVo; +import com.klp.pt.domain.bo.PtProductToleranceBo; +import com.klp.pt.service.IPtProductToleranceService; import com.klp.common.core.page.TableDataInfo; /** diff --git a/klp-pt/src/main/java/com/klp/pt/domain/PtProductTolerance.java b/klp-pt/src/main/java/com/klp/pt/domain/PtProductTolerance.java index e52493e34..ff4620bfb 100644 --- a/klp-pt/src/main/java/com/klp/pt/domain/PtProductTolerance.java +++ b/klp-pt/src/main/java/com/klp/pt/domain/PtProductTolerance.java @@ -1,4 +1,4 @@ -package com.klp.domain; +package com.klp.pt.domain; import com.baomidou.mybatisplus.annotation.*; import com.klp.common.core.domain.BaseEntity; diff --git a/klp-pt/src/main/java/com/klp/pt/domain/bo/PtProductToleranceBo.java b/klp-pt/src/main/java/com/klp/pt/domain/bo/PtProductToleranceBo.java index 854a5da01..e150c7628 100644 --- a/klp-pt/src/main/java/com/klp/pt/domain/bo/PtProductToleranceBo.java +++ b/klp-pt/src/main/java/com/klp/pt/domain/bo/PtProductToleranceBo.java @@ -1,4 +1,4 @@ -package com.klp.domain.bo; +package com.klp.pt.domain.bo; import com.klp.common.core.domain.BaseEntity; import lombok.Data; diff --git a/klp-pt/src/main/java/com/klp/pt/domain/vo/PtProductToleranceVo.java b/klp-pt/src/main/java/com/klp/pt/domain/vo/PtProductToleranceVo.java index cdb472bbc..5218432a2 100644 --- a/klp-pt/src/main/java/com/klp/pt/domain/vo/PtProductToleranceVo.java +++ b/klp-pt/src/main/java/com/klp/pt/domain/vo/PtProductToleranceVo.java @@ -1,4 +1,4 @@ -package com.klp.domain.vo; +package com.klp.pt.domain.vo; import java.math.BigDecimal; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; diff --git a/klp-pt/src/main/java/com/klp/pt/mapper/PtProductToleranceMapper.java b/klp-pt/src/main/java/com/klp/pt/mapper/PtProductToleranceMapper.java index 7425f1a9a..13dfc0a4b 100644 --- a/klp-pt/src/main/java/com/klp/pt/mapper/PtProductToleranceMapper.java +++ b/klp-pt/src/main/java/com/klp/pt/mapper/PtProductToleranceMapper.java @@ -1,7 +1,7 @@ -package com.klp.mapper; +package com.klp.pt.mapper; -import com.klp.domain.PtProductTolerance; -import com.klp.domain.vo.PtProductToleranceVo; +import com.klp.pt.domain.PtProductTolerance; +import com.klp.pt.domain.vo.PtProductToleranceVo; import com.klp.common.core.mapper.BaseMapperPlus; /** diff --git a/klp-pt/src/main/java/com/klp/pt/service/IPtProductToleranceService.java b/klp-pt/src/main/java/com/klp/pt/service/IPtProductToleranceService.java index e2605d15d..500a19f08 100644 --- a/klp-pt/src/main/java/com/klp/pt/service/IPtProductToleranceService.java +++ b/klp-pt/src/main/java/com/klp/pt/service/IPtProductToleranceService.java @@ -1,8 +1,8 @@ -package com.klp.service; +package com.klp.pt.service; -import com.klp.domain.PtProductTolerance; -import com.klp.domain.vo.PtProductToleranceVo; -import com.klp.domain.bo.PtProductToleranceBo; +import com.klp.pt.domain.PtProductTolerance; +import com.klp.pt.domain.vo.PtProductToleranceVo; +import com.klp.pt.domain.bo.PtProductToleranceBo; import com.klp.common.core.page.TableDataInfo; import com.klp.common.core.domain.PageQuery; diff --git a/klp-pt/src/main/java/com/klp/pt/service/impl/PtProductToleranceServiceImpl.java b/klp-pt/src/main/java/com/klp/pt/service/impl/PtProductToleranceServiceImpl.java index dded8985f..e0a25740a 100644 --- a/klp-pt/src/main/java/com/klp/pt/service/impl/PtProductToleranceServiceImpl.java +++ b/klp-pt/src/main/java/com/klp/pt/service/impl/PtProductToleranceServiceImpl.java @@ -9,11 +9,11 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import com.klp.domain.bo.PtProductToleranceBo; -import com.klp.domain.vo.PtProductToleranceVo; -import com.klp.domain.PtProductTolerance; -import com.klp.mapper.PtProductToleranceMapper; -import com.klp.service.IPtProductToleranceService; +import com.klp.pt.domain.bo.PtProductToleranceBo; +import com.klp.pt.domain.vo.PtProductToleranceVo; +import com.klp.pt.domain.PtProductTolerance; +import com.klp.pt.mapper.PtProductToleranceMapper; +import com.klp.pt.service.IPtProductToleranceService; import java.util.List; import java.util.Map; diff --git a/klp-pt/src/main/resources/mapper/pt/PtProductToleranceMapper.xml b/klp-pt/src/main/resources/mapper/pt/PtProductToleranceMapper.xml index 9ae5d3732..ef63d45b1 100644 --- a/klp-pt/src/main/resources/mapper/pt/PtProductToleranceMapper.xml +++ b/klp-pt/src/main/resources/mapper/pt/PtProductToleranceMapper.xml @@ -2,9 +2,9 @@ - + - + diff --git a/klp-system/src/main/java/com/klp/system/domain/SysFile.java b/klp-system/src/main/java/com/klp/system/domain/SysFile.java index 708877aec..3401000f1 100644 --- a/klp-system/src/main/java/com/klp/system/domain/SysFile.java +++ b/klp-system/src/main/java/com/klp/system/domain/SysFile.java @@ -60,6 +60,10 @@ public class SysFile extends BaseEntity { * 备注 */ private String remark; + /** + * 浏览次数 + */ + private Long viewCount; /** * 删除标识 0正常 2删除 */ diff --git a/klp-system/src/main/java/com/klp/system/domain/SysFileComment.java b/klp-system/src/main/java/com/klp/system/domain/SysFileComment.java new file mode 100644 index 000000000..e24ca2a2a --- /dev/null +++ b/klp-system/src/main/java/com/klp/system/domain/SysFileComment.java @@ -0,0 +1,40 @@ +package com.klp.system.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + + +/** + * 文件评论对象 sys_file_comment + * + * @author klp + * @date 2026-07-04 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_file_comment") +public class SysFileComment extends BaseEntity { + + private static final long serialVersionUID=1L; + + /** + * 主键ID + */ + @TableId(value = "comment_id") + private Long commentId; + /** + * 关联文件ID + */ + private Long fileId; + /** + * 评论内容 + */ + private String content; + /** + * 所属部门 + */ + private String dept; + +} diff --git a/klp-system/src/main/java/com/klp/system/domain/bo/SysFileBo.java b/klp-system/src/main/java/com/klp/system/domain/bo/SysFileBo.java index 4d84f2d1e..05ebcfb45 100644 --- a/klp-system/src/main/java/com/klp/system/domain/bo/SysFileBo.java +++ b/klp-system/src/main/java/com/klp/system/domain/bo/SysFileBo.java @@ -67,5 +67,9 @@ public class SysFileBo extends BaseEntity { */ private String remark; + /** + * 浏览次数 + */ + private Long viewCount; } diff --git a/klp-system/src/main/java/com/klp/system/domain/bo/SysFileCommentBo.java b/klp-system/src/main/java/com/klp/system/domain/bo/SysFileCommentBo.java new file mode 100644 index 000000000..ee26751cb --- /dev/null +++ b/klp-system/src/main/java/com/klp/system/domain/bo/SysFileCommentBo.java @@ -0,0 +1,42 @@ +package com.klp.system.domain.bo; + +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.*; + + +/** + * 文件评论业务对象 sys_file_comment + * + * @author klp + * @date 2026-07-04 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class SysFileCommentBo extends BaseEntity { + + /** + * 主键ID + */ + private Long commentId; + + /** + * 关联文件ID + */ + @NotNull(message = "文件ID不能为空") + private Long fileId; + + /** + * 评论内容 + */ + @NotBlank(message = "评论内容不能为空") + private String content; + + /** + * 所属部门 + */ + private String dept; + +} diff --git a/klp-system/src/main/java/com/klp/system/domain/vo/SysFileCommentVo.java b/klp-system/src/main/java/com/klp/system/domain/vo/SysFileCommentVo.java new file mode 100644 index 000000000..aedf32de0 --- /dev/null +++ b/klp-system/src/main/java/com/klp/system/domain/vo/SysFileCommentVo.java @@ -0,0 +1,40 @@ +package com.klp.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; + + +/** + * 文件评论视图对象 sys_file_comment + * + * @author klp + * @date 2026-07-04 + */ +@Data +@ExcelIgnoreUnannotated +public class SysFileCommentVo extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + private Long commentId; + + /** + * 关联文件ID + */ + private Long fileId; + + /** + * 评论内容 + */ + private String content; + + /** + * 所属部门 + */ + private String dept; + +} diff --git a/klp-system/src/main/java/com/klp/system/domain/vo/SysFileVo.java b/klp-system/src/main/java/com/klp/system/domain/vo/SysFileVo.java index a9075d43c..66c91baf2 100644 --- a/klp-system/src/main/java/com/klp/system/domain/vo/SysFileVo.java +++ b/klp-system/src/main/java/com/klp/system/domain/vo/SysFileVo.java @@ -80,5 +80,10 @@ public class SysFileVo extends BaseEntity { @ExcelProperty(value = "备注") private String remark; + /** + * 浏览次数 + */ + @ExcelProperty(value = "浏览次数") + private Long viewCount; } diff --git a/klp-system/src/main/java/com/klp/system/mapper/SysFileCommentMapper.java b/klp-system/src/main/java/com/klp/system/mapper/SysFileCommentMapper.java new file mode 100644 index 000000000..81e1e5552 --- /dev/null +++ b/klp-system/src/main/java/com/klp/system/mapper/SysFileCommentMapper.java @@ -0,0 +1,15 @@ +package com.klp.system.mapper; + +import com.klp.system.domain.SysFileComment; +import com.klp.system.domain.vo.SysFileCommentVo; +import com.klp.common.core.mapper.BaseMapperPlus; + +/** + * 文件评论Mapper接口 + * + * @author klp + * @date 2026-07-04 + */ +public interface SysFileCommentMapper extends BaseMapperPlus { + +} diff --git a/klp-system/src/main/java/com/klp/system/service/ISysFileCommentService.java b/klp-system/src/main/java/com/klp/system/service/ISysFileCommentService.java new file mode 100644 index 000000000..5a14b997d --- /dev/null +++ b/klp-system/src/main/java/com/klp/system/service/ISysFileCommentService.java @@ -0,0 +1,25 @@ +package com.klp.system.service; + +import com.klp.system.domain.vo.SysFileCommentVo; +import com.klp.system.domain.bo.SysFileCommentBo; + +import java.util.List; + +/** + * 文件评论Service接口 + * + * @author klp + * @date 2026-07-04 + */ +public interface ISysFileCommentService { + + /** + * 查询文件评论列表 + */ + List queryListByFileId(Long fileId); + + /** + * 新增文件评论 + */ + Boolean insertByBo(SysFileCommentBo bo); +} diff --git a/klp-system/src/main/java/com/klp/system/service/ISysFileService.java b/klp-system/src/main/java/com/klp/system/service/ISysFileService.java index 1cd0a32da..134f86493 100644 --- a/klp-system/src/main/java/com/klp/system/service/ISysFileService.java +++ b/klp-system/src/main/java/com/klp/system/service/ISysFileService.java @@ -51,4 +51,9 @@ public interface ISysFileService { * 查询与我相关的文件(私有文件且当前用户在可见用户列表中) */ TableDataInfo queryPageListRelatedToMe(SysFileBo bo, PageQuery pageQuery); + + /** + * 文件浏览次数 +1 + */ + void incrementViewCount(Long fileId); } diff --git a/klp-system/src/main/java/com/klp/system/service/impl/SysFileCommentServiceImpl.java b/klp-system/src/main/java/com/klp/system/service/impl/SysFileCommentServiceImpl.java new file mode 100644 index 000000000..0eece3c44 --- /dev/null +++ b/klp-system/src/main/java/com/klp/system/service/impl/SysFileCommentServiceImpl.java @@ -0,0 +1,50 @@ +package com.klp.system.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.klp.common.helper.LoginHelper; +import com.klp.system.domain.bo.SysFileCommentBo; +import com.klp.system.domain.vo.SysFileCommentVo; +import com.klp.system.domain.SysFileComment; +import com.klp.system.mapper.SysFileCommentMapper; +import com.klp.system.service.ISysFileCommentService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 文件评论Service业务层处理 + * + * @author klp + * @date 2026-07-04 + */ +@RequiredArgsConstructor +@Service +public class SysFileCommentServiceImpl implements ISysFileCommentService { + + private final SysFileCommentMapper baseMapper; + + /** + * 查询文件评论列表(按时间升序) + */ + @Override + public List queryListByFileId(Long fileId) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SysFileComment::getFileId, fileId); + lqw.orderByAsc(SysFileComment::getCreateTime); + return baseMapper.selectVoList(lqw); + } + + /** + * 新增文件评论 + */ + @Override + public Boolean insertByBo(SysFileCommentBo bo) { + SysFileComment add = BeanUtil.toBean(bo, SysFileComment.class); + // 自动填充部门和评论人 + add.setDept(LoginHelper.getLoginUser().getDeptName()); + return baseMapper.insert(add) > 0; + } +} diff --git a/klp-system/src/main/java/com/klp/system/service/impl/SysFileServiceImpl.java b/klp-system/src/main/java/com/klp/system/service/impl/SysFileServiceImpl.java index b06095d64..09b1c2ccf 100644 --- a/klp-system/src/main/java/com/klp/system/service/impl/SysFileServiceImpl.java +++ b/klp-system/src/main/java/com/klp/system/service/impl/SysFileServiceImpl.java @@ -5,6 +5,7 @@ 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.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.klp.common.helper.LoginHelper; import com.klp.common.utils.StringUtils; @@ -124,6 +125,16 @@ public class SysFileServiceImpl implements ISysFileService { return TableDataInfo.build(result); } + /** + * 文件浏览次数 +1 + */ + @Override + public void incrementViewCount(Long fileId) { + baseMapper.update(null, Wrappers.lambdaUpdate() + .setSql("view_count = view_count + 1") + .eq(SysFile::getFileId, fileId)); + } + /** * 保存前的数据校验 */ diff --git a/klp-system/src/main/resources/mapper/system/SysFileCommentMapper.xml b/klp-system/src/main/resources/mapper/system/SysFileCommentMapper.xml new file mode 100644 index 000000000..bdd9284ba --- /dev/null +++ b/klp-system/src/main/resources/mapper/system/SysFileCommentMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + diff --git a/klp-system/src/main/resources/mapper/system/SysFileMapper.xml b/klp-system/src/main/resources/mapper/system/SysFileMapper.xml index 809b1c040..c987af387 100644 --- a/klp-system/src/main/resources/mapper/system/SysFileMapper.xml +++ b/klp-system/src/main/resources/mapper/system/SysFileMapper.xml @@ -15,6 +15,7 @@ + diff --git a/klp-ui/src/api/system/file.js b/klp-ui/src/api/system/file.js index c184ddda3..f46086350 100644 --- a/klp-ui/src/api/system/file.js +++ b/klp-ui/src/api/system/file.js @@ -52,6 +52,14 @@ export function exportFile(query) { }) } +// 文件浏览次数 +1 +export function incrementView(fileId) { + return request({ + url: '/system/file/incrementView/' + fileId, + method: 'put' + }) +} + // 查询与我相关的文件 export function listRelatedToMe(query) { return request({ diff --git a/klp-ui/src/api/system/fileComment.js b/klp-ui/src/api/system/fileComment.js new file mode 100644 index 000000000..bc33663be --- /dev/null +++ b/klp-ui/src/api/system/fileComment.js @@ -0,0 +1,18 @@ +import request from '@/utils/request' + +// 查询文件评论列表 +export function listFileComment(fileId) { + return request({ + url: '/system/file/comment/list/' + fileId, + method: 'get' + }) +} + +// 新增文件评论 +export function addFileComment(data) { + return request({ + url: '/system/file/comment', + method: 'post', + data: data + }) +} diff --git a/klp-ui/src/views/mes/qc/qualityReview/index.vue b/klp-ui/src/views/mes/qc/qualityReview/index.vue index 3b84de969..6bae8bcd8 100644 --- a/klp-ui/src/views/mes/qc/qualityReview/index.vue +++ b/klp-ui/src/views/mes/qc/qualityReview/index.vue @@ -69,11 +69,7 @@ 提交送审 - - 审批通过 - 驳回 + 执行改判 @@ -541,20 +537,6 @@ export default { }, // ===== 审批 ===== - handleApprove() { - this.approveAction = 'approve' - this.approveForm = { - reviewId: this.currentRow.reviewId, - leaderOpinion: '', - leaderSign: '' - } - // 先构建完整对象再赋值 - const map = {} - this.coilList.forEach(c => { - map[c.detailId] = c.regradeQuality || '' - }) - this.approveCoilMap = map - }, doApprove() { if (!this.approveForm.leaderOpinion) { this.$modal.msgError('请输入审批意见') @@ -581,10 +563,6 @@ export default { }) }).catch(() => {}) }, - handleReject() { - this.approveAction = 'reject' - this.rejectReason = '' - }, doReject() { if (!this.rejectReason) { this.$modal.msgError('请输入驳回原因') diff --git a/klp-ui/src/views/micro/pages/acid/components/ActualPerformance.vue b/klp-ui/src/views/micro/pages/acid/components/ActualPerformance.vue index 9fdce0e97..02e4d84c7 100644 --- a/klp-ui/src/views/micro/pages/acid/components/ActualPerformance.vue +++ b/klp-ui/src/views/micro/pages/acid/components/ActualPerformance.vue @@ -172,10 +172,10 @@
查找
- 按钢卷号 + 按钢卷号/热卷号
- 钢卷号: - + 钢卷号/热卷号: +
diff --git a/klp-ui/src/views/system/file/all.vue b/klp-ui/src/views/system/file/all.vue index bc7233ad5..ffa39af76 100644 --- a/klp-ui/src/views/system/file/all.vue +++ b/klp-ui/src/views/system/file/all.vue @@ -152,6 +152,11 @@ {{ parseTime(scope.row.createTime) }} + + + {{ selectedFile.createBy }} {{ parseTime(selectedFile.createTime) }}
+
+
+ 评论 ({{ comments.length }}) + {{ commentExpanded ? '收起' : '展开' }} +
+
+
加载中...
+
暂无评论
+
+
+
+ {{ item.dept }} + {{ item.createBy }} + {{ parseTime(item.createTime) }} +
+
{{ item.content }}
+
+
+
+ + 发送 +
+
+
@@ -274,6 +309,7 @@ {{ formatFileSize(infoFile.fileSize) }} {{ infoFile.suffix || '-' }} + {{ infoFile.viewCount != null ? infoFile.viewCount : 0 }} 次 {{ infoFile.orderNo || '-' }} {{ infoFile.dept || '-' }} @@ -291,7 +327,8 @@