package com.ruoyi.mock.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.approve.pojo.ApprovalTemplate; import com.ruoyi.approve.mapper.ApprovalTemplateMapper; import com.ruoyi.basic.mapper.CustomerMapper; import com.ruoyi.basic.mapper.ProductMapper; import com.ruoyi.basic.mapper.ProductModelMapper; import com.ruoyi.basic.mapper.SupplierManageMapper; import com.ruoyi.common.enums.TypeEnums; import com.ruoyi.mock.dto.DataCheckRequest; import com.ruoyi.mock.service.DataCheckService; import com.ruoyi.mock.vo.DataCheckResult; import com.ruoyi.mock.vo.DataCheckResult.CheckItem; import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.project.system.mapper.SysUserMapper; import com.ruoyi.quality.mapper.QualityTestStandardBindingMapper; import com.ruoyi.quality.mapper.QualityTestStandardMapper; import com.ruoyi.technology.mapper.TechnologyBomMapper; import com.ruoyi.technology.mapper.TechnologyBomStructureMapper; import com.ruoyi.technology.mapper.TechnologyOperationMapper; import com.ruoyi.technology.mapper.TechnologyRoutingMapper; import com.ruoyi.technology.mapper.TechnologyRoutingOperationMapper; import com.ruoyi.technology.pojo.TechnologyBom; import com.ruoyi.technology.pojo.TechnologyBomStructure; import com.ruoyi.technology.pojo.TechnologyRouting; import com.ruoyi.technology.pojo.TechnologyRoutingOperation; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @Service @RequiredArgsConstructor public class DataCheckServiceImpl implements DataCheckService { private final ProductMapper productMapper; private final ProductModelMapper productModelMapper; private final CustomerMapper customerMapper; private final SupplierManageMapper supplierManageMapper; private final ApprovalTemplateMapper approvalTemplateMapper; private final QualityTestStandardMapper qualityTestStandardMapper; private final QualityTestStandardBindingMapper qualityTestStandardBindingMapper; private final TechnologyRoutingMapper technologyRoutingMapper; private final TechnologyRoutingOperationMapper technologyRoutingOperationMapper; private final TechnologyOperationMapper technologyOperationMapper; private final TechnologyBomMapper technologyBomMapper; private final TechnologyBomStructureMapper technologyBomStructureMapper; private final SysUserMapper sysUserMapper; @Override public DataCheckResult check(DataCheckRequest request) { List modules = request.getModules(); if (modules == null) { modules = List.of(); } Map itemMap = new LinkedHashMap<>(); if (!modules.isEmpty()) { addProductCheck(itemMap); addUserChecks(itemMap); } for (String module : modules) { switch (module) { case "sales" -> addSalesChecks(itemMap); case "purchase" -> addPurchaseChecks(itemMap); case "quality" -> addQualityChecks(itemMap); case "production" -> addProductionChecks(itemMap); } } List items = new ArrayList<>(itemMap.values()); DataCheckResult result = new DataCheckResult(); result.setItems(items); result.setTotalItems(items.size()); result.setPassedItems((int) items.stream().filter(CheckItem::isPassed).count()); return result; } private void addProductCheck(Map itemMap) { String key = "common:产品数据"; if (itemMap.containsKey(key)) { return; } long count = productMapper.selectCount(null); itemMap.put(key, buildItem("common", "产品数据", 1, (int) count, "缺少产品数据,请先在【基础数据-产品管理】中添加至少1条产品")); } private void addUserChecks(Map itemMap) { // 1. 系统用户 String userKey = "common:系统用户"; if (!itemMap.containsKey(userKey)) { List users = sysUserMapper.selectUserListWithDetail(); itemMap.put(userKey, buildItem("common", "系统用户", 1, (int) users.size(), "缺少系统用户,请先在【系统管理-用户管理】中添加用户")); } // 2. 有角色的用户 String userWithRoleKey = "common:用户角色配置"; if (!itemMap.containsKey(userWithRoleKey)) { List users = sysUserMapper.selectUserListWithDetail(); long withRole = users.stream().filter(u -> u.getRoleNames() != null && !u.getRoleNames().isBlank()).count(); itemMap.put(userWithRoleKey, buildItem("common", "用户角色配置", 1, (int) withRole, "没有用户分配角色,请先在【系统管理-用户管理】中为用户分配角色")); } // 3. 有部门的用户 String userWithDeptKey = "common:用户部门配置"; if (!itemMap.containsKey(userWithDeptKey)) { List users = sysUserMapper.selectUserListWithDetail(); long withDept = users.stream().filter(u -> u.getDeptNames() != null && !u.getDeptNames().isBlank()).count(); itemMap.put(userWithDeptKey, buildItem("common", "用户部门配置", 1, (int) withDept, "没有用户分配部门,请先在【系统管理-用户管理】中为用户分配部门")); } } private void addSalesChecks(Map itemMap) { String customerKey = "sales:客户数据"; if (!itemMap.containsKey(customerKey)) { long count = customerMapper.selectCount(null); itemMap.put(customerKey, buildItem("sales", "客户数据", 1, (int) count, "缺少客户数据,请先在【基础数据-客户管理】中添加至少1条客户")); } String quotationKey = "sales:报价审批模板"; if (!itemMap.containsKey(quotationKey)) { long count = approvalTemplateMapper.selectCount( new LambdaQueryWrapper() .eq(ApprovalTemplate::getBusinessType, TypeEnums.QUOTATION_APPROVAL.getCode())); itemMap.put(quotationKey, buildItem("sales", "报价审批模板", 1, (int) count, "缺少报价审批模板,请先在【系统管理-审批模板】中创建报价审批模板")); } String shippingKey = "sales:发货审批模板"; if (!itemMap.containsKey(shippingKey)) { long count = approvalTemplateMapper.selectCount( new LambdaQueryWrapper() .eq(ApprovalTemplate::getBusinessType, TypeEnums.SHIPPING_APPROVAL.getCode())); itemMap.put(shippingKey, buildItem("sales", "发货审批模板", 1, (int) count, "缺少发货审批模板,请先在【系统管理-审批模板】中创建发货审批模板")); } } private void addPurchaseChecks(Map itemMap) { String supplierKey = "purchase:供应商数据"; if (!itemMap.containsKey(supplierKey)) { long count = supplierManageMapper.selectCount(null); itemMap.put(supplierKey, buildItem("purchase", "供应商数据", 1, (int) count, "缺少供应商数据,请先在【基础数据-供应商管理】中添加至少1条供应商")); } String tplKey = "purchase:采购审批模板"; if (!itemMap.containsKey(tplKey)) { long count = approvalTemplateMapper.selectCount( new LambdaQueryWrapper() .eq(ApprovalTemplate::getBusinessType, TypeEnums.PURCHASE_APPROVAL.getCode())); itemMap.put(tplKey, buildItem("purchase", "采购审批模板", 1, (int) count, "缺少采购审批模板,请先在【系统管理-审批模板】中创建采购审批模板")); } } private void addQualityChecks(Map itemMap) { String standardKey = "quality:检测标准"; if (!itemMap.containsKey(standardKey)) { long count = qualityTestStandardMapper.selectCount(null); itemMap.put(standardKey, buildItem("quality", "检测标准", 1, (int) count, "缺少检测标准,请先在【质量管理-检测标准】中创建检测标准")); } String bindingKey = "quality:指标绑定"; if (!itemMap.containsKey(bindingKey)) { long count = qualityTestStandardBindingMapper.selectCount(null); itemMap.put(bindingKey, buildItem("quality", "指标绑定", 1, (int) count, "缺少指标绑定,请先在【质量管理-检测标准绑定】中将检测标准与产品绑定")); } } private void addProductionChecks(Map itemMap) { // 1. 产品规格 String modelKey = "production:产品规格"; if (!itemMap.containsKey(modelKey)) { long count = productModelMapper.selectCount(null); itemMap.put(modelKey, buildItem("production", "产品规格", 1, (int) count, "缺少产品规格,请先在【基础数据-产品管理】中为产品添加规格型号")); } // 2. 工序 String operationKey = "production:工序"; if (!itemMap.containsKey(operationKey)) { long count = technologyOperationMapper.selectCount(null); itemMap.put(operationKey, buildItem("production", "工序", 1, (int) count, "缺少工序,请先在【工艺设计-工序管理】中创建工序")); } // 3. BOM String bomKey = "production:BOM"; if (!itemMap.containsKey(bomKey)) { long count = technologyBomMapper.selectCount(null); itemMap.put(bomKey, buildItem("production", "BOM", 1, (int) count, "缺少BOM,请先在【工艺设计-BOM管理】中创建BOM")); } // 4. BOM产品结构 String bomStructureKey = "production:BOM产品结构"; if (!itemMap.containsKey(bomStructureKey)) { long count = technologyBomStructureMapper.selectCount(null); itemMap.put(bomStructureKey, buildItem("production", "BOM产品结构", 1, (int) count, "缺少BOM产品结构,请先在【工艺设计-BOM管理】中为BOM添加产品结构节点")); } // 5. 工艺路线 String routingKey = "production:工艺路线"; if (!itemMap.containsKey(routingKey)) { long count = technologyRoutingMapper.selectCount(null); itemMap.put(routingKey, buildItem("production", "工艺路线", 1, (int) count, "缺少工艺路线,请先在【工艺设计-工艺路线】中创建工艺路线")); } // 6. 工艺路线工序 String routingOpKey = "production:工艺路线工序"; if (!itemMap.containsKey(routingOpKey)) { long count = technologyRoutingOperationMapper.selectCount(null); itemMap.put(routingOpKey, buildItem("production", "工艺路线工序", 1, (int) count, "缺少工艺路线工序,请先在【工艺设计-工艺路线】中为工艺路线添加工序")); } // 7. 关联性检测:有产品规格但无工艺路线的 String linkageKey = "production:产品-工艺路线关联"; if (!itemMap.containsKey(linkageKey)) { long modelCount = productModelMapper.selectCount(null); long routedCount = technologyRoutingMapper.selectCount( new LambdaQueryWrapper() .isNotNull(TechnologyRouting::getProductModelId) .gt(TechnologyRouting::getProductModelId, 0)); itemMap.put(linkageKey, buildItem("production", "产品-工艺路线关联", (int) Math.min(modelCount, 1), (int) routedCount, "部分产品规格未关联工艺路线,请先在【工艺设计-工艺路线】中为产品规格创建工艺路线")); } // 8. 关联性检测:有工艺路线但无工序的 String routingOpLinkKey = "production:工艺路线-工序关联"; if (!itemMap.containsKey(routingOpLinkKey)) { long routingCount = technologyRoutingMapper.selectCount(null); long routedOpCount = technologyRoutingOperationMapper.selectCount( new LambdaQueryWrapper() .gt(TechnologyRoutingOperation::getTechnologyRoutingId, 0)); itemMap.put(routingOpLinkKey, buildItem("production", "工艺路线-工序关联", (int) Math.min(routingCount, 1), (int) routedOpCount, "部分工艺路线未添加工序,请先在【工艺设计-工艺路线】中为工艺路线添加工序")); } // 9. 关联性检测:有BOM但无产品结构的 String bomStructureLinkKey = "production:BOM-产品结构关联"; if (!itemMap.containsKey(bomStructureLinkKey)) { long bomCount = technologyBomMapper.selectCount(null); long structureCount = technologyBomStructureMapper.selectCount( new LambdaQueryWrapper() .gt(TechnologyBomStructure::getBomId, 0)); itemMap.put(bomStructureLinkKey, buildItem("production", "BOM-产品结构关联", (int) Math.min(bomCount, 1), (int) structureCount, "部分BOM未添加产品结构,请先在【工艺设计-BOM管理】中为BOM添加产品结构节点")); } } private CheckItem buildItem(String module, String itemName, int minRequired, int currentCount, String failMessage) { CheckItem item = new CheckItem(); item.setModule(module); item.setItemName(itemName); item.setMinRequired(minRequired); item.setCurrentCount(currentCount); item.setPassed(currentCount >= minRequired); item.setMessage(item.isPassed() ? "通过" : failMessage); return item; } }