|
@@ -0,0 +1,178 @@
|
|
|
+package com.rongwei.bscommon.sys.dao;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.rongwei.bsentity.domain.ProjectWbsNodeDo;
|
|
|
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
|
|
+import org.apache.ibatis.annotations.Param;
|
|
|
+import org.apache.ibatis.annotations.Select;
|
|
|
+import org.apache.ibatis.annotations.Update;
|
|
|
+
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+/**
|
|
|
+ * <p>
|
|
|
+ * Mapper 接口
|
|
|
+ * </p>
|
|
|
+ *
|
|
|
+ * @author dlc
|
|
|
+ * @since 2025-07-01
|
|
|
+ */
|
|
|
+public interface ProjectWbsNodeDao extends BaseMapper<ProjectWbsNodeDo> {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取所有的项目和机号
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Select("SELECT " +
|
|
|
+ " DISTINCT PROJECTID, " +
|
|
|
+ " MATHINECODE " +
|
|
|
+ "FROM " +
|
|
|
+ " PROJECT_WBS_NODE")
|
|
|
+ List<JSONObject> getProjectAndMachine();
|
|
|
+
|
|
|
+ @Update("UPDATE PROJECT_WBS_NODE T1 " +
|
|
|
+ " SET T1.STATE = (SELECT MAX(T2.INSTATE) INSTATE FROM ZHCX_ITP_PROJECT_NODE_STATE T2 WHERE T2.NODEID = T1.ITPNODEID and T2.PRJID= #{projectId} and T2.MATHINECODE= #{machineNo}) " +
|
|
|
+ "where T1.PROJECTID= #{projectId} and T1.MATHINECODE= #{machineNo}; " +
|
|
|
+ "update PROJECT_WBS_NODE set STATE='2' where (STATE='10' or STATE='30') " +
|
|
|
+ "and PROJECTID= #{projectId} and MATHINECODE= #{machineNo}; " +
|
|
|
+ "WITH min_complete_time AS ( " +
|
|
|
+ " SELECT " +
|
|
|
+ " NODEID, " +
|
|
|
+ " PRJID, " +
|
|
|
+ " MATHINECODE, " +
|
|
|
+ " MIN(INCOMPLETETIME) AS MIN_INCOMPLETETIME " +
|
|
|
+ " FROM " +
|
|
|
+ " ZHCX_ITP_PROJECT_NODE_STATE " +
|
|
|
+ " WHERE " +
|
|
|
+ " INSTATE IN (10, 30) and PRJID= #{projectId} and MATHINECODE= #{machineNo} " +
|
|
|
+ " GROUP BY " +
|
|
|
+ " NODEID, " +
|
|
|
+ " PRJID, " +
|
|
|
+ " MATHINECODE " +
|
|
|
+ ") " +
|
|
|
+ "UPDATE " +
|
|
|
+ " PROJECT_WBS_NODE pwn " +
|
|
|
+ "SET " +
|
|
|
+ " FACTENDDATE = ( " +
|
|
|
+ " SELECT mct.MIN_INCOMPLETETIME " +
|
|
|
+ " FROM min_complete_time mct " +
|
|
|
+ " WHERE mct.NODEID = pwn.ITPNODEID " +
|
|
|
+ " AND mct.PRJID = pwn.PROJECTID " +
|
|
|
+ " AND mct.MATHINECODE = pwn.MATHINECODE " +
|
|
|
+ " ) where STATE='2' and PROJECTID= #{projectId} and MATHINECODE= #{machineNo}; " +
|
|
|
+ " " +
|
|
|
+ "UPDATE PROJECT_WBS_NODE T1 " +
|
|
|
+ "SET T1.STATEOUT= (SELECT MAX(T2.OUTSTATE) OUTSTATE FROM ZHCX_ITP_PROJECT_NODE_STATE T2 WHERE T2.NODEID = T1.ITPNODEID and T2.PRJID= #{projectId} and T2.MATHINECODE= #{machineNo}) " +
|
|
|
+ "where T1.PROJECTID= #{projectId} and T1.MATHINECODE= #{machineNo}; " +
|
|
|
+ "update PROJECT_WBS_NODE set STATEOUT='2' where (STATEOUT='10' or STATEOUT='30') " +
|
|
|
+ "and PROJECTID= #{projectId} and MATHINECODE= #{machineNo}")
|
|
|
+ void updateWbsNodeState(@Param("projectId") String projectId, @Param("machineNo") String machineNo);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取所有的多个报验点的任务
|
|
|
+ *
|
|
|
+ * @param projectId
|
|
|
+ * @param machineNo
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Select("select ID,ITPNODEID,TASKNAME from PROJECT_WBS_NODE T1 " +
|
|
|
+ " where T1.PROJECTID=#{projectId} and T1.MATHINECODE=#{machineNo} " +
|
|
|
+ " and INSTR(ITPNODEID, ',') > 0")
|
|
|
+ List<JSONObject> getAllNode(@Param("projectId") String projectId, @Param("machineNo") String machineNo);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新进度
|
|
|
+ *
|
|
|
+ * @param projectId
|
|
|
+ * @param machineNo
|
|
|
+ */
|
|
|
+ @Update("WITH cte_calculation AS ( " +
|
|
|
+ " select f.pid as id,f.PLANSTARTDATE-g.PLANSTARTDATE pass,g.total, " +
|
|
|
+ " (f.PLANSTARTDATE-g.PLANSTARTDATE)/g.total as progress " +
|
|
|
+ " from PROJECT_WBS_NODE a right join ( " +
|
|
|
+ " select PID,MAX(PLANSTARTDATE) PLANSTARTDATE from PROJECT_WBS_NODE " +
|
|
|
+ " where PROJECTID=#{projectId} and MATHINECODE=#{machineNo} and (STATE = '1' or STATE='2') and DELETED='0' group by PID ) f " +
|
|
|
+ " on a.ID=f.PID left join " +
|
|
|
+ " (select PID,MIN(PLANSTARTDATE) PLANSTARTDATE,MAX(PLANSTARTDATE)-MIN(PLANSTARTDATE) total from PROJECT_WBS_NODE " +
|
|
|
+ " where PROJECTID=#{projectId} and MATHINECODE=#{machineNo} and DELETED='0' group by PID) g " +
|
|
|
+ " on a.ID = g.PID " +
|
|
|
+ " WHERE g.total!=0 " +
|
|
|
+// "-- 过滤无效日期 " +
|
|
|
+ " ) " +
|
|
|
+ " UPDATE PROJECT_WBS_NODE AS t " +
|
|
|
+ " SET progress = ROUND(c.progress * 100, 4) " +
|
|
|
+ " FROM cte_calculation c " +
|
|
|
+ " WHERE t.id = c.id; " +
|
|
|
+ "WITH child_date_diff AS ( " +
|
|
|
+ " SELECT " +
|
|
|
+ " PID,MIN(PLANSTARTDATE) MINDATE, " +
|
|
|
+ " MAX(PLANSTARTDATE) - MIN(PLANSTARTDATE) AS max_date_diff " +
|
|
|
+ " FROM " +
|
|
|
+ " project_wbs_node " +
|
|
|
+ " WHERE " +
|
|
|
+ " TYPE='milestone' and DELETED='0' and PROJECTID=#{projectId} and MATHINECODE=#{machineNo} " +
|
|
|
+ " GROUP BY " +
|
|
|
+ " PID " +
|
|
|
+ "), " +
|
|
|
+// "-- 获取每个父节点下STATE为1或2的子节点最大PLANSTARTDATE " +
|
|
|
+ "valid_child_dates AS ( " +
|
|
|
+ " SELECT distinct " +
|
|
|
+ " PID, " +
|
|
|
+ " MAX(PLANSTARTDATE) AS max_valid_date " +
|
|
|
+ " FROM " +
|
|
|
+ " project_wbs_node " +
|
|
|
+ " WHERE " +
|
|
|
+ " STATE = '2' and " +
|
|
|
+ " TYPE='milestone' and DELETED='0' AND PROJECTID=#{projectId} and MATHINECODE=#{machineNo} " +
|
|
|
+ " GROUP BY " +
|
|
|
+ " PID " +
|
|
|
+ "), " +
|
|
|
+ " " +
|
|
|
+// "-- 获取每个子节点的下一个PLANSTARTDATE " +
|
|
|
+ "next_node_dates AS ( " +
|
|
|
+ " SELECT DISTINCT " +
|
|
|
+ " ID,PID,PLANSTARTDATE,FACTENDDATE, " +
|
|
|
+ " LEAD(PLANSTARTDATE) OVER (PARTITION BY PID ORDER BY PLANSTARTDATE) AS next_date " +
|
|
|
+ " FROM " +
|
|
|
+ " project_wbs_node where PROJECTID=#{projectId} and MATHINECODE=#{machineNo} " +
|
|
|
+ "), " +
|
|
|
+ " " +
|
|
|
+// "-- 计算分子值(考虑当前时间与节点时间关系) " +
|
|
|
+ "numerator_calc AS ( " +
|
|
|
+ " SELECT " +
|
|
|
+ " vcd.PID, " +
|
|
|
+ " CASE " +
|
|
|
+ " WHEN nnd.next_date IS NULL or nnd.FACTENDDATE is null THEN vcd.max_valid_date " +
|
|
|
+ " WHEN now()- nnd.FACTENDDATE >= nnd.next_date-vcd.max_valid_date THEN nnd.next_date " +
|
|
|
+ " WHEN now()- nnd.FACTENDDATE < nnd.next_date-vcd.max_valid_date THEN ADD_DAYS(vcd.max_valid_date, (now()- nnd.FACTENDDATE)) " +
|
|
|
+ " ELSE vcd.max_valid_date " +
|
|
|
+ " END AS numerator_value " +
|
|
|
+ " FROM " +
|
|
|
+ " valid_child_dates vcd " +
|
|
|
+ " JOIN " +
|
|
|
+ " next_node_dates nnd ON nnd.PLANSTARTDATE = vcd.max_valid_date AND nnd.PID = vcd.PID " +
|
|
|
+ ") " +
|
|
|
+ "UPDATE project_wbs_node pwn " +
|
|
|
+ "SET PROGRESS = ( " +
|
|
|
+ " SELECT top 1 " +
|
|
|
+ " CASE " +
|
|
|
+ " WHEN cdd.max_date_diff = 0 THEN 1 " +
|
|
|
+ " ELSE DATEDIFF(DAY, cdd.MINDATE, nc.numerator_value) * 100 / " +
|
|
|
+ " cdd.max_date_diff " +
|
|
|
+ " END " +
|
|
|
+ " FROM " +
|
|
|
+ " numerator_calc nc " +
|
|
|
+ " JOIN " +
|
|
|
+ " child_date_diff cdd ON nc.PID = cdd.PID " +
|
|
|
+ " WHERE " +
|
|
|
+ " nc.PID = pwn.ID " +
|
|
|
+ " AND pwn.PROJECTID=#{projectId} and pwn.MATHINECODE=#{machineNo} " +
|
|
|
+ ") " +
|
|
|
+ "WHERE EXISTS ( " +
|
|
|
+ " SELECT 1 " +
|
|
|
+ " FROM numerator_calc nc " +
|
|
|
+ " WHERE nc.PID = pwn.ID " +
|
|
|
+ ");")
|
|
|
+ void updateProgress(@Param("projectId") String projectId, @Param("machineNo") String machineNo);
|
|
|
+}
|