yuanchao 1 сар өмнө
parent
commit
a3c458cd5e

+ 16 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotopeationfill/IotOpeationFillController.java

@@ -10,6 +10,8 @@ import cn.iocoder.yudao.module.pms.controller.admin.vo.DeviceVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDevicePageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotcountdata.IotCountDataDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotcountdata.IotCountListDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicerunlog.IotDeviceRunLogDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmodel.IotModelDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmodeltemplateattrs.IotModelTemplateAttrsDO;
@@ -282,6 +284,20 @@ public class IotOpeationFillController {
         return success(BeanUtils.toBean( iotOpeationFillService.fillRecords(pageReqVO), IotOpeationFillOrderDO.class));
     }
 
+    @GetMapping("/getCount")
+    @PermitAll
+    @Operation(summary = "获得PMS 功能优化 设备模板属性")
+    @Parameter(name = "deviceCategoryName", description = "名称", required = true, example = "1024")
+    public CommonResult<IotCountListDO> getCountList(IotCountDataDO vo) throws SQLException{
+        List<IotCountDataDO> list = iotOpeationFillService.countList(vo);
+        List<IotCountDataDO> totalList = list.stream().filter(item->item.getDeptId().equals(vo.getDeptId())).collect(Collectors.toList());
+        List<IotCountDataDO> deptCountList = list.stream().filter(item->!item.getDeptId().equals(vo.getDeptId())).collect(Collectors.toList());
+        IotCountListDO listDO = new IotCountListDO();
+        listDO.setTotalList(totalList);
+        listDO.setDeptCountList(deptCountList);
+        return success(BeanUtils.toBean(listDO,IotCountListDO.class));
+    }
+
 
     @GetMapping("/getAttrs")
     @PermitAll

+ 32 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotcountdata/IotCountDataDO.java

@@ -0,0 +1,32 @@
+package cn.iocoder.yudao.module.pms.dal.dataobject.iotcountdata;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+/**
+ * @author yc
+ * @version 1.0
+ * @className IotCountDataDO
+ * @date 2025/6/23 18:40
+ * @description
+ */
+@Data
+@ToString(callSuper = true)
+public class IotCountDataDO {
+    private Long deptId;
+    private String name;
+    private String totalCount;
+    private String filledCount;
+    private String unfilledCount;
+    private String fillingCount;
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+}

+ 19 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotcountdata/IotCountListDO.java

@@ -0,0 +1,19 @@
+package cn.iocoder.yudao.module.pms.dal.dataobject.iotcountdata;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author yc
+ * @version 1.0
+ * @className IotCountListDO
+ * @date 2025/6/23 19:03
+ * @description
+ */
+@Data
+public class IotCountListDO {
+    private List<IotCountDataDO> totalList;
+    private List<IotCountDataDO> deptCountList;
+
+}

+ 3 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotopeationfill/IotOpeationFillMapper.java

@@ -15,6 +15,7 @@ import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDevicePageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotZHBD.DeviceZHBDDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotcountdata.IotCountDataDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicerunlog.IotDeviceRunLogDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmodel.IotModelDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmodeltemplateattrs.IotModelTemplateAttrsDO;
@@ -112,5 +113,7 @@ public interface IotOpeationFillMapper extends BaseMapperX<IotOpeationFillDO> {
     int upLocation(DeviceZHBDDO zhbddo);
     @TenantIgnore
     IotOpeationFillDO getFillById(IotOpeationFillDO fillDO);
+    @TenantIgnore
+    List<IotCountDataDO> countList(IotCountDataDO dataDO);
 
 }

+ 3 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotopeationfill/IotOpeationFillService.java

@@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotmodeltemplateattrs.vo.Iot
 import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotcountdata.IotCountDataDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicerunlog.IotDeviceRunLogDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmodeltemplateattrs.IotModelTemplateAttrsDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO;
@@ -115,4 +116,6 @@ public interface IotOpeationFillService {
 
     PageResult<IotOpeationFillOrderDO> fillRecords(IotOpeationFillPageReqVO vo);
 
+    List<IotCountDataDO> countList(IotCountDataDO dataDO);
+
 }

+ 6 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotopeationfill/IotOpeationFillServiceImpl.java

@@ -4,6 +4,7 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotmodeltemplateattrs.vo.Iot
 import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotcountdata.IotCountDataDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicerunlog.IotDeviceRunLogDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmodeltemplateattrs.IotModelTemplateAttrsDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO;
@@ -216,4 +217,9 @@ public class IotOpeationFillServiceImpl implements IotOpeationFillService {
         return new PageResult<>(fillOrderDOIPage.getRecords(),fillOrderDOIPage.getTotal());
     }
 
+    @Override
+    public List<IotCountDataDO> countList(IotCountDataDO dataDO) {
+        return iotOpeationFillMapper.countList(dataDO);
+    }
+
 }

+ 88 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotOpeationFillMapper.xml

@@ -435,4 +435,92 @@
     </update>
 
 
+    <select id="countList" parameterType="cn.iocoder.yudao.module.pms.dal.dataobject.iotcountdata.IotCountDataDO"
+    resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotcountdata.IotCountDataDO">
+        -- 统计指定部门及其子部门的工单状态
+        SELECT
+        dept_id,
+        name,
+        total_count,
+        filled_count,
+        unfilled_count,
+        filling_count
+        FROM (
+        -- 第一行:汇总数据
+        SELECT
+        #{deptId} AS dept_id,
+        (SELECT name FROM system_dept WHERE id = #{deptId}) AS name,
+        COUNT(o.id) AS total_count,
+        SUM(CASE WHEN o.order_status = 1 THEN 1 ELSE 0 END) AS filled_count,
+        SUM(CASE WHEN o.order_status = 0 THEN 1 ELSE 0 END) AS unfilled_count,
+        SUM(CASE WHEN o.order_status = 2 THEN 1 ELSE 0 END) AS filling_count,
+        0 AS sort_order -- 确保汇总数据排在第一行
+        FROM rq_iot_opeation_fill_order o
+        WHERE o.deleted = 0
+        <if test="createTime != null and createTime.length > 0">
+            <choose>
+                <when test="createTime.length == 1">
+                    AND o.create_time = #{createTime[0],typeHandler=org.apache.ibatis.type.LocalDateTimeTypeHandler}
+                </when>
+                <otherwise>
+                    AND o.create_time BETWEEN #{createTime[0],typeHandler=org.apache.ibatis.type.LocalDateTimeTypeHandler} AND #{createTime[1],typeHandler=org.apache.ibatis.type.LocalDateTimeTypeHandler}
+                </otherwise>
+            </choose>
+        </if>
+        AND o.dept_id IN (
+        SELECT id FROM system_dept WHERE id = #{deptId} -- 包含根部门自身
+        UNION ALL
+        SELECT id FROM system_dept WHERE parent_id = #{deptId} -- 一级子部门
+        UNION ALL
+        SELECT id FROM system_dept WHERE parent_id IN (SELECT id FROM system_dept WHERE parent_id = #{deptId}) -- 二级子部门
+        UNION ALL
+        SELECT id FROM system_dept WHERE parent_id IN (SELECT id FROM system_dept WHERE parent_id IN (SELECT id FROM system_dept WHERE parent_id = #{deptId})) -- 三级子部门
+        UNION ALL
+        SELECT id FROM system_dept WHERE parent_id IN (SELECT id FROM system_dept WHERE parent_id IN (SELECT id FROM system_dept WHERE parent_id IN (SELECT id FROM system_dept WHERE parent_id = #{deptId}))) -- 四级子部门
+        )
+
+        UNION ALL
+
+        -- 后续行:直接子部门数据
+        SELECT
+        d.id AS dept_id,
+        d.name,
+        COUNT(o.id) AS total_count,
+        SUM(CASE WHEN o.order_status = 1 THEN 1 ELSE 0 END) AS filled_count,
+        SUM(CASE WHEN o.order_status = 0 THEN 1 ELSE 0 END) AS unfilled_count,
+        SUM(CASE WHEN o.order_status = 2 THEN 1 ELSE 0 END) AS filling_count,
+        1 AS sort_order -- 子部门数据排在后面
+        FROM system_dept d
+        LEFT JOIN rq_iot_opeation_fill_order o
+        ON o.deleted = 0
+        <if test="createTime != null and createTime.length > 0">
+            <choose>
+                <when test="createTime.length == 1">
+                    AND o.create_time = #{createTime[0],typeHandler=org.apache.ibatis.type.LocalDateTimeTypeHandler}
+                </when>
+                <otherwise>
+                    AND o.create_time BETWEEN #{createTime[0],typeHandler=org.apache.ibatis.type.LocalDateTimeTypeHandler} AND #{createTime[1],typeHandler=org.apache.ibatis.type.LocalDateTimeTypeHandler}
+                </otherwise>
+            </choose>
+        </if>
+        AND o.dept_id IN (
+        SELECT id FROM system_dept WHERE id = d.id -- 子部门自身
+        UNION ALL
+        SELECT id FROM system_dept WHERE parent_id = d.id -- 子部门的一级子部门
+        UNION ALL
+        SELECT id FROM system_dept WHERE parent_id IN (SELECT id FROM system_dept WHERE parent_id = d.id) -- 子部门的二级子部门
+        UNION ALL
+        SELECT id FROM system_dept WHERE parent_id IN (SELECT id FROM system_dept WHERE parent_id IN (SELECT id FROM system_dept WHERE parent_id = d.id)) -- 子部门的三级子部门
+        UNION ALL
+        SELECT id FROM system_dept WHERE parent_id IN (SELECT id FROM system_dept WHERE parent_id IN (SELECT id FROM system_dept WHERE parent_id IN (SELECT id FROM system_dept WHERE parent_id = d.id))) -- 子部门的四级子部门
+        )
+        WHERE d.parent_id = #{deptId} -- 只查询直接子部门
+        AND d.deleted = 0 -- 排除已删除的部门
+        GROUP BY d.id, d.name
+        HAVING COUNT(o.id) > 0 -- 只显示有数据的部门
+        ) t
+        ORDER BY sort_order, dept_id;
+
+    </select>
+
 </mapper>