yuanzhi_kuang 6 дней назад
Родитель
Сommit
31431487e2

+ 15 - 170
websrc/com/kingdee/eas/custom/dormitorysystem/waterelectricity/handler/WaterElectricityListHandler.java

@@ -9,7 +9,6 @@ import com.kingdee.bos.framework.ejb.EJBFactory;
 import com.kingdee.bos.metadata.entity.*;
 import com.kingdee.bos.metadata.query.util.CompareType;
 import com.kingdee.bos.util.BOSUuid;
-import com.kingdee.eas.base.permission.util.ToolUtils;
 import com.kingdee.eas.basedata.org.AdminOrgUnitInfo;
 import com.kingdee.eas.basedata.org.HROrgUnitInfo;
 import com.kingdee.eas.basedata.org.PositionInfo;
@@ -52,6 +51,7 @@ import java.util.*;
  * date: 2025/4/24 18:09 <br>
  * author: lhbj <br>
  * version: 1.0 <br>
+ * 爱贝壳
  */
 public class WaterElectricityListHandler extends WaterElectricityBatchListHandler {
     private static Logger logger = LoggerFactory.getLogger(WaterElectricityListHandler.class);
@@ -64,7 +64,7 @@ public class WaterElectricityListHandler extends WaterElectricityBatchListHandle
      * @param endPeriodDateStr
      * @return
      */
-    protected StringBuilder getPersonWaterElectricitySql1(String startPeriodDateStr, String endPeriodDateStr, Collection<String> billids) {
+    protected StringBuilder getPersonWaterElectricitySql(String startPeriodDateStr, String endPeriodDateStr, Collection<String> billids) {
         StringBuilder sel = new StringBuilder();
         sel.append(" select  p.fid pid,p.fname_l2 pName,p.fnumber pNumber,ops.fid opsid,ops.CFCheckInDate,ops.CFCheckOutDate,ops.CFDormitoryID dormitoryID, ");
         sel.append(" wpp.fid wppid,wpp.CFStartDate,wpp.CFEndDate,wpp.CFWaterprice,wpp.CFElectricityprice, ");
@@ -83,182 +83,32 @@ public class WaterElectricityListHandler extends WaterElectricityBatchListHandle
         sel.append(" left join t_bd_person p on pp.FPERSONID = p.fid ");
         sel.append(" left join T_HR_BDEmployeeType bt on bt.fid = p.FEmployeeTypeID ");
         sel.append(" left join CT_DOR_Dormitory dy on ops.CFDormitoryID=dy.fid ");
-        sel.append(" left join CT_WAT_WaterPowerPricing wpp on wpp.CFEndDate >='" + startPeriodDateStr + "' ");
+        sel.append(" left join CT_WAT_WaterPowerPricing wpp on wpp.CFEndDate>='" + startPeriodDateStr + "' ");
         sel.append(" and wpp.CFStartDate<='" + endPeriodDateStr + "' ");
         sel.append(" left join CT_MAN_WaterPowerMeterReading wpmr on wpmr.CFDormitoryID=ops.CFDormitoryID ");
 //        sel.append(" and wpmr.CFYears<=ops.CFCheckOutDate ");
 //        sel.append(" and DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,0,wpmr.CFYears)+1,0))>= ops.CFCheckInDate ");
         sel.append(" and wpmr.CFYears >= '" + startPeriodDateStr + "' ");
         sel.append(" and wpmr.CFYears <= '" + endPeriodDateStr + "' ");
-
+        
         sel.append(" left join CT_WOE_WaterElectricity wey on wey.FSourceFunction=ops.fid and wey.CFPersonID=pp.FPERSONID ");
         sel.append(" and wey.CFStartDate='" + startPeriodDateStr + "' ");
-        sel.append(" and wey.CFEndDate= '" + endPeriodDateStr + "' ");
+        sel.append(" and wey.CFEndDate='" + endPeriodDateStr + "' ");
         sel.append(" where ");
         sel.append(" to_char(ops.CFCheckOutDate,'yyyy-MM-dd') >= '" + startPeriodDateStr + "' ");
         sel.append(" and to_char(ops.CFCheckInDate ,'yyyy-MM-dd') <='" + endPeriodDateStr + "' ");
-        if (null != billids && !billids.isEmpty()) {
-            sel.append(" and wey.fid in( " +ToolUtils.aryToStr(billids) + ")");
+        if (null != billids && (!billids.isEmpty())) {
+            sel.append(" and wey.fid in('' ");
+            for (String id : billids) {
+                sel.append(",'");
+                sel.append(id);
+                sel.append("'");
+            }
+            sel.append(")");
         }
         System.out.println("getPersonWaterElectricitySql:" + sel);
         return sel;
     }
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-	/**
-	 * 获取水电费详细Sql(SQL Server专用,逻辑已确认:房间向上追溯上级节点单价,水/电独立追溯)
-	 * 核心逻辑:
-	 * 1. 递归CTE遍历房间及所有上级节点(楼栋、小区等),保留起点房间ID关联
-	 * 2. 独立筛选水/电单价:非null优先、层级越近优先
-	 * 3. 优先级:树形节点单价 → 定价表单价
-	 * @param startPeriodDateStr 开始日期(格式:yyyy-MM-dd)
-	 * @param endPeriodDateStr 结束日期(格式:yyyy-MM-dd)
-	 * @param billids 账单ID集合(可为null/空,非空时追加筛选条件)
-	 * @return 拼接后的SQL字符串
-	 */
-    protected StringBuilder getPersonWaterElectricitySql(String dbType, String startPeriodDateStr, String endPeriodDateStr, Collection<String> billids) {
-    
-    	    StringBuilder sel = new StringBuilder();
-
-    	    // 1. 递归CTE:追溯房间及所有上级节点(防自引用,避免死循环)
-    	    sel.append("/*dialect*/ WITH DormPriceCTE AS (");
-    	    // 锚点成员:所有节点作为起点(后续主查询关联房间,不影响逻辑)
-    	    sel.append("    SELECT ");
-    	    sel.append("        fid AS DormId,");
-    	    sel.append("        fparentId,");
-    	    sel.append("        CFWaterprice,");
-    	    sel.append("        CFElectricityprice,");
-    	    sel.append("        0 AS RecursionLevel");
-    	    sel.append("    FROM CT_DOR_Dormitory");
-    	    sel.append("    UNION ALL");
-    	    // 递归成员:向上遍历上级节点,保留起点房间ID(核心逻辑)
-    	    sel.append("    SELECT ");
-    	    sel.append("        child.DormId AS DormId,");
-    	    sel.append("        parent.fparentId,");
-    	    sel.append("        parent.CFWaterprice,");
-    	    sel.append("        parent.CFElectricityprice,");
-    	    sel.append("        child.RecursionLevel + 1 AS RecursionLevel");
-    	    sel.append("    FROM DormPriceCTE child");
-    	    sel.append("    INNER JOIN CT_DOR_Dormitory parent ");
-    	    sel.append("        ON child.fparentId = parent.fid ");
-    	    sel.append("        AND parent.fid != child.DormId  ");
-    	    sel.append("),");
-
-    	    // 2. 独立筛选「水单价」:按起点房间ID分组,取最近有效水价(非null优先、层级近优先)
-    	    sel.append("WaterLatestPrice AS (");
-    	    sel.append("    SELECT ");
-    	    sel.append("        DormId,");
-    	    sel.append("        CFWaterprice AS LatestWaterPrice,");
-    	    sel.append("        ROW_NUMBER() OVER (");
-    	    sel.append("            PARTITION BY DormId");
-    	    sel.append("            ORDER BY ");
-    	    sel.append("                CASE WHEN CFWaterprice IS NOT NULL THEN 0 ELSE 1 END,");
-    	    sel.append("                RecursionLevel ASC");
-    	    sel.append("        ) AS WaterRowNum");
-    	    sel.append("    FROM DormPriceCTE");
-    	    sel.append("),");
-
-    	    // 3. 独立筛选「电单价」:逻辑同水单价,独立判断电单价字段
-    	    sel.append("ElecLatestPrice AS (");
-    	    sel.append("    SELECT ");
-    	    sel.append("        DormId,");
-    	    sel.append("        CFElectricityprice AS LatestElecPrice,");
-    	    sel.append("        ROW_NUMBER() OVER (");
-    	    sel.append("            PARTITION BY DormId");
-    	    sel.append("            ORDER BY ");
-    	    sel.append("                CASE WHEN CFElectricityprice IS NOT NULL THEN 0 ELSE 1 END,");
-    	    sel.append("                RecursionLevel ASC");
-    	    sel.append("        ) AS ElecRowNum");
-    	    sel.append("    FROM DormPriceCTE");
-    	    sel.append(")");
-
-    	    // 4. 主查询:关联各表,返回结果字段(优先级:树形单价 → 定价表单价)
-    	    sel.append(" SELECT ");
-    	    sel.append("    p.fid pid,");
-    	    sel.append("    p.fname_l2 pName,");
-    	    sel.append("    p.fnumber pNumber,");
-    	    sel.append("    ops.fid opsid,");
-    	    sel.append("    ops.CFCheckInDate,");
-    	    sel.append("    ops.CFCheckOutDate,");
-    	    sel.append("    ops.CFDormitoryID dormitoryID,");
-    	    sel.append("    wpp.fid wppid,");
-    	    sel.append("    wpp.CFStartDate,");
-    	    sel.append("    wpp.CFEndDate,");
-    	    sel.append("    COALESCE(wlp.LatestWaterPrice, wpp.CFWaterprice) AS CFWaterprice,");
-    	    sel.append("    COALESCE(elp.LatestElecPrice, wpp.CFElectricityprice) AS CFElectricityprice,");
-    	    sel.append("    wpmr.fid wpmrid,");
-    	    sel.append("    wpmr.CFYears wpmrStartDate,");
-    	    sel.append("    DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH, 0, wpmr.CFYears) + 1, 0)) AS wpmrEndDate,");
-    	    sel.append("    ISNULL(wpmr.CFTotalWaterTons, 0) CFTotalWaterTons,");
-    	    sel.append("    ISNULL(wpmr.CFTotalElecDegrees, 0) CFTotalElecDegrees,");
-    	    sel.append("    ISNULL(wpmr.CFCurMonthWater, 0) CFCurMonthWater,");
-    	    sel.append("    ISNULL(wpmr.CFCurMonthElecDegrees, 0) CFCurMonthElecDegrees,");
-    	    sel.append("    wpmr.CFMeterReaPersonID,");
-    	    sel.append("    pp.FPrimaryPositionID,");
-    	    sel.append("    pp.FPersonDep,");
-    	    sel.append("    CASE bt.finservice ");
-    	    sel.append("        WHEN 1 THEN 'active' ");
-    	    sel.append("        WHEN 4 THEN 'active' ");
-    	    sel.append("        ELSE 'inactive' ");
-    	    sel.append("    END AS InService");
-    	    sel.append(" FROM CT_OCC_Occupants ops");
-    	    sel.append(" LEFT JOIN T_HR_PersonPosition pp ON pp.fid = ops.CFPersonPositionID");
-    	    sel.append(" LEFT JOIN t_bd_person p ON pp.FPERSONID = p.fid");
-    	    sel.append(" LEFT JOIN T_HR_BDEmployeeType bt ON bt.fid = p.FEmployeeTypeID");
-    	    sel.append(" LEFT JOIN CT_DOR_Dormitory dy ON ops.CFDormitoryID = dy.fid");
-    	    sel.append(" LEFT JOIN WaterLatestPrice wlp ON dy.fid = wlp.DormId AND wlp.WaterRowNum = 1");
-    	    sel.append(" LEFT JOIN ElecLatestPrice elp ON dy.fid = elp.DormId AND elp.ElecRowNum = 1");
-    	    // 定价表关联:日期参数用传入的start/endPeriodDateStr,显式转换为date类型
-    	    sel.append(" LEFT JOIN CT_WAT_WaterPowerPricing wpp ");
-    	    sel.append("    ON wpp.CFStartDate <= CONVERT(date, '").append(startPeriodDateStr).append("')");
-    	    sel.append("    AND wpp.CFEndDate >= CONVERT(date, '").append(endPeriodDateStr).append("')");
-    	    // 抄表记录关联:按房间ID+日期范围匹配
-    	    sel.append(" LEFT JOIN CT_MAN_WaterPowerMeterReading wpmr ");
-    	    sel.append("    ON wpmr.CFDormitoryID = ops.CFDormitoryID");
-    	    sel.append("    AND wpmr.CFYears <= ops.CFCheckOutDate");
-    	    sel.append("    AND DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH, 0, wpmr.CFYears) + 1, 0)) >= ops.CFCheckInDate");
-    	    // 水电账单关联:按占用ID+人员ID+日期范围匹配(日期参数用传入值)
-    	    sel.append(" LEFT JOIN CT_WOE_WaterElectricity wey ");
-    	    sel.append("    ON wey.FSourceFunction = ops.fid ");
-    	    sel.append("    AND wey.CFPersonID = pp.FPERSONID");
-    	    sel.append("    AND wey.CFStartDate = CONVERT(date, '").append(startPeriodDateStr).append("')");
-    	    sel.append("    AND wey.CFEndDate = CONVERT(date, '").append(endPeriodDateStr).append("')");
-    	    // 筛选条件:占用周期与查询周期重叠(SQL Server用CONVERT替代to_char)
-    	    sel.append(" WHERE ");
-    	    sel.append("    CONVERT(varchar(10), ops.CFCheckOutDate, 23) >= '").append(startPeriodDateStr).append("'");
-    	    sel.append("    AND CONVERT(varchar(10), ops.CFCheckInDate, 23) <= '").append(endPeriodDateStr).append("'");
-
-    	    // 账单ID筛选:若传入billids集合,追加IN条件(避免空集合报错)
-    	    if (null != billids && !billids.isEmpty()) {
-    	        sel.append(" and wey.fid in( " +ToolUtils.aryToStr(billids) + ")");
-    	    }
-
-    	    // 递归深度限制:10层足够覆盖日常树形(房间→楼栋→小区→...),避免异常
-    	    sel.append(" OPTION (MAXRECURSION 10)");
-
-    	    System.out.println("getPersonWaterElectricitySql:" + sel);
-    	    return sel;
-    	}
-
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
 
     /**
      * 获取水电费详细集合
@@ -274,7 +124,7 @@ public class WaterElectricityListHandler extends WaterElectricityBatchListHandle
                                                                       String startPeriodDateStr, String endPeriodDateStr, Collection<String> billids)
             throws BOSException, SQLException, ShrWebBizException {
 
-        StringBuilder sel = this.getPersonWaterElectricitySql("sqlserver",startPeriodDateStr, endPeriodDateStr, billids);
+        StringBuilder sel = this.getPersonWaterElectricitySql(startPeriodDateStr, endPeriodDateStr, billids);
         IRowSet rs = DbUtil.executeQuery(ctx, sel.toString());
         List<Map<String, Object>> list = Lists.newArrayList();
         while (rs.next()) {
@@ -335,6 +185,7 @@ public class WaterElectricityListHandler extends WaterElectricityBatchListHandle
 
     /**
      * 获取人员入住详情
+     *
      * @param we
      * @param periodDate
      * @param pid
@@ -448,9 +299,6 @@ public class WaterElectricityListHandler extends WaterElectricityBatchListHandle
             waterElectricityInfo.setApplyDate(checkInDate);
             PersonInfo applier = SHRBillUtil.getCurrPersonInfo();
             waterElectricityInfo.setApplier(applier);
-            //水电单价
-            waterElectricityInfo.setWaterprice(waterprice);
-            waterElectricityInfo.setElectricityprice(electricityprice); 
 
             BOSUuid id = waterElectricityInfo.getId();
             if (null == id) {
@@ -471,7 +319,6 @@ public class WaterElectricityListHandler extends WaterElectricityBatchListHandle
                 }
             }
         }
-        
         resutMap.put("alls", alls);
         resutMap.put("errs", errs);
         resutMap.put("sess", sess);
@@ -524,7 +371,6 @@ public class WaterElectricityListHandler extends WaterElectricityBatchListHandle
         } catch (BOSException | EASBizException | SQLException e) {
             e.printStackTrace();
         }
-        
     }
     /**
      * 计算
@@ -686,5 +532,4 @@ public class WaterElectricityListHandler extends WaterElectricityBatchListHandle
             }
         }
     }
-
 }