diff --git a/src/main/java/com/sipai/controller/maintenance/EquipmentPlanTypeController.java b/src/main/java/com/sipai/controller/maintenance/EquipmentPlanTypeController.java index ad93cfb5..69057424 100644 --- a/src/main/java/com/sipai/controller/maintenance/EquipmentPlanTypeController.java +++ b/src/main/java/com/sipai/controller/maintenance/EquipmentPlanTypeController.java @@ -165,7 +165,8 @@ public class EquipmentPlanTypeController { String id = request.getParameter("id"); EquipmentPlanType equipmentPlanType = this.equipmentPlanTypeService.selectById(id); model.addAttribute("equipmentPlanType", equipmentPlanType); - return "maintenance/equipmentPlanTypeView"; + // Return edit page so user can view parent and manage child records + return "maintenance/equipmentPlanTypeEdit"; } /** * 打开编辑界面 @@ -235,6 +236,12 @@ public class EquipmentPlanTypeController { /** * 根据code获取类型下拉数据 + * 支持多种数据结构: + * 1. 标准结构:code='wx'的父记录 -> 返回其子记录 + * 2. 简化结构:code='wx'的父记录无子记录 -> 返回该父记录本身 + * 3. 子记录结构:无code='wx'父记录但有type='0'的子记录 -> 返回这些子记录 + * 4. 扁平结构:只有type='0'的记录(无论pid) -> 返回这些记录 + * 5. 最终兜底:返回所有相关类型的记录 * @param request * @param model * @return @@ -242,31 +249,98 @@ public class EquipmentPlanTypeController { @RequestMapping("/getSelectList4Code.do") public String getSelectList4Code(HttpServletRequest request,Model model){ String code = request.getParameter("code"); - String wherestr = "where 1=1 "; - String pid = ""; - - EquipmentPlanType equipmentPlanType = equipmentPlanTypeService.selectByWhere("where code = '"+code+"' "); - if(equipmentPlanType!=null){ - pid = equipmentPlanType.getId();//获取大类id - } - - if(pid!=null && !pid.equals("")){ - wherestr += " and pid = '"+pid+"'"; - }else { - wherestr += " and pid = '-1'"; - } - - List list = this.equipmentPlanTypeService.selectListByWhere(wherestr+"order by morder asc"); JSONArray json = new JSONArray(); - if(list!=null && list.size()>0){ - for(int i=0;i list = this.equipmentPlanTypeService.selectListByWhere("where pid = '"+pid+"' order by morder asc"); + + if(list != null && list.size() > 0){ + // Standard case: return children + for(int i = 0; i < list.size(); i++){ + JSONObject jsonObject = new JSONObject(); + jsonObject.put("id", list.get(i).getId()); + jsonObject.put("text", list.get(i).getName()); + json.add(jsonObject); + } + } else { + // No children, return parent itself as the only option + JSONObject jsonObject = new JSONObject(); + jsonObject.put("id", parentType.getId()); + jsonObject.put("text", parentType.getName()); json.add(jsonObject); } + } else if(typeValue != null){ + // Step 2: No parent with code, try multiple fallback strategies + + // 2a: First try child records with specific type (pid != '-1') + List list = this.equipmentPlanTypeService.selectListByWhere( + "where type = '"+typeValue+"' and pid != '-1' order by morder asc"); + + if(list != null && list.size() > 0){ + for(int i = 0; i < list.size(); i++){ + JSONObject jsonObject = new JSONObject(); + jsonObject.put("id", list.get(i).getId()); + jsonObject.put("text", list.get(i).getName()); + json.add(jsonObject); + } + } else { + // 2b: Try all records with specific type (including root records with pid='-1') + list = this.equipmentPlanTypeService.selectListByWhere( + "where type = '"+typeValue+"' order by morder asc"); + + if(list != null && list.size() > 0){ + for(int i = 0; i < list.size(); i++){ + JSONObject jsonObject = new JSONObject(); + jsonObject.put("id", list.get(i).getId()); + jsonObject.put("text", list.get(i).getName()); + json.add(jsonObject); + } + } else { + // 2c: Final fallback - return all root records (pid='-1') + // This handles the case where user added parent records without setting type + list = this.equipmentPlanTypeService.selectListByWhere( + "where pid = '-1' order by morder asc"); + if(list != null && list.size() > 0){ + for(int i = 0; i < list.size(); i++){ + JSONObject jsonObject = new JSONObject(); + jsonObject.put("id", list.get(i).getId()); + jsonObject.put("text", list.get(i).getName()); + json.add(jsonObject); + } + } + } + } } + model.addAttribute("result", json.toString()); return "result"; } + + /** + * 根据code获取对应的type值 + * @param code + * @return type值 + */ + private String getTypeValueByCode(String code){ + if(EquipmentPlanType.Code_Type_Wx.equals(code)){ + return EquipmentPlanType.Type_Wx; // "0" + } else if(EquipmentPlanType.Code_Type_By.equals(code)){ + return EquipmentPlanType.Type_Ty; // "1" + } else if(EquipmentPlanType.Code_Type_Dx.equals(code)){ + return EquipmentPlanType.Type_Dx; // "5" + } + return null; + } } diff --git a/src/main/java/com/sipai/controller/pipeline/PipelineDataController.java b/src/main/java/com/sipai/controller/pipeline/PipelineDataController.java index 65fde121..37618b2a 100644 --- a/src/main/java/com/sipai/controller/pipeline/PipelineDataController.java +++ b/src/main/java/com/sipai/controller/pipeline/PipelineDataController.java @@ -50,6 +50,12 @@ public class PipelineDataController { if (request.getParameter("search_pipeline_area") != null && !request.getParameter("search_pipeline_area").isEmpty()) { wherestr += " and pipeline_area = '" + request.getParameter("search_pipeline_area") + "'"; } + if (request.getParameter("search_pipe_material") != null && !request.getParameter("search_pipe_material").isEmpty()) { + wherestr += " and pipe_material like '%" + request.getParameter("search_pipe_material") + "%'"; + } + if (request.getParameter("search_associated_plant") != null && !request.getParameter("search_associated_plant").isEmpty()) { + wherestr += " and associated_plant like '%" + request.getParameter("search_associated_plant") + "%'"; + } PageHelper.startPage(page, rows); List list = this.pipelineDataService.selectListByWhere(wherestr + orderstr); PageInfo pInfo = new PageInfo(list); diff --git a/src/main/java/com/sipai/controller/work/MPointController.java b/src/main/java/com/sipai/controller/work/MPointController.java index 7f0dd728..19f6f84c 100644 --- a/src/main/java/com/sipai/controller/work/MPointController.java +++ b/src/main/java/com/sipai/controller/work/MPointController.java @@ -444,7 +444,11 @@ public class MPointController { if (dbCount != esCount) { // 数据不一致,将数据库全量数据更新到ES logger.info("ES与DB数据总数不一致,执行全量同步并返回数据库结果"); - this.mPointService.syncAllDbDataToEs(); + try { + this.syncAllDbDataToEs(); + } catch (Exception e) { + logger.error("执行全量同步ES异常:", e); + } // 构建数据库查询条件,返回数据库结果至前端 String wherestr = " where 1=1 "; @@ -587,6 +591,33 @@ public class MPointController { return new ModelAndView("result"); } + public void syncAllDbDataToEs() { + logger.info("ES与数据库数据总数不一致,开始全量同步数据库数据到ES..."); + MPoint query = new MPoint(); + query.setWhere("where 1=1"); + List allDbData = mPointService.selectListAllByWhere(query); + if (allDbData != null && !allDbData.isEmpty()) { + List esList = new ArrayList<>(); + for (MPoint mPoint : allDbData) { + try { + MPointES mPointES = MPointES.format(mPoint); + esList.add(mPointES); + } catch (Exception e) { + logger.error("转换MPointES失败, id=" + mPoint.getId() + ", error=" + e.getMessage()); + } + } + if (!esList.isEmpty()) { + try { + mPointRepo.saveAll(esList); + logger.info("全量同步完成,共同步 " + esList.size() + " 条数据到ES"); + } catch (Exception e) { + logger.error("批量保存ES失败: " + e.getMessage()); + e.printStackTrace(); + } + } + } + } + private static String getKeyword(String searchName, List units) { int lastMatchNum = 1; String keyword = ""; diff --git a/src/main/java/com/sipai/entity/pipeline/PipelineData.java b/src/main/java/com/sipai/entity/pipeline/PipelineData.java index 326533ba..13692478 100644 --- a/src/main/java/com/sipai/entity/pipeline/PipelineData.java +++ b/src/main/java/com/sipai/entity/pipeline/PipelineData.java @@ -77,6 +77,18 @@ public class PipelineData extends SQLAdapter implements Serializable { @Column(name = "pipeline_area", length = 20) private String pipelineArea; + /** + * 管道材质 + */ + @Column(name = "pipe_material", length = 50) + private String pipeMaterial; + + /** + * 所属厂站 + */ + @Column(name = "associated_plant", length = 100) + private String associatedPlant; + // 构造方法 public PipelineData() { } @@ -162,6 +174,22 @@ public class PipelineData extends SQLAdapter implements Serializable { this.pipelineArea = pipelineArea; } + public String getPipeMaterial() { + return pipeMaterial; + } + + public void setPipeMaterial(String pipeMaterial) { + this.pipeMaterial = pipeMaterial; + } + + public String getAssociatedPlant() { + return associatedPlant; + } + + public void setAssociatedPlant(String associatedPlant) { + this.associatedPlant = associatedPlant; + } + @Override public String toString() { return "PipelineData{" + @@ -175,6 +203,8 @@ public class PipelineData extends SQLAdapter implements Serializable { ", endGroundElevationM=" + endGroundElevationM + ", pipelineInvertElevationM=" + pipelineInvertElevationM + ", pipelineArea='" + pipelineArea + '\'' + + ", pipeMaterial='" + pipeMaterial + '\'' + + ", associatedPlant='" + associatedPlant + '\'' + '}'; } } \ No newline at end of file diff --git a/src/main/java/com/sipai/mapper/pipeline/PipelineDataMapper.xml b/src/main/java/com/sipai/mapper/pipeline/PipelineDataMapper.xml index 1e0d5032..f90d3565 100644 --- a/src/main/java/com/sipai/mapper/pipeline/PipelineDataMapper.xml +++ b/src/main/java/com/sipai/mapper/pipeline/PipelineDataMapper.xml @@ -12,10 +12,13 @@ + + id, pipeline_name, diameter_mm, length_m, start_burial_depth_m, end_burial_depth_m, - start_ground_elevation_m, end_ground_elevation_m, pipeline_invert_elevation_m, pipeline_area + start_ground_elevation_m, end_ground_elevation_m, pipeline_invert_elevation_m, pipeline_area, + pipe_material, associated_plant diff --git a/src/main/java/com/sipai/service/scada/MPointService.java b/src/main/java/com/sipai/service/scada/MPointService.java index 3115cf0d..42d13489 100644 --- a/src/main/java/com/sipai/service/scada/MPointService.java +++ b/src/main/java/com/sipai/service/scada/MPointService.java @@ -17,15 +17,14 @@ import com.sipai.service.equipment.EquipmentCardService; import com.sipai.service.user.UnitService; import com.sipai.service.work.ModbusFigService; import com.sipai.service.work.ScadaPic_MPointService; -import com.sipai.tools.CommString; -import com.sipai.tools.CommUtil; -import com.sipai.tools.ValueTypeEnum; +import com.sipai.tools.*; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.usermodel.DateUtil; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; @@ -713,32 +712,6 @@ public class MPointService { /** * 将数据库全量数据同步到ES */ - public void syncAllDbDataToEs() { - logger.info("ES与数据库数据总数不一致,开始全量同步数据库数据到ES..."); - MPoint query = new MPoint(); - query.setWhere("where 1=1"); - List allDbData = mPointDao.selectListByWhere(query); - if (allDbData != null && allDbData.size() > 0) { - List esList = new ArrayList<>(); - for (MPoint mPoint : allDbData) { - try { - MPointES mPointES = MPointES.format(mPoint); - esList.add(mPointES); - } catch (Exception e) { - logger.error("转换MPointES失败, id=" + mPoint.getId() + ", error=" + e.getMessage()); - } - } - if (esList.size() > 0) { - try { - mPointRepo.saveAll(esList); - logger.info("全量同步完成,共同步 " + esList.size() + " 条数据到ES"); - } catch (Exception e) { - logger.error("批量保存ES失败: " + e.getMessage()); - e.printStackTrace(); - } - } - } - } @Transactional public int updateValue(String bizId, MPoint entity, MPointHistory mPointHistory) { @@ -1818,4 +1791,9 @@ public class MPointService { } return result; } + + @DataSourceTypeAnno(value = DataSources.SCADA_0533JS) + public List selectListAllByWhere(MPoint query) { + return mPointDao.selectListByWhere(query); + } } diff --git a/src/main/java/com/sipai/tools/DataSourceInterceptor.java b/src/main/java/com/sipai/tools/DataSourceInterceptor.java index 2dce1d05..3810a7b5 100644 --- a/src/main/java/com/sipai/tools/DataSourceInterceptor.java +++ b/src/main/java/com/sipai/tools/DataSourceInterceptor.java @@ -2,6 +2,9 @@ package com.sipai.tools; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.Signature; +import org.aspectj.lang.reflect.MethodSignature; + +import java.lang.reflect.Method; /*@Aspect // for aop @Component // for auto scan @@ -20,11 +23,19 @@ public class DataSourceInterceptor { // return; // } String fullMethodPath = signature.toString(); + MethodSignature methodSignature = (MethodSignature) signature; + Method method = methodSignature.getMethod(); + DataSourceTypeAnno typeAnno = method.getAnnotation(DataSourceTypeAnno.class); + DataSources sourceEnum = null; + if (typeAnno != null) { + sourceEnum = typeAnno.value(); + } // Object argus = argusObjects[0]; - if (fullMethodPath.contains(".scada.")) { - DataSourceHolder.setDataSources(DataSources.valueOf("SCADA_0533JS")); + String packageName = method.getDeclaringClass().getName(); + if (fullMethodPath.contains(".scada.") || packageName.contains(".scada.") || (sourceEnum == DataSources.SCADA_0533JS)) { + DataSourceHolder.setDataSources(DataSources.SCADA_0533JS); } else { - DataSourceHolder.setDataSources(DataSources.valueOf("MASTER")); + DataSourceHolder.setDataSources(DataSources.MASTER); } } diff --git a/src/main/java/com/sipai/tools/DataSourceTypeAnno.java b/src/main/java/com/sipai/tools/DataSourceTypeAnno.java new file mode 100644 index 00000000..3aca0481 --- /dev/null +++ b/src/main/java/com/sipai/tools/DataSourceTypeAnno.java @@ -0,0 +1,17 @@ +package com.sipai.tools; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 自定义注解 + */ +@Retention(RetentionPolicy.RUNTIME) // 在运行时可见 +@Target(ElementType.METHOD) // 注解可以用在方法上 +public @interface DataSourceTypeAnno { + //使用方式在service层方法上添加@DataSourceTypeAnno(DataSourceEnum.数据源枚举类型)用于指定所使用的数据源 + DataSources value() default DataSources.MASTER; +// DataSourceEnum value() default DataSourceEnum.SCADA_JSWS; +} diff --git a/src/main/webapp/WEB-INF/spring-mybatis.xml b/src/main/webapp/WEB-INF/spring-mybatis.xml index 4b9d0727..c71c5828 100644 --- a/src/main/webapp/WEB-INF/spring-mybatis.xml +++ b/src/main/webapp/WEB-INF/spring-mybatis.xml @@ -250,8 +250,10 @@ - - + + + + diff --git a/src/main/webapp/jsp/maintenance/repairAdd.jsp b/src/main/webapp/jsp/maintenance/repairAdd.jsp index 91640313..aee6c74d 100644 --- a/src/main/webapp/jsp/maintenance/repairAdd.jsp +++ b/src/main/webapp/jsp/maintenance/repairAdd.jsp @@ -70,8 +70,18 @@ var selectType = $("#repairTypeName").select2({minimumResultsForSearch: 10}); $.post(ext.contextPath + "/maintenance/equipmentPlanType/getSelectList4Code.do", {code:'${Code_Type_Wx}'}, function(data) { $("#repairTypeName").empty(); + // Parse data if it's a string + var jsonData = data; + if(typeof data === 'string') { + try { + jsonData = JSON.parse(data); + } catch(e) { + console.error('Failed to parse JSON:', e); + jsonData = []; + } + } var selelct_ =$("#repairTypeName").select2({ - data: data, + data: jsonData, placeholder:'请选择',//默认文字提示 allowClear: false,//允许清空 escapeMarkup: function (markup) { return markup; }, // 自定义格式化防止xss注入 @@ -85,7 +95,9 @@ selelct_.on('change',function(e){ $('#repairType').val(e.target.value); }) - },'json'); + },'json').fail(function(xhr, status, error) { + console.error('Failed to load repair types:', error); + }); }) diff --git a/src/main/webapp/jsp/maintenance/repairEdit.jsp b/src/main/webapp/jsp/maintenance/repairEdit.jsp index aea1610d..65ef1020 100644 --- a/src/main/webapp/jsp/maintenance/repairEdit.jsp +++ b/src/main/webapp/jsp/maintenance/repairEdit.jsp @@ -73,8 +73,18 @@ var selectType = $("#repairTypeName").select2({minimumResultsForSearch: 10}); $.post(ext.contextPath + "/maintenance/equipmentPlanType/getSelectList4Code.do", {code:'${Code_Type_Wx}'}, function(data) { $("#repairTypeName").empty(); + // Parse data if it's a string + var jsonData = data; + if(typeof data === 'string') { + try { + jsonData = JSON.parse(data); + } catch(e) { + console.error('Failed to parse JSON:', e); + jsonData = []; + } + } var selelct_ =$("#repairTypeName").select2({ - data: data, + data: jsonData, placeholder:'请选择',//默认文字提示 allowClear: false,//允许清空 escapeMarkup: function (markup) { return markup; }, // 自定义格式化防止xss注入 @@ -84,11 +94,17 @@ formatResult: function formatRepo(repo){return repo.text;}, // 函数用来渲染结果 formatSelection: function formatRepoSelection(repo){return repo.text;} // 函数用于呈现当前的选择 }); - selelct_.val('${repair.repairType}').trigger("change"); + // Set saved value if exists + var savedRepairType = '${repair.repairType}'; + if(savedRepairType && savedRepairType !== ''){ + selelct_.val(savedRepairType).trigger("change"); + } selelct_.on('change',function(e){ $('#repairType').val(e.target.value); }) - },'json'); + },'json').fail(function(xhr, status, error) { + console.error('Failed to load repair types:', error); + }); $('#planDate').datepicker({ language: 'zh-CN', @@ -103,7 +119,7 @@ $('#planDate').datepicker('setDate','${repair.planDate.substring(0, 10)}'); //加载维修库table - getWorkContentRepair('${repair.id}','${repair.unitId}','${repair.equipmentId}'); + <%--getWorkContentRepair('${repair.id}','${repair.unitId}','${repair.equipmentId}');--%> //加载消耗品table getWorkConsume('${repair.id}','${repair.unitId}'); //加载绩效table diff --git a/src/main/webapp/jsp/pipeline/pipelineDataAdd.jsp b/src/main/webapp/jsp/pipeline/pipelineDataAdd.jsp index 70036948..05a9b8ec 100644 --- a/src/main/webapp/jsp/pipeline/pipelineDataAdd.jsp +++ b/src/main/webapp/jsp/pipeline/pipelineDataAdd.jsp @@ -116,6 +116,18 @@ +
+ +
+ +
+
+
+ +
+ +
+
diff --git a/src/main/webapp/jsp/pipeline/pipelineDataEdit.jsp b/src/main/webapp/jsp/pipeline/pipelineDataEdit.jsp index 0d3fb528..43192e4c 100644 --- a/src/main/webapp/jsp/pipeline/pipelineDataEdit.jsp +++ b/src/main/webapp/jsp/pipeline/pipelineDataEdit.jsp @@ -119,6 +119,20 @@
+
+ +
+ +
+
+
+ +
+ +
+
diff --git a/src/main/webapp/jsp/pipeline/pipelineDataList.jsp b/src/main/webapp/jsp/pipeline/pipelineDataList.jsp index 460c1edc..1bbfa3e9 100644 --- a/src/main/webapp/jsp/pipeline/pipelineDataList.jsp +++ b/src/main/webapp/jsp/pipeline/pipelineDataList.jsp @@ -138,7 +138,9 @@ sort: params.sort, order: params.order, search_name: $('#search_name').val(), - search_pipeline_area: $('#search_pipeline_area').val() + search_pipeline_area: $('#search_pipeline_area').val(), + search_pipe_material: $('#search_pipe_material').val(), + search_associated_plant: $('#search_associated_plant').val() }; } @@ -184,6 +186,18 @@ } return value; } + }, { + field: 'pipeMaterial', + title: '管道材质', + align: 'center', + valign: 'middle', + width: '10%' + }, { + field: 'associatedPlant', + title: '所属厂站', + align: 'center', + valign: 'middle', + width: '10%' }, { field: 'diameterMm', title: '直径(mm)', @@ -292,7 +306,9 @@ -
+ + +
+
+ +
+

${pipelineData.pipeMaterial}

+
+
+
+ +
+

${pipelineData.associatedPlant}

+
+