lipenghui пре 4 дана
родитељ
комит
be0758c561

+ 57 - 3
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/stat/IotReportOrderController.java

@@ -1,12 +1,20 @@
 package cn.iocoder.yudao.module.pms.controller.admin.stat;
 
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
 import cn.iocoder.yudao.module.pms.controller.admin.maintain.vo.IotMaintainPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.stat.vo.OrderVo;
-import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO;
+import cn.iocoder.yudao.module.pms.dal.mysql.inspect.IotInspectOrderDeviceMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.inspect.IotInspectOrderMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotopeationfill.IotOpeationFillMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.maintain.IotMaintainMapper;
+import cn.iocoder.yudao.module.system.api.dept.DeptApi;
+import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
+import cn.iocoder.yudao.module.system.service.dept.DeptService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.google.common.collect.ImmutableMap;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -19,6 +27,12 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.annotation.security.PermitAll;
 import javax.validation.Valid;
 import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import java.util.StringJoiner;
+import java.util.stream.Collectors;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 
 @Tag(name = "报表所有工单接口")
 @RestController
@@ -30,11 +44,51 @@ public class IotReportOrderController {
     private final IotMaintainMapper iotMaintainMapper;
     private final IotInspectOrderMapper iotInspectOrderMapper;
     private final IotOpeationFillMapper iotOpeationFillMapper;
+    private final DeptUtil deptUtil;
+    private final DeptService deptService;
+    private final DeptApi deptApi;
+    private final IotInspectOrderDeviceMapper iotInspectOrderDeviceMapper;
 
     @Operation(summary = "各工单状态数量统计")
     @GetMapping("/number")
     public CommonResult<ImmutableMap> getOrderStat(@Valid IotMaintainPageReqVO pageReqVO) {
-        List<OrderVo> orderVos = iotMaintainMapper.selectStatusNumber(pageReqVO);
-        return null;
+        List<OrderVo> maintains = iotMaintainMapper.selectStatusNumber(pageReqVO);
+        List<OrderVo> inspects = iotInspectOrderMapper.selectStatusNumber(pageReqVO);
+        List<OrderVo> operations = iotOpeationFillMapper.selectStatusNumber(pageReqVO);
+        return CommonResult.success(ImmutableMap.of("wx", maintains, "xj", inspects, "yx", operations));
+    }
+
+
+    @Operation(summary = "各工单统计")
+    @GetMapping("/page")
+    public CommonResult<PageResult<OrderVo>> getOrderPage(@Valid IotMaintainPageReqVO pageReqVO) {
+        Set<Long> ids;
+        if (Objects.isNull(pageReqVO.getDeptId())){
+            Long loginUserDeptId = SecurityFrameworkUtils.getLoginUserDeptId();
+            String companyCode = deptUtil.getCompanyCode(loginUserDeptId);
+            ids = deptUtil.getDeptIds(companyCode);
+        } else {
+            ids = deptService.getChildDeptIdListFromCache(pageReqVO.getDeptId());
+            ids.add(pageReqVO.getDeptId());
+        }
+        pageReqVO.setDeptIds(ids);
+        IPage<OrderVo> allOrder = iotMaintainMapper.getAllOrder(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO);
+        PageResult<OrderVo> result = new PageResult<>(allOrder.getRecords(), allOrder.getTotal());
+        List<OrderVo> collect = result.getList().stream().map(e -> {
+            if ("巡检工单".equals(e.getType())){
+                String deviceInfo = iotInspectOrderDeviceMapper.getDeviceInfo(e.getId());
+                e.setDevice(deviceInfo);
+            } else if ("运行记录".equals(e.getType())) {
+                List<IotOpeationFillDO> orderId = iotOpeationFillMapper.selectList("order_id", e.getId());
+                StringJoiner joiner = new StringJoiner(", ");
+                for (IotOpeationFillDO fillDO : orderId) {
+                    joiner.add(fillDO.getDeviceCode() + "/" + fillDO.getDeviceName());
+                }
+                e.setDevice(joiner.toString());
+            }
+            return e;
+        }).collect(Collectors.toList());
+        return success(new PageResult<>(collect, allOrder.getTotal()));
+
     }
 }

+ 6 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/stat/vo/OrderVo.java

@@ -15,5 +15,11 @@ public class OrderVo extends PageParam {
     private String person;
     private String type;
     private String createTime;
+    private String company;
+    private String project;
+    private String deviceInfo;
+    private Long deptId;
+    private String deptName;
+    private String device;
     private Long num;
 }

+ 5 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/inspect/IotInspectOrderMapper.java

@@ -4,12 +4,15 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.module.pms.controller.admin.inspect.order.vo.IotInspectOrderPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.maintain.vo.IotMaintainPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.stat.vo.OrderVo;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDevicePageReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.inspect.IotInspectOrderDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotcountdata.IotCountDataDO;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.Collection;
 import java.util.List;
@@ -78,4 +81,6 @@ public interface IotInspectOrderMapper extends BaseMapperX<IotInspectOrderDO> {
                 .inIfPresent(IotInspectOrderDO::getDeptId, ids)
         );
     }
+
+    List<OrderVo> selectStatusNumber(@Param("reqVO") IotMaintainPageReqVO reqVO);
 }

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

@@ -6,6 +6,8 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmodeltemplateattrs.vo.IotModelTemplateAttrsRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.*;
+import cn.iocoder.yudao.module.pms.controller.admin.maintain.vo.IotMaintainPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.stat.vo.OrderVo;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.DeviceVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
@@ -336,4 +338,6 @@ public interface IotOpeationFillMapper extends BaseMapperX<IotOpeationFillDO> {
     @TenantIgnore
     IotDeviceRunLogDO getUserId(IotDeviceRunLogDO runLogDO);
 
+    @TenantIgnore
+    List<OrderVo> selectStatusNumber(@Param("reqVO") IotMaintainPageReqVO reqVO);
 }

+ 1 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/maintain/IotMaintainMapper.java

@@ -95,4 +95,5 @@ public interface IotMaintainMapper extends BaseMapperX<IotMaintainDO> {
     }
 
     List<OrderVo> selectStatusNumber(@Param("reqVO") IotMaintainPageReqVO reqVO);
+    IPage<OrderVo> getAllOrder(IPage<IotMaintainPageReqVO> page, @Param("reqVO") IotMaintainPageReqVO reqVO);
 }

+ 31 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotInspectOrderMapper.xml

@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.iocoder.yudao.module.pms.dal.mysql.inspect.IotInspectOrderMapper">
+
+    <!--
+        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
+        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
+        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
+        文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
+     -->
+    <select id="selectStatusNumber" parameterType="cn.iocoder.yudao.module.pms.controller.admin.maintain.vo.IotMaintainPageReqVO"
+            resultType="cn.iocoder.yudao.module.pms.controller.admin.stat.vo.OrderVo">
+        select status,count(status) as num from rq_iot_inspect_order a
+        <where>
+            <if test="reqVO.createTime[0] != null">
+                AND a.create_time &gt;= #{reqVO.createTime[0]}
+            </if>
+            <if test="reqVO.createTime.length > 1 and reqVO.createTime[1] != null">
+                AND a.create_time &lt;= #{reqVO.createTime[1]}
+            </if>
+            <if test="reqVO.deptIds != null and reqVO.deptIds.size &gt; 0">
+                AND a.dept_id IN
+                <foreach collection="reqVO.deptIds" index="index" item="key" open="(" separator="," close=")">
+                    #{key}
+                </foreach>
+            </if>
+        </where>
+
+        group by status
+    </select>
+</mapper>

+ 153 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotMaintainMapper.xml

@@ -119,4 +119,157 @@
 
         group by status
     </select>
+    <select id="getAllOrder" parameterType="cn.iocoder.yudao.module.pms.controller.admin.maintain.vo.IotMaintainPageReqVO"
+            resultType="cn.iocoder.yudao.module.pms.controller.admin.stat.vo.OrderVo">
+select * from (
+        select a.id,'维修工单' as type, a.create_time as createTime,
+        CASE
+        WHEN a.status = 'todo' THEN '未完成'
+        WHEN a.status = 'finished' THEN '已完成'
+        WHEN a.status = 'ignore' THEN '忽略'
+        ELSE '' -- 兼容其他未知状态值
+        END AS status,concat(a.device_code,'|',a.device_name) as device, a.dept_id as deptId,
+        CASE
+        WHEN d.type = 1 THEN COALESCE(d.`name`, '')
+        WHEN d.type = 2 THEN COALESCE(p1.`name`, '')
+        WHEN d.type = 3 THEN COALESCE(p2.`name`, '')
+        ELSE ''
+        END AS company,
+        -- 按type规则填充project字段
+        CASE
+        WHEN d.type = 2 THEN COALESCE(d.`name`, '')
+        WHEN d.type = 3 THEN COALESCE(p1.`name`, '')
+        ELSE ''
+        END AS project,
+        -- 按type规则填充deptName字段(仅type=3时有值)
+        CASE
+        WHEN d.type = 3 THEN COALESCE(d.`name`, '')
+        ELSE ''
+        END AS deptName
+        from rq_iot_maintain a
+        -- 左关联当前部门(避免主表数据丢失)
+        LEFT JOIN system_dept d ON a.dept_id = d.id
+        -- 左关联父级部门(type=2/3时用)
+        LEFT JOIN system_dept p1 ON d.parent_id = p1.id
+        -- 左关联祖父级部门(type=3时用)
+        LEFT JOIN system_dept p2 ON p1.parent_id = p2.id
+        <where>
+            <if test="reqVO.createTime[0] != null">
+                AND a.create_time &gt;= #{reqVO.createTime[0]}
+            </if>
+            <if test="reqVO.createTime.length > 1 and reqVO.createTime[1] != null">
+                AND a.create_time &lt;= #{reqVO.createTime[1]}
+            </if>
+            <if test="reqVO.deptIds != null and reqVO.deptIds.size &gt; 0">
+                AND a.dept_id IN
+                <foreach collection="reqVO.deptIds" index="index" item="key" open="(" separator="," close=")">
+                    #{key}
+                </foreach>
+            </if>
+        </where>
+        UNION ALL
+        select b.id,'巡检工单' as type, b.create_time as createTime,
+        CASE
+        WHEN b.status = 'todo' THEN '未完成'
+        WHEN b.status = 'finished' THEN '已完成'
+        WHEN b.status = 'ignore' THEN '忽略'
+        ELSE '' -- 兼容其他未知状态值
+        END AS status, '' as device,b.dept_id as deptId,
+        CASE
+        WHEN d.type = 1 THEN COALESCE(d.`name`, '')
+        WHEN d.type = 2 THEN COALESCE(p1.`name`, '')
+        WHEN d.type = 3 THEN COALESCE(p2.`name`, '')
+        ELSE ''
+        END AS company,
+        -- 按type规则填充project字段
+        CASE
+        WHEN d.type = 2 THEN COALESCE(d.`name`, '')
+        WHEN d.type = 3 THEN COALESCE(p1.`name`, '')
+        ELSE ''
+        END AS project,
+        -- 按type规则填充deptName字段(仅type=3时有值)
+        CASE
+        WHEN d.type = 3 THEN COALESCE(d.`name`, '')
+        ELSE ''
+        END AS deptName
+        from rq_iot_inspect_order b
+        -- 左关联当前部门(避免主表数据丢失)
+        LEFT JOIN system_dept d ON b.dept_id = d.id
+        -- 左关联父级部门(type=2/3时用)
+        LEFT JOIN system_dept p1 ON d.parent_id = p1.id
+        -- 左关联祖父级部门(type=3时用)
+        LEFT JOIN system_dept p2 ON p1.parent_id = p2.id
+        <where>
+            <if test="reqVO.createTime[0] != null">
+                AND b.create_time &gt;= #{reqVO.createTime[0]}
+            </if>
+            <if test="reqVO.createTime.length > 1 and reqVO.createTime[1] != null">
+                AND b.create_time &lt;= #{reqVO.createTime[1]}
+            </if>
+            <if test="reqVO.deptIds != null and reqVO.deptIds.size &gt; 0">
+                AND b.dept_id IN
+                <foreach collection="reqVO.deptIds" index="index" item="key" open="(" separator="," close=")">
+                    #{key}
+                </foreach>
+            </if>
+        </where>
+        union all
+        SELECT
+            c.id,
+        '运行记录' AS type,
+        c.create_time AS createTime,
+        -- 核心优化:status 数值转中文描述
+        CASE
+        WHEN c.order_status = 0 THEN '未完成'
+        WHEN c.order_status = 1 THEN '已完成'
+        WHEN c.order_status = 2 THEN '填写中'
+        ELSE '' -- 兼容其他未知状态值
+        END AS status,
+        '' AS device,
+        c.dept_id AS deptId,
+        -- 按type规则填充company字段
+        CASE
+        WHEN d.type = 1 THEN COALESCE(d.`name`, '')
+        WHEN d.type = 2 THEN COALESCE(p1.`name`, '')
+        WHEN d.type = 3 THEN COALESCE(p2.`name`, '')
+        ELSE ''
+        END AS company,
+        -- 按type规则填充project字段
+        CASE
+        WHEN d.type = 2 THEN COALESCE(d.`name`, '')
+        WHEN d.type = 3 THEN COALESCE(p1.`name`, '')
+        ELSE ''
+        END AS project,
+        -- 按type规则填充deptName字段(仅type=3时有值)
+        CASE
+        WHEN d.type = 3 THEN COALESCE(d.`name`, '')
+        ELSE ''
+        END AS deptName
+        FROM rq_iot_opeation_fill_order c
+        -- 左关联当前部门(避免主表数据丢失)
+        LEFT JOIN system_dept d ON c.dept_id = d.id
+        -- 左关联父级部门(type=2/3时用)
+        LEFT JOIN system_dept p1 ON d.parent_id = p1.id
+        -- 左关联祖父级部门(type=3时用)
+        LEFT JOIN system_dept p2 ON p1.parent_id = p2.id
+        <where>
+            <if test="reqVO.createTime[0] != null">
+                AND c.create_time &gt;= #{reqVO.createTime[0]}
+            </if>
+            <if test="reqVO.createTime.length > 1 and reqVO.createTime[1] != null">
+                AND c.create_time &lt;= #{reqVO.createTime[1]}
+            </if>
+            <if test="reqVO.deptIds != null and reqVO.deptIds.size &gt; 0">
+                AND c.dept_id IN
+                <foreach collection="reqVO.deptIds" index="index" item="key" open="(" separator="," close=")">
+                    #{key}
+                </foreach>
+            </if>
+        </where>) fin
+        <where>
+            <if test="reqVO.type != null">
+                AND fin.type= #{reqVO.type}
+            </if>
+        </where>
+    </select>
 </mapper>

+ 20 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotOpeationFillMapper.xml

@@ -1610,7 +1610,26 @@
             limit 1
     </select>
 
-    
+    <select id="selectStatusNumber" parameterType="cn.iocoder.yudao.module.pms.controller.admin.maintain.vo.IotMaintainPageReqVO"
+            resultType="cn.iocoder.yudao.module.pms.controller.admin.stat.vo.OrderVo">
+        select order_status as status,count(order_status) as num from rq_iot_opeation_fill_order a
+        <where>
+            <if test="reqVO.createTime[0] != null">
+                AND a.create_time &gt;= #{reqVO.createTime[0]}
+            </if>
+            <if test="reqVO.createTime.length > 1 and reqVO.createTime[1] != null">
+                AND a.create_time &lt;= #{reqVO.createTime[1]}
+            </if>
+            <if test="reqVO.deptIds != null and reqVO.deptIds.size &gt; 0">
+                AND a.dept_id IN
+                <foreach collection="reqVO.deptIds" index="index" item="key" open="(" separator="," close=")">
+                    #{key}
+                </foreach>
+            </if>
+        </where>
+
+        group by order_status
+    </select>
 
 
 </mapper>