mitao
2024-12-27 9b5c30e801eb106ee953b46172ed57897c636f92
统计分析报表接口
1 文件已重命名
27个文件已修改
21个文件已添加
1865 ■■■■■ 已修改文件
medicalWaste-admin/src/main/java/com/sinata/web/controller/applet/MwDisposalHandleRecordController.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/MwWarningConfigController.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/StaticsController.java 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/system/SysDictDataController.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-admin/src/test/java/MybatisPlusGeneraotr.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/domain/MedicalWasteStaticsVO.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/domain/MwCollectRecord.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/domain/MwDisposalHandleRecord.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/domain/MwDisposalRecordItem.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/domain/dto/MwWarningConfigDTO.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/domain/dto/MwWarningConfigItemDTO.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/domain/query/DisposalReportQuery.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/domain/query/HospitalReportQuery.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/domain/query/MwBusinessDeviceQuery.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/domain/query/TransformQuery.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/domain/vo/DepartmentReportItemVO.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/domain/vo/DepartmentReportVO.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwCollectRecordVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwDisposalRecordItemVO.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwDisposalRecordReportVO.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwMedicalWasteBoxVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwWarningConfigItemVO.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwWarningConfigVO.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/domain/vo/TransformVO.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/enums/WarningConfigTypeEnum.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/mapper/MwCheckoutRecordMapper.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/mapper/MwCollectRecordMapper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/mapper/MwDisposalHandleRecordMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/mapper/MwDisposalRecordMapper.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/service/ISysDictDataService.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/service/MwCheckoutRecordService.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/service/MwCollectRecordService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/service/MwDisposalHandleRecordService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/service/MwDisposalRecordService.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/service/MwWarningConfigService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/service/biz/StaticsService.java 495 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwCheckoutRecordServiceImpl.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwCollectRecordServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwDisposalHandleRecordServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwDisposalRecordServiceImpl.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwMicroEquipmentRecordServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwWarningConfigServiceImpl.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/java/com/sinata/system/service/impl/SysDictDataServiceImpl.java 56 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/resources/mapper/system/MwCheckoutRecordMapper.xml 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/resources/mapper/system/MwCollectRecordMapper.xml 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/resources/mapper/system/MwDisposalHandleRecordMapper.xml 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/resources/mapper/system/MwDisposalRecordMapper.xml 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/resources/mapper/system/SysAgreementMapper.xml 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-system/src/main/resources/mapper/system/SysDepartmentMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
medicalWaste-admin/src/main/java/com/sinata/web/controller/applet/MwDisposalHandleRecordController.java
New file
@@ -0,0 +1,18 @@
package com.sinata.web.controller.applet;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author mitao
 * @since 2024-12-27
 */
@RestController
@RequestMapping("/applet/mwDisposalHandleRecord")
public class MwDisposalHandleRecordController {
}
medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/MwWarningConfigController.java
@@ -1,7 +1,22 @@
package com.sinata.web.controller.backend;
import com.sinata.common.core.domain.R;
import com.sinata.system.domain.dto.MwWarningConfigDTO;
import com.sinata.system.domain.vo.MwWarningConfigVO;
import com.sinata.system.service.MwWarningConfigService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
/**
 * <p>
@@ -11,8 +26,36 @@
 * @author mitao
 * @since 2024-12-02
 */
@Validated
@RestController
@Api(tags = {"预警配置相关接口"})
@RequiredArgsConstructor
@RequestMapping("/backend/mwWarningConfig")
public class MwWarningConfigController {
    private final MwWarningConfigService mwWarningConfigService;
    /**
     * 保存设置
     *
     * @param dto
     * @return
     */
    @ApiOperation("保存设置")
    @PostMapping("/save")
    public R<?> save(@Valid @RequestBody MwWarningConfigDTO dto) {
        mwWarningConfigService.saveConfig(dto);
        return R.ok();
    }
    /**
     * 根据类型获取配置信息
     *
     * @param type
     * @return
     */
    @ApiOperation("根据类型获取配置信息")
    @GetMapping("/{type}")
    public R<MwWarningConfigVO> getByType(@ApiParam(name = "type", value = "配置类型", required = true) @PathVariable("type") Integer type) {
        return R.ok(mwWarningConfigService.getByType(type));
    }
}
medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/StaticsController.java
New file
@@ -0,0 +1,142 @@
package com.sinata.web.controller.backend;
import com.sinata.common.core.domain.R;
import com.sinata.system.domain.MedicalWasteStaticsVO;
import com.sinata.system.domain.SysDepartment;
import com.sinata.system.domain.query.DisposalReportQuery;
import com.sinata.system.domain.query.HospitalReportQuery;
import com.sinata.system.domain.query.TransformQuery;
import com.sinata.system.domain.vo.DepartmentReportVO;
import com.sinata.system.service.biz.StaticsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
import java.io.IOException;
import java.util.List;
/**
 * @author mitao
 * @date 2024/12/25
 */
@RestController
@Api(tags = {"统计分析相关接口"})
@RequiredArgsConstructor
@RequestMapping("/statics")
public class StaticsController {
    private final StaticsService staticsService;
    /**
     * 机构分布-获取机构列表
     *
     * @param type 1:全部 2:医院 3:处置单位
     * @return
     */
    //@ApiOperation("机构分布-获取机构列表 1:全部 2:医院 3:处置单位")
    @GetMapping(value = "/departmentList/{type}")
    public R<List<SysDepartment>> departmentList(@ApiParam(name = "type", value = "机构类型", required = true) @PathVariable(value = "type") Integer type) {
        return R.ok(staticsService.departmentList(type));
    }
    //@ApiOperation("医疗监管-医废统计")
    @GetMapping("/medicalWaste")
    public R<MedicalWasteStaticsVO> medicalWaste() {
        return R.ok(staticsService.medicalWaste());
    }
    /**
     * 医院报表
     *
     * @param query
     * @return
     */
    @ApiOperation("医院报表")
    @PostMapping("/hospitalReport")
    public R<DepartmentReportVO> hospitalReport(@Valid @RequestBody HospitalReportQuery query) {
        return R.ok(staticsService.hospitalReport(query));
    }
    /**
     * 医院报表-导出
     *
     * @param query
     */
    @ApiOperation("医院报表-导出")
    @PostMapping("/hospitalReportExport")
    public void hospitalReportExport(@Valid @RequestBody HospitalReportQuery query) {
        try {
            staticsService.hospitalReportExport(query);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    /**
     * 转运联单
     *
     * @param query
     * @return
     */
    @ApiOperation("转运联单")
    @PostMapping("/transformList")
    public R<DepartmentReportVO> transformList(@Valid @RequestBody TransformQuery query) {
        return R.ok(staticsService.transformList(query));
    }
    /**
     * 转运联单导出
     *
     * @param query
     */
    @ApiOperation("转运联单导出")
    @PostMapping("/transformListExport")
    public void transformListExport(@Valid @RequestBody TransformQuery query) {
        try {
            staticsService.transformListExport(query);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    /**
     * 处置报表
     *
     * @param query
     * @return
     */
    @ApiOperation("处置报表")
    @PostMapping("/disposalReport")
    public R<DepartmentReportVO> disposalReport(@Valid @RequestBody DisposalReportQuery query) {
        return R.ok(staticsService.disposalReport(query));
    }
    /**
     * 处置报表导出
     *
     * @param query
     * @return
     */
    @ApiOperation("处置报表导出")
    @PostMapping("/disposalReportExport")
    public void disposalReportExport(@Valid @RequestBody DisposalReportQuery query) {
        try {
            staticsService.disposalReportExport(query);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    @ApiOperation("监管报表")
    @PostMapping("/regulationReport")
    public R<DepartmentReportVO> regulationReport(@Valid @RequestBody DisposalReportQuery query) {
        return R.ok(staticsService.regulationReport(query));
    }
}
medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/system/SysDictDataController.java
@@ -88,6 +88,50 @@
        dictDataService.removeById(dictCode);
        return R.ok();
    }
    /**
     * 医废类型列表
     *
     * @return
     */
    @ApiOperation("医废类型列表")
    @GetMapping("/medicalWasteTypeList")
    public R<List<SysDictDataVO>> medicalWasteTypeList() {
        return R.ok(dictDataService.medicalWasteTypeList());
    }
    /**
     * 器具类型列表
     *
     * @return
     */
    @ApiOperation("器具类型列表")
    @GetMapping("/equipmentTypeList")
    public R<List<SysDictDataVO>> equipmentTypeList() {
        return R.ok(dictDataService.equipmentTypeList());
    }
    /**
     * 规章制度类型列表
     *
     * @return
     */
    @ApiOperation("规章制度类型列表")
    @GetMapping("/regulationsTypeList")
    public R<List<SysDictDataVO>> regulationsTypeList() {
        return R.ok(dictDataService.regulationsTypeList());
    }
    /**
     * 作业类型
     *
     * @return
     */
    @ApiOperation("作业类型")
    @GetMapping("/workTypeList")
    public R<List<SysDictDataVO>> workTypeList() {
        return R.ok(dictDataService.workTypeList());
    }
    @PreAuthorize("@ss.hasPermi('system:dict:list')")
    @GetMapping("/list")
    public TableDataInfo list(SysDictData dictData)
medicalWaste-admin/src/test/java/MybatisPlusGeneraotr.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
import com.sinata.common.entity.BaseModel;
import org.junit.jupiter.api.Test;
public class MybatisPlusGeneraotr {
@@ -47,7 +48,7 @@
                            builder
                                    // 在这里添加数据库表名
                                    //.addInclude("MW_BOX")
                                    .addInclude("SYS_AGREEMENT")// 设置需要生成的表名,多个表之间可以用逗号隔开
                                    .addInclude("MW_DISPOSAL_HANDLE_RECORD")// 设置需要生成的表名,多个表之间可以用逗号隔开
                                    // .addExclude("BBZQ_USER","BBZQ_USER_LOG")
                                    .controllerBuilder().enableRestStyle()         // controller配置策略
                                    .serviceBuilder().formatServiceFileName("%sService")            // service配置策略
@@ -56,7 +57,7 @@
                                    //.logicDeleteColumnName("del_flag")                  // 逻辑删除字段名
                                    .naming(NamingStrategy.underline_to_camel)            // 数据库表映射到实体的命名策略,下划线转驼峰
                                    .columnNaming(NamingStrategy.underline_to_camel)      // 数据库表字段映射的命名策略,下划线转驼峰
                                    //.superClass(BaseModel.class)
                                    .superClass(BaseModel.class)
                                    //.addTableFills(    // 添加表字段填充,"create_time"自动填充为插入时间,"update_time"自动填充为修改时间
                                    //        new Column("create_time", FieldFill.INSERT),
                                    //        new Column("create_by", FieldFill.INSERT),
medicalWaste-system/src/main/java/com/sinata/system/domain/MedicalWasteStaticsVO.java
New file
@@ -0,0 +1,23 @@
package com.sinata.system.domain;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
 * @author mitao
 * @date 2024/12/25
 */
@Data
@ApiModel("医废统计视图对象")
public class MedicalWasteStaticsVO {
    @ApiModelProperty("今日收集-重量")
    private BigDecimal todayCollectWeight;
    @ApiModelProperty("今日收集-袋数")
    private Integer todayCollectBagNum;
}
medicalWaste-system/src/main/java/com/sinata/system/domain/MwCollectRecord.java
@@ -59,7 +59,7 @@
    @ApiModelProperty("医废类型(数据字典id)")
    @TableField("WASTE_TYPE")
    private Integer wasteType;
    private Long wasteType;
    @ApiModelProperty("医废类型名称(冗余)")
    @TableField("WASTE_TYPE_STR")
@@ -93,5 +93,9 @@
    @TableField("COLLECT_TIME")
    private Date collectTime;
    @ApiModelProperty("处置记录id")
    @TableField("DISPOSAL_HANDLE_RECORD_ID")
    private Long disposalHandleRecordId;
}
medicalWaste-system/src/main/java/com/sinata/system/domain/MwDisposalHandleRecord.java
New file
@@ -0,0 +1,56 @@
package com.sinata.system.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.sinata.common.entity.BaseModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.util.Date;
/**
 * <p>
 *
 * </p>
 *
 * @author mitao
 * @since 2024-12-27
 */
@Getter
@Setter
@TableName("MW_DISPOSAL_HANDLE_RECORD")
@ApiModel(value = "MwDisposalHandleRecord对象", description = "处置记录")
public class MwDisposalHandleRecord extends BaseModel {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("主键ID")
    @TableId(value = "ID", type = IdType.AUTO)
    private Long id;
    @ApiModelProperty("区域ID(处置单位ID)")
    @TableField("DEPARTMENT_ID")
    private Long departmentId;
    @ApiModelProperty("处置单位名称")
    @TableField("DISPOSAL_UNIT_NAME")
    private String disposalUnitName;
    @ApiModelProperty("处置时间")
    @TableField("DISPOSAL_TIME")
    private Date disposalTime;
    @ApiModelProperty("处置用户ID")
    @TableField("DISPOSAL_USER_ID")
    private Long disposalUserId;
    @ApiModelProperty("处置接收记录ID")
    @TableField("DISPOSAL_RECORD_ID")
    private Long disposalRecordId;
}
medicalWaste-system/src/main/java/com/sinata/system/domain/MwDisposalRecordItem.java
@@ -9,6 +9,8 @@
import lombok.Getter;
import lombok.Setter;
import java.util.Date;
/**
 * <p>
 * 处置接收记录项
@@ -35,5 +37,17 @@
    @TableField("DISPOSAL_RECORD_ID")
    private Long disposalRecordId;
    @ApiModelProperty("是否处置 1:是 0:否")
    @TableField("DISPOSAL_FLAG")
    private Integer disposalFlag;
    @ApiModelProperty("处置时间")
    @TableField("DISPOSAL_TIME")
    private Date disposalTime;
    @ApiModelProperty("处置人id")
    @TableField("DISPOSAL_USER_ID")
    private Long disposalUserId;
}
medicalWaste-system/src/main/java/com/sinata/system/domain/dto/MwWarningConfigDTO.java
New file
@@ -0,0 +1,38 @@
package com.sinata.system.domain.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
 * @author mitao
 * @date 2024/12/25
 */
@Data
@ApiModel("预警配置数据传输对象")
public class MwWarningConfigDTO {
    @ApiModelProperty("预警配置id")
    private Long id;
    @ApiModelProperty("预警类型 1:医疗废物预警 2:合同预警 3:人员预警 4:职业防护预警 5:入库暂存间存储容量预警")
    @NotNull(message = "预警类型不能为空")
    private Integer type;
    @ApiModelProperty("配置值")
    private String value;
    @ApiModelProperty("人员是否需要健康证明 1:是 0:否")
    private Integer healthFlag;
    @ApiModelProperty("人员是否需要疫苗记录证明 1:是 0:否")
    private Integer vaccineFlag;
    @ApiModelProperty("防护器具使用预警 1:是 0:否")
    private Integer protectionFlag;
    @ApiModelProperty(value = "预警配置列表", notes = "医疗废物预警、入库暂存间存储容量预警")
    private List<MwWarningConfigItemDTO> warningConfigItemList;
}
medicalWaste-system/src/main/java/com/sinata/system/domain/dto/MwWarningConfigItemDTO.java
New file
@@ -0,0 +1,29 @@
package com.sinata.system.domain.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author mitao
 * @date 2024/12/25
 */
@Data
@ApiModel("预警配置项数据传输对象")
public class MwWarningConfigItemDTO {
    @ApiModelProperty("预警配置项id")
    private Long id;
    @ApiModelProperty("预警配置id")
    private Long configId;
    @ApiModelProperty("医废类型")
    private Long wasteType;
    @ApiModelProperty("预警值")
    private Integer value;
    @ApiModelProperty("提示内容")
    private String promptContent;
}
medicalWaste-system/src/main/java/com/sinata/system/domain/query/DisposalReportQuery.java
New file
@@ -0,0 +1,38 @@
package com.sinata.system.domain.query;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.Date;
import java.util.List;
/**
 * @author mitao
 * @date 2024/12/26
 */
@Data
@ApiModel("处置报表查询数据传输对象")
public class DisposalReportQuery {
    @ApiModelProperty("部门id")
    @NotNull(message = "部门id不能为空")
    private Long departmentId;
    @ApiModelProperty("统计方式(1=日期统计,2=月度统计,3=年度统计)")
    @NotNull(message = "统计方式不能为空")
    private Integer dateType;
    @ApiModelProperty("开始时间")
    @NotNull(message = "开始时间不能为空")
    private Date startTime;
    @ApiModelProperty("结束时间")
    @NotNull(message = "结束时间不能为空")
    private Date endTime;
    @ApiModelProperty(value = "医废类型id列表")
    @NotNull(message = "医废类型id列表不能为空")
    private List<Long> wasteTypeCodeList;
}
medicalWaste-system/src/main/java/com/sinata/system/domain/query/HospitalReportQuery.java
New file
@@ -0,0 +1,37 @@
package com.sinata.system.domain.query;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.Date;
/**
 * @author mitao
 * @date 2024/12/25
 */
@Data
@ApiModel("医院报表查询数据传输对象")
public class HospitalReportQuery {
    @ApiModelProperty("医院id")
    @NotNull(message = "医院id不能为空")
    private Long departmentId;
    @ApiModelProperty("统计方式(1=日期统计,2=月度统计,3=年度统计)")
    @NotNull(message = "统计方式不能为空")
    private Integer dateType;
    @ApiModelProperty("开始时间")
    @NotNull(message = "开始时间不能为空")
    private Date startTime;
    @ApiModelProperty("结束时间")
    @NotNull(message = "结束时间不能为空")
    private Date endTime;
    @ApiModelProperty("统计环节 1:入库 2:出库")
    @NotNull(message = "统计环节不能为空")
    private Integer reportType;
}
medicalWaste-system/src/main/java/com/sinata/system/domain/query/MwBusinessDeviceQuery.java
@@ -23,7 +23,6 @@
    @ApiModelProperty("设备编号")
    private String deviceNumber;
    @ApiModelProperty("设备名称")
    private String deviceName;
medicalWaste-system/src/main/java/com/sinata/system/domain/query/TransformQuery.java
New file
@@ -0,0 +1,34 @@
package com.sinata.system.domain.query;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.Date;
import java.util.List;
/**
 * @author mitao
 * @date 2024/12/25
 */
@Data
@ApiModel("转运联单查询数据传输对象")
public class TransformQuery {
    @ApiModelProperty("处置单位id")
    @NotNull(message = "处置单位id不能为空")
    private Long departmentId;
    @ApiModelProperty("开始时间")
    @NotNull(message = "开始时间不能为空")
    private Date startTime;
    @ApiModelProperty("结束时间")
    @NotNull(message = "结束时间不能为空")
    private Date endTime;
    @ApiModelProperty(value = "医废类型id列表")
    @NotNull(message = "医废类型id列表不能为空")
    private List<Long> wasteTypeCodeList;
}
medicalWaste-system/src/main/java/com/sinata/system/domain/vo/DepartmentReportItemVO.java
New file
@@ -0,0 +1,35 @@
package com.sinata.system.domain.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
@Data
@ApiModel
public class DepartmentReportItemVO {
    private Integer key;
    @ApiModelProperty("名称")
    private String name;
    @ApiModelProperty("数据")
    private List<BigDecimal> data;
    @ApiModelProperty("是否超时")
    private String overTimeFlag;
    @ApiModelProperty("机构人员签字")
    private String hospitalSignature;
    @ApiModelProperty("运输人员签字")
    private String driverName;
    @ApiModelProperty("交接时间")
    private Date handoverTime;
}
medicalWaste-system/src/main/java/com/sinata/system/domain/vo/DepartmentReportVO.java
New file
@@ -0,0 +1,19 @@
package com.sinata.system.domain.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel("医院报表视图对象")
public class DepartmentReportVO {
    @ApiModelProperty("类别")
    private List<String> legend;
    @ApiModelProperty("列表")
    private List<DepartmentReportItemVO> list;
}
medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwCollectRecordVO.java
@@ -41,7 +41,7 @@
    private String boxNumber;
    @ApiModelProperty("医废类型(数据字典id)")
    private Integer wasteType;
    private Long wasteType;
    @ApiModelProperty("医废类型名称")
    @ExcelProperty(value = "医废类型", index = 5)
medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwDisposalRecordItemVO.java
@@ -13,6 +13,7 @@
@Data
@ApiModel("处置详情视图对象")
public class MwDisposalRecordItemVO {
    @ApiModelProperty("箱号")
    private String boxNumber;
medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwDisposalRecordReportVO.java
New file
@@ -0,0 +1,37 @@
package com.sinata.system.domain.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
 * @author mitao
 * @date 2024/12/26
 */
@Data
@ApiModel("处置报表视图对象")
public class MwDisposalRecordReportVO {
    @ApiModelProperty("医废收集记录id")
    private Long id;
    @ApiModelProperty("接收时间")
    private Date receiveTime;
    @ApiModelProperty("处置时间")
    private Date disposalTime;
    @ApiModelProperty("医废类型")
    private Long wasteType;
    @ApiModelProperty("重量")
    private BigDecimal weight;
    @ApiModelProperty("医废状态 1:暂存中 2:运输中 3:已接收 4:已处置")
    private Integer status;
}
medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwMedicalWasteBoxVO.java
@@ -26,6 +26,9 @@
    @ApiModelProperty("暂存间名称")
    private String roomName;
    @ApiModelProperty("医废类型")
    private Long wasteType;
    @ApiModelProperty("医废类型名称")
    private String wasteTypeStr;
medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwWarningConfigItemVO.java
New file
@@ -0,0 +1,26 @@
package com.sinata.system.domain.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author mitao
 * @date 2024/12/25
 */
@Data
@ApiModel("预警配置项视图对象")
public class MwWarningConfigItemVO {
    @ApiModelProperty("预警配置项id")
    private Long id;
    @ApiModelProperty("医废类型")
    private Long wasteType;
    @ApiModelProperty("预警值")
    private Integer value;
    @ApiModelProperty("提示内容")
    private String promptContent;
}
medicalWaste-system/src/main/java/com/sinata/system/domain/vo/MwWarningConfigVO.java
New file
@@ -0,0 +1,37 @@
package com.sinata.system.domain.vo;
import com.sinata.system.domain.dto.MwWarningConfigItemDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * @author mitao
 * @date 2024/12/25
 */
@Data
@ApiModel("预警配置视图对象")
public class MwWarningConfigVO {
    @ApiModelProperty("预警配置id")
    private Long id;
    @ApiModelProperty("预警类型 1:医疗废物预警 2:合同预警 3:人员预警 4:职业防护预警 5:入库暂存间存储容量预警")
    private Integer type;
    @ApiModelProperty("配置值")
    private String value;
    @ApiModelProperty("人员是否需要健康证明 1:是 0:否")
    private Integer healthFlag;
    @ApiModelProperty("人员是否需要疫苗记录证明 1:是 0:否")
    private Integer vaccineFlag;
    @ApiModelProperty("防护器具使用预警 1:是 0:否")
    private Integer protectionFlag;
    @ApiModelProperty("预警配置列表")
    private List<MwWarningConfigItemVO> warningConfigItemList;
}
medicalWaste-system/src/main/java/com/sinata/system/domain/vo/TransformVO.java
New file
@@ -0,0 +1,39 @@
package com.sinata.system.domain.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
 * @author mitao
 * @date 2024/12/26
 */
@Data
@ApiModel("转移联单视图对象")
public class TransformVO {
    @ApiModelProperty("记录id")
    private Long id;
    @ApiModelProperty("医院名称")
    private String hospitalName;
    @ApiModelProperty("区域id(医院)")
    private Long departmentId;
    @ApiModelProperty("医院签名")
    private String hospitalSignature;
    @ApiModelProperty("司机姓名")
    private String driverName;
    @ApiModelProperty("交接时间")
    private Date checkoutTime;
    @ApiModelProperty("收集记录列表")
    private List<MwMedicalWasteBoxVO> collectRecordList;
}
medicalWaste-system/src/main/java/com/sinata/system/enums/WarningConfigTypeEnum.java
New file
@@ -0,0 +1,26 @@
package com.sinata.system.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum WarningConfigTypeEnum {
    MEDICAL_WASTE(1, "医疗废物预警"),
    CONTRACT(2, "合同预警"),
    STAFF(3, "人员预警"),
    PROTECTION_PERSONNEL(4, "职业防护预警"),
    STAGING_ROOM_CAPACITY(5, "入库暂存间存储容量预警");
    private final Integer code;
    private final String desc;
    public static WarningConfigTypeEnum getEnumByCode(Integer code) {
        for (WarningConfigTypeEnum e : WarningConfigTypeEnum.values()) {
            if (e.code.equals(code)) {
                return e;
            }
        }
        return null;
    }
}
medicalWaste-system/src/main/java/com/sinata/system/mapper/MwCheckoutRecordMapper.java
@@ -1,13 +1,17 @@
package com.sinata.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sinata.system.domain.MwCheckoutRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sinata.system.domain.query.CheckoutRecordQuery;
import com.sinata.system.domain.query.DisposalReportQuery;
import com.sinata.system.domain.query.MwTransitRecordQuery;
import com.sinata.system.domain.query.TransformQuery;
import com.sinata.system.domain.vo.MwCheckoutRecordVO;
import com.sinata.system.domain.vo.MwCollectRecordVO;
import com.sinata.system.domain.vo.MwMedicalWasteBoxVO;
import com.sinata.system.domain.vo.MwTransitRecordVO;
import com.sinata.system.domain.vo.TransformVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -84,4 +88,22 @@
     * @param treeCode
     */
    List<MwCheckoutRecordVO> hospitalTransitList(@Param("query") CheckoutRecordQuery query, @Param("treeCode") String treeCode);
    /**
     * 转移联单数据
     *
     * @param query
     * @param treeCode
     * @return
     */
    List<TransformVO> getCheckoutRecordList(@Param("query") TransformQuery query, @Param("treeCode") String treeCode);
    /**
     * 监管报表医疗废物转移列表
     *
     * @param query
     * @param treeCode
     * @return
     */
    List<MwCollectRecordVO> getRegulationReportList(@Param("query") DisposalReportQuery query, @Param("treeCode") String treeCode);
}
medicalWaste-system/src/main/java/com/sinata/system/mapper/MwCollectRecordMapper.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sinata.system.domain.MwCollectRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sinata.system.domain.query.DisposalReportQuery;
import com.sinata.system.domain.query.MwCollectRecordQuery;
import com.sinata.system.domain.vo.MedicalWasteProcessVO;
import com.sinata.system.domain.vo.MwCollectRecordVO;
@@ -52,4 +53,13 @@
     * @return
     */
    List<MwCollectRecordVO> getExportList(@Param("query") MwCollectRecordQuery query, @Param("treeCode") String treeCode);
    /**
     * 监管报表医疗废物产生列表
     *
     * @param query
     * @param treeCode
     * @return
     */
    List<MwCollectRecordVO> getRegulationReportList(@Param("query") DisposalReportQuery query, @Param("treeCode") String treeCode);
}
medicalWaste-system/src/main/java/com/sinata/system/mapper/MwDisposalHandleRecordMapper.java
New file
@@ -0,0 +1,18 @@
package com.sinata.system.mapper;
import com.sinata.system.domain.MwDisposalHandleRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
 * <p>
 *  Mapper 接口
 * </p>
 *
 * @author mitao
 * @since 2024-12-27
 */
@Mapper
public interface MwDisposalHandleRecordMapper extends BaseMapper<MwDisposalHandleRecord> {
}
medicalWaste-system/src/main/java/com/sinata/system/mapper/MwDisposalRecordMapper.java
@@ -3,8 +3,11 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sinata.system.domain.MwDisposalRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sinata.system.domain.query.DisposalReportQuery;
import com.sinata.system.domain.query.MwDisposalRecordQuery;
import com.sinata.system.domain.vo.MwCollectRecordVO;
import com.sinata.system.domain.vo.MwDisposalRecordItemVO;
import com.sinata.system.domain.vo.MwDisposalRecordReportVO;
import com.sinata.system.domain.vo.MwDisposalRecordVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -48,4 +51,23 @@
     * @return
     */
    Page<MwDisposalRecordItemVO> pageDetail(Page<MwDisposalRecordItemVO> page, @Param("disposalRecordId") Long disposalRecordId);
    /**
     * 处置报表
     *
     * @param query
     * @param type
     * @return
     */
    List<MwDisposalRecordReportVO> disposalReportByType(@Param("query") DisposalReportQuery query, @Param("type") Integer type);
    /**
     * 监管报表医疗废物处置列表
     *
     * @param query
     * @param treeCode
     * @return
     */
    List<MwCollectRecordVO> getRegulationReportList(@Param("query") DisposalReportQuery query, @Param("treeCode") String treeCode);
}
medicalWaste-system/src/main/java/com/sinata/system/service/ISysDictDataService.java
@@ -72,4 +72,33 @@
     * @param dto
     */
    void save(SysDictDataDTO dto);
    /**
     * 医废类型列表
     *
     * @return
     */
    List<SysDictDataVO> medicalWasteTypeList();
    /**
     * 器具类型列表
     *
     * @return
     */
    List<SysDictDataVO> equipmentTypeList();
    /**
     * 规章制度类型列表
     *
     * @return
     */
    List<SysDictDataVO> regulationsTypeList();
    /**
     * 作业类型
     *
     * @return
     */
    List<SysDictDataVO> workTypeList();
}
medicalWaste-system/src/main/java/com/sinata/system/service/MwCheckoutRecordService.java
@@ -4,14 +4,19 @@
import com.sinata.common.entity.PageDTO;
import com.sinata.system.domain.MwCheckoutRecord;
import com.sinata.system.domain.query.CheckoutRecordQuery;
import com.sinata.system.domain.query.DisposalReportQuery;
import com.sinata.system.domain.query.MwCheckoutRecordItemQuery;
import com.sinata.system.domain.query.MwTransitRecordQuery;
import com.sinata.system.domain.query.TransformQuery;
import com.sinata.system.domain.vo.MwCheckoutRecordVO;
import com.sinata.system.domain.vo.MwCollectRecordVO;
import com.sinata.system.domain.vo.MwMedicalWasteBoxVO;
import com.sinata.system.domain.vo.MwTransitRecordVO;
import com.sinata.system.domain.vo.TransformVO;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
/**
 * <p>
@@ -77,4 +82,21 @@
     * @param response
     */
    void checkoutRecordExport(CheckoutRecordQuery query, HttpServletResponse response) throws IOException;
    /**
     * 转移联单数据
     *
     * @param query
     * @param treeCode
     * @return
     */
    List<TransformVO> getCheckoutRecordList(TransformQuery query, String treeCode);
    /**
     * 监管报表医疗废物转移列表
     *
     * @param query
     * @return
     */
    List<MwCollectRecordVO> getRegulationReportList(DisposalReportQuery query);
}
medicalWaste-system/src/main/java/com/sinata/system/service/MwCollectRecordService.java
@@ -4,12 +4,14 @@
import com.sinata.common.entity.PageDTO;
import com.sinata.system.domain.MwCollectRecord;
import com.sinata.system.domain.dto.MwCollectRecordDTO;
import com.sinata.system.domain.query.DisposalReportQuery;
import com.sinata.system.domain.query.MwCollectRecordQuery;
import com.sinata.system.domain.vo.MedicalWasteProcessVO;
import com.sinata.system.domain.vo.MwCollectRecordVO;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
/**
 * <p>
@@ -51,5 +53,20 @@
     */
    MedicalWasteProcessVO getProcess(Long id);
    /**
     * 导出
     *
     * @param query
     * @param response
     * @throws IOException
     */
    void export(MwCollectRecordQuery query, HttpServletResponse response) throws IOException;
    /**
     * 监管报表医疗废物产生列表
     *
     * @param query
     * @return
     */
    List<MwCollectRecordVO> getRegulationReportList(DisposalReportQuery query);
}
medicalWaste-system/src/main/java/com/sinata/system/service/MwDisposalHandleRecordService.java
New file
@@ -0,0 +1,16 @@
package com.sinata.system.service;
import com.sinata.system.domain.MwDisposalHandleRecord;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 *  处置记录服务类
 * </p>
 *
 * @author mitao
 * @since 2024-12-27
 */
public interface MwDisposalHandleRecordService extends IService<MwDisposalHandleRecord> {
}
medicalWaste-system/src/main/java/com/sinata/system/service/MwDisposalRecordService.java
@@ -3,11 +3,16 @@
import com.sinata.common.entity.PageDTO;
import com.sinata.system.domain.MwDisposalRecord;
import com.baomidou.mybatisplus.extension.service.IService;
import com.sinata.system.domain.query.DisposalReportQuery;
import com.sinata.system.domain.query.MwDisposalRecordItemQuery;
import com.sinata.system.domain.query.MwDisposalRecordQuery;
import com.sinata.system.domain.vo.DisposalRecordStaticsVO;
import com.sinata.system.domain.vo.MwCollectRecordVO;
import com.sinata.system.domain.vo.MwDisposalRecordItemVO;
import com.sinata.system.domain.vo.MwDisposalRecordReportVO;
import com.sinata.system.domain.vo.MwDisposalRecordVO;
import java.util.List;
/**
 * <p>
@@ -41,4 +46,21 @@
     * @return
     */
    PageDTO<MwDisposalRecordItemVO> detail(MwDisposalRecordItemQuery query);
    /**
     * 处置报表
     *
     * @param query
     * @param type  1:接收 2:处置
     * @return
     */
    List<MwDisposalRecordReportVO> disposalReportByType(DisposalReportQuery query, Integer type);
    /**
     * 监管报表医疗废物处置列表
     *
     * @param query
     * @return
     */
    List<MwCollectRecordVO> getRegulationReportList(DisposalReportQuery query);
}
medicalWaste-system/src/main/java/com/sinata/system/service/MwWarningConfigService.java
@@ -2,6 +2,8 @@
import com.sinata.system.domain.MwWarningConfig;
import com.baomidou.mybatisplus.extension.service.IService;
import com.sinata.system.domain.dto.MwWarningConfigDTO;
import com.sinata.system.domain.vo.MwWarningConfigVO;
/**
 * <p>
@@ -12,5 +14,19 @@
 * @since 2024-12-02
 */
public interface MwWarningConfigService extends IService<MwWarningConfig> {
    /**
     * 保存设置
     *
     * @param dto
     * @return
     */
    void saveConfig(MwWarningConfigDTO dto);
    /**
     * 根据类型获取配置信息
     *
     * @param type
     * @return
     */
    MwWarningConfigVO getByType(Integer type);
}
medicalWaste-system/src/main/java/com/sinata/system/service/biz/StaticsService.java
New file
@@ -0,0 +1,495 @@
package com.sinata.system.service.biz;
import cn.idev.excel.FastExcel;
import com.alibaba.fastjson2.JSONObject;
import com.google.common.collect.Lists;
import com.sinata.common.core.domain.entity.SysDictData;
import com.sinata.common.utils.CollUtils;
import com.sinata.common.utils.DateUtils;
import com.sinata.system.domain.MedicalWasteStaticsVO;
import com.sinata.system.domain.MwCollectRecord;
import com.sinata.system.domain.MwWarningRecord;
import com.sinata.system.domain.SysDepartment;
import com.sinata.system.domain.query.DisposalReportQuery;
import com.sinata.system.domain.query.HospitalReportQuery;
import com.sinata.system.domain.query.TransformQuery;
import com.sinata.system.domain.vo.DepartmentReportItemVO;
import com.sinata.system.domain.vo.DepartmentReportVO;
import com.sinata.system.domain.vo.MwCollectRecordVO;
import com.sinata.system.domain.vo.MwDisposalRecordReportVO;
import com.sinata.system.domain.vo.MwMedicalWasteBoxVO;
import com.sinata.system.domain.vo.SysDictDataVO;
import com.sinata.system.domain.vo.TransformVO;
import com.sinata.system.enums.DepartmentEnum;
import com.sinata.system.enums.MedicalWasteStatusEnum;
import com.sinata.system.service.ISysDictDataService;
import com.sinata.system.service.MwCheckoutRecordService;
import com.sinata.system.service.MwCollectRecordService;
import com.sinata.system.service.MwDisposalRecordService;
import com.sinata.system.service.MwWarningRecordService;
import com.sinata.system.service.SysDepartmentService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
 * @author mitao
 * @date 2024/12/25
 */
@Service
@RequiredArgsConstructor
public class StaticsService {
    private final SysDepartmentService sysDepartmentService;
    private final MwCollectRecordService mwCollectRecordService;
    private final MwCheckoutRecordService mwCheckoutRecordService;
    private final ISysDictDataService sysDictDataService;
    private final MwWarningRecordService mwWarningRecordService;
    private final HttpServletResponse response;
    private final MwDisposalRecordService mwDisposalRecordService;
    /**
     * 机构分布-获取机构列表
     *
     * @param type 1:全部 2:医院 3:处置单位
     * @return
     */
    public List<SysDepartment> departmentList(Integer type) {
        return sysDepartmentService.lambdaQuery().eq(type != 1, SysDepartment::getOrgType, type).list();
    }
    public MedicalWasteStaticsVO medicalWaste() {
        return null;
    }
    /**
     * 医院报表
     *
     * @param query
     * @return
     */
    public DepartmentReportVO hospitalReport(HospitalReportQuery query) {
        DepartmentReportVO vo = new DepartmentReportVO();
        List<SysDictDataVO> wasteTypeList = sysDictDataService.medicalWasteTypeList();
        if (CollUtils.isEmpty(wasteTypeList)) {
            return vo;
        }
        vo.setLegend(wasteTypeList.stream().map(SysDictDataVO::getDictLabel).collect(Collectors.toList()));
        vo.getLegend().add("小计");
        List<MwCollectRecord> collectRecordList = mwCollectRecordService.lambdaQuery().eq(query.getReportType().equals(1), MwCollectRecord::getStatus, MedicalWasteStatusEnum.TEMPORARILY_STORED.getCode())
                .ne(query.getReportType().equals(2), MwCollectRecord::getStatus, MedicalWasteStatusEnum.TEMPORARILY_STORED.getCode())
                .eq(MwCollectRecord::getDepartmentId, query.getDepartmentId())
                .between(query.getReportType().equals(1), MwCollectRecord::getCollectTime, query.getStartTime(), query.getEndTime())
                .between(query.getReportType().equals(2), MwCollectRecord::getCheckoutTime, query.getStartTime(), query.getEndTime())
                .orderByDesc(MwCollectRecord::getCollectTime).list();
        SimpleDateFormat sdf = new SimpleDateFormat(DateUtils.YYYY_MM_DD_HH_MM_SS);
        switch (query.getDateType()) {
            case 1:
                sdf = new SimpleDateFormat(DateUtils.YYYY_MM_DD);
                break;
            case 2:
                sdf = new SimpleDateFormat(DateUtils.YYYY_MM);
                break;
            case 3:
                sdf = new SimpleDateFormat(DateUtils.YYYY);
                break;
        }
        List<String> dateList = DateUtils.getDayBetween(query.getStartTime(), query.getEndTime(), query.getDateType());
        List<DepartmentReportItemVO> list = new ArrayList<>();
        for (String date : dateList) {
            DepartmentReportItemVO itemVO = new DepartmentReportItemVO();
            itemVO.setName(date);
            itemVO.setData(new ArrayList<>());
            BigDecimal totalCount = BigDecimal.ZERO;
            BigDecimal totalWeight = BigDecimal.ZERO;
            SimpleDateFormat finalSdf = sdf;
            for (SysDictDataVO sysDictData : wasteTypeList) {
                BigDecimal weight = BigDecimal.ZERO;
                BigDecimal currentCount = BigDecimal.ZERO;
                if (query.getReportType().equals(1)) {
                    weight = collectRecordList.stream().filter(e -> e.getWasteType().equals(sysDictData.getDictCode())
                            && finalSdf.format(e.getCollectTime()).equals(date)).map(MwCollectRecord::getWeight).reduce(BigDecimal::add).orElse(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP);
                    long count = collectRecordList.stream().filter(e -> e.getWasteType().equals(sysDictData.getDictCode()) && finalSdf.format(e.getCollectTime()).equals(date)).count();
                    currentCount = BigDecimal.valueOf(count);
                } else {
                    weight = collectRecordList.stream().filter(e -> e.getWasteType().equals(sysDictData.getDictCode())
                            && finalSdf.format(e.getCheckoutTime()).equals(date)).map(MwCollectRecord::getWeight).reduce(BigDecimal::add).orElse(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP);
                    long count = collectRecordList.stream().filter(e -> e.getWasteType().equals(sysDictData.getDictCode()) && finalSdf.format(e.getCheckoutTime()).equals(date)).count();
                    currentCount = BigDecimal.valueOf(count);
                }
                itemVO.getData().add(currentCount);
                itemVO.getData().add(weight);
                totalCount = totalCount.add(currentCount);
                totalWeight = totalWeight.add(weight);
            }
            //查询预警记录判断是否超时
            if (query.getDateType().equals(1)) {
                itemVO.setOverTimeFlag("否");
                List<Long> collectIdList = collectRecordList.stream().filter(e -> finalSdf.format(e.getCollectTime()).equals(date)).map(MwCollectRecord::getId).collect(Collectors.toList());
                List<MwWarningRecord> warningRecordList = mwWarningRecordService.lambdaQuery().in(MwWarningRecord::getWarningTargetId, collectIdList).list();
                if (CollUtils.isNotEmpty(warningRecordList)) {
                    itemVO.setOverTimeFlag("是");
                }
            }
            list.add(itemVO);
        }
        vo.setList(list);
        return vo;
    }
    /**
     * 医院报表-导出
     *
     * @param query
     * @return
     */
    public void hospitalReportExport(HospitalReportQuery query) throws IOException {
        List<List<String>> head = hospitalReportHead();
        System.out.println(JSONObject.toJSONString(head));
        // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode("医院报表", "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        // 这里需要设置不关闭流
        FastExcel.write(response.getOutputStream())
                .head(head)
                .autoCloseStream(Boolean.TRUE)
                .sheet("医院报表")
                .doWrite(getHospitalReportStaticsData(query));
    }
    /**
     * 封装Excel导出数据
     *
     * @param query
     * @return
     */
    private List<List<Object>> getHospitalReportStaticsData(HospitalReportQuery query) {
        DepartmentReportVO vo = hospitalReport(query);
        if (CollUtils.isNotEmpty(vo.getList())) {
            List<List<Object>> result = new ArrayList<>();
            for (DepartmentReportItemVO departmentReportItemVO : vo.getList()) {
                List<Object> data = new ArrayList<>();
                data.add(departmentReportItemVO.getName());
                data.addAll(departmentReportItemVO.getData());
                if (query.getDateType().equals(1)) {
                    data.add(departmentReportItemVO.getOverTimeFlag());
                }
                result.add(data);
            }
            return result;
        }
        return CollUtils.emptyList();
    }
    /**
     * 医院报表表头
     *
     * @return
     */
    private List<List<String>> hospitalReportHead() {
        List<SysDictDataVO> wasteTypeList = sysDictDataService.medicalWasteTypeList();
        List<List<String>> headTitles = Lists.newArrayList();
        headTitles.add(Lists.newArrayList("日期", "日期"));
        wasteTypeList.forEach(item -> {
            headTitles.add(Lists.newArrayList(item.getDictLabel(), "数量"));
            headTitles.add(Lists.newArrayList(item.getDictLabel(), "重量(KG)"));
        });
        headTitles.add(Lists.newArrayList("小计", "数量"));
        headTitles.add(Lists.newArrayList("小计", "重量(KG)"));
        return headTitles;
    }
    /**
     * 转移联单
     *
     * @param query
     * @return
     */
    public DepartmentReportVO transformList(TransformQuery query) {
        DepartmentReportVO vo = new DepartmentReportVO();
        SysDepartment department = sysDepartmentService.getById(query.getDepartmentId());
        SysDepartment region = sysDepartmentService.getDepartmentByParentId(department.getParentId());
        List<SysDepartment> hospitalList = sysDepartmentService.lambdaQuery().likeRight(SysDepartment::getTreeCode, region.getTreeCode()).eq(SysDepartment::getOrgType, DepartmentEnum.MEDICAL_INSTITUTION.getCode()).list();
        if (CollUtils.isNotEmpty(hospitalList)) {
            List<TransformVO> checkoutRecordVOList = mwCheckoutRecordService.getCheckoutRecordList(query, region.getTreeCode());
            if (CollUtils.isNotEmpty(checkoutRecordVOList)) {
                //查询医废类型
                List<SysDictData> wasteTypeList = sysDictDataService.lambdaQuery().in(SysDictData::getDictCode, query.getWasteTypeCodeList()).list();
                if (CollUtils.isNotEmpty(wasteTypeList)) {
                    vo.setLegend(wasteTypeList.stream().map(SysDictData::getDictLabel).collect(Collectors.toList()));
                    vo.getLegend().add("小计");
                    for (TransformVO transformVO : checkoutRecordVOList) {
                        BigDecimal totalCount = BigDecimal.ZERO;
                        BigDecimal totalWeight = BigDecimal.ZERO;
                        DepartmentReportItemVO departmentReportItemVO = new DepartmentReportItemVO();
                        departmentReportItemVO.setName(transformVO.getHospitalName());
                        departmentReportItemVO.setData(new ArrayList<>());
                        departmentReportItemVO.setDriverName(transformVO.getDriverName());
                        departmentReportItemVO.setHospitalSignature(transformVO.getHospitalSignature());
                        departmentReportItemVO.setHandoverTime(transformVO.getCheckoutTime());
                        for (SysDictData sysDictData : wasteTypeList) {
                            BigDecimal count = BigDecimal.valueOf(transformVO.getCollectRecordList().stream().filter(item -> item.getWasteType().equals(sysDictData.getDictCode())).count());
                            BigDecimal weight = transformVO.getCollectRecordList().stream().filter(item -> item.getWasteType().equals(sysDictData.getDictCode())).map(MwMedicalWasteBoxVO::getTotalWeight).reduce(BigDecimal.ZERO, BigDecimal::add);
                            departmentReportItemVO.getData().add(count);
                            departmentReportItemVO.getData().add(weight);
                            totalCount = totalCount.add(count);
                            totalWeight = totalWeight.add(weight);
                        }
                        departmentReportItemVO.getData().add(totalCount);
                        departmentReportItemVO.getData().add(totalWeight);
                    }
                }
            }
        }
        return vo;
    }
    public void transformListExport(TransformQuery query) throws IOException {
        List<List<String>> head = transformReportHead(query.getWasteTypeCodeList());
        System.out.println(JSONObject.toJSONString(head));
        // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode("医院报表", "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        // 这里需要设置不关闭流
        FastExcel.write(response.getOutputStream())
                .head(head)
                .autoCloseStream(Boolean.TRUE)
                .sheet("转运联单")
                .doWrite(getTransformReportStaticsData(query));
    }
    /**
     * 转运联单导出数据
     *
     * @param query
     * @return
     * @throws MalformedURLException
     */
    private List<List<Object>> getTransformReportStaticsData(TransformQuery query) throws MalformedURLException {
        DepartmentReportVO vo = transformList(query);
        List<DepartmentReportItemVO> list = vo.getList();
        if (CollUtils.isNotEmpty(list)) {
            List<List<Object>> result = new ArrayList<>();
            for (DepartmentReportItemVO departmentReportItemVO : list) {
                List<Object> data = new ArrayList<>();
                data.add(departmentReportItemVO.getName());
                data.addAll(departmentReportItemVO.getData());
                data.add(new URL(departmentReportItemVO.getHospitalSignature()));
                data.add(departmentReportItemVO.getDriverName());
                data.add(departmentReportItemVO.getHandoverTime());
                result.add(data);
            }
            return result;
        }
        return CollUtils.emptyList();
    }
    /**
     * 转运联单导出表头
     *
     * @param wasteTypeCodeList
     * @return
     */
    private List<List<String>> transformReportHead(List<Long> wasteTypeCodeList) {
        //查询医废类型
        List<SysDictData> wasteTypeList = sysDictDataService.lambdaQuery().in(SysDictData::getDictCode, wasteTypeCodeList).list();
        List<List<String>> headTitles = Lists.newArrayList();
        headTitles.add(Lists.newArrayList("医院名称", "医院名称"));
        wasteTypeList.forEach(item -> {
            headTitles.add(Lists.newArrayList(item.getDictLabel(), "数量"));
            headTitles.add(Lists.newArrayList(item.getDictLabel(), "重量(KG)"));
        });
        headTitles.add(Lists.newArrayList("小计", "数量"));
        headTitles.add(Lists.newArrayList("小计", "重量(KG)"));
        headTitles.add(Lists.newArrayList("机构人员签字", "机构人员签字"));
        headTitles.add(Lists.newArrayList("运输人员签字", "运输人员签字"));
        headTitles.add(Lists.newArrayList("交接时间", "交接时间"));
        return headTitles;
    }
    /**
     * 处置报表
     *
     * @param query
     * @return
     */
    public DepartmentReportVO disposalReport(DisposalReportQuery query) {
        DepartmentReportVO vo = new DepartmentReportVO();
        //已接收
        List<MwDisposalRecordReportVO> receivedList = mwDisposalRecordService.disposalReportByType(query, 1);
        //已处置
        List<MwDisposalRecordReportVO> disposaledList = mwDisposalRecordService.disposalReportByType(query, 2);
        SimpleDateFormat sdf = new SimpleDateFormat(DateUtils.YYYY_MM_DD_HH_MM_SS);
        switch (query.getDateType()) {
            case 1:
                sdf = new SimpleDateFormat(DateUtils.YYYY_MM_DD);
                break;
            case 2:
                sdf = new SimpleDateFormat(DateUtils.YYYY_MM);
                break;
            case 3:
                sdf = new SimpleDateFormat(DateUtils.YYYY);
                break;
        }
        List<String> dateList = DateUtils.getDayBetween(query.getStartTime(), query.getEndTime(), query.getDateType());
        //查询医废类型
        List<SysDictData> wasteTypeList = sysDictDataService.lambdaQuery().in(SysDictData::getDictCode, query.getWasteTypeCodeList()).list();
        if (CollUtils.isNotEmpty(wasteTypeList)) {
            List<String> legend = wasteTypeList.stream().map(SysDictData::getDictLabel).collect(Collectors.toList());
            vo.setLegend(legend);
            List<DepartmentReportItemVO> list = new ArrayList<>();
            for (String date : dateList) {
                DepartmentReportItemVO departmentReportItemVO = new DepartmentReportItemVO();
                departmentReportItemVO.setName(date);
                departmentReportItemVO.setData(new ArrayList<>());
                SimpleDateFormat finalSdf = sdf;
                //接收
                for (SysDictData sysDictData : wasteTypeList) {
                    departmentReportItemVO.getData().add(BigDecimal.ZERO);
                    if (CollUtils.isNotEmpty(receivedList)) {
                        BigDecimal totalWeight = receivedList.stream().filter(item -> item.getWasteType().equals(sysDictData.getDictCode()) &&
                                        finalSdf.format(item.getReceiveTime()).equals(date)).map(MwDisposalRecordReportVO::getWeight)
                                .reduce(BigDecimal.ZERO, BigDecimal::add);
                        departmentReportItemVO.getData().add(totalWeight);
                    }
                }
                //处置
                for (SysDictData sysDictData : wasteTypeList) {
                    departmentReportItemVO.getData().add(BigDecimal.ZERO);
                    if (CollUtils.isNotEmpty(disposaledList)) {
                        BigDecimal totalWeight = disposaledList.stream().filter(item -> item.getWasteType().equals(sysDictData.getDictCode()) &&
                                        finalSdf.format(item.getReceiveTime()).equals(date)).map(MwDisposalRecordReportVO::getWeight)
                                .reduce(BigDecimal.ZERO, BigDecimal::add);
                        departmentReportItemVO.getData().add(totalWeight);
                    }
                }
                list.add(departmentReportItemVO);
            }
            vo.setList(list);
        }
        return vo;
    }
    /**
     * 处置报表导出
     *
     * @param query
     * @throws IOException
     */
    public void disposalReportExport(DisposalReportQuery query) throws IOException {
        List<List<String>> head = disposalReportHead(query.getWasteTypeCodeList());
        System.out.println(JSONObject.toJSONString(head));
        // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode("处置报表", "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        // 这里需要设置不关闭流
        FastExcel.write(response.getOutputStream())
                .head(head)
                .autoCloseStream(Boolean.TRUE)
                .sheet("处置报表")
                .doWrite(getDisposalReportStaticsData(query));
    }
    /**
     * 处置报表统计数据
     *
     * @param query
     * @return
     */
    private List<List<Object>> getDisposalReportStaticsData(DisposalReportQuery query) {
        DepartmentReportVO vo = disposalReport(query);
        List<DepartmentReportItemVO> list = vo.getList();
        if (CollUtils.isNotEmpty(list)) {
            List<List<Object>> result = new ArrayList<>();
            for (DepartmentReportItemVO departmentReportItemVO : list) {
                List<Object> data = new ArrayList<>();
                data.add(departmentReportItemVO.getName());
                data.addAll(departmentReportItemVO.getData());
                result.add(data);
            }
            return result;
        }
        return CollUtils.emptyList();
    }
    /**
     * 处置报表表头
     *
     * @param wasteTypeCodeList
     * @return
     */
    private List<List<String>> disposalReportHead(List<Long> wasteTypeCodeList) {
        //查询医废类型
        List<SysDictData> wasteTypeList = sysDictDataService.lambdaQuery().in(SysDictData::getDictCode, wasteTypeCodeList).list();
        List<List<String>> headTitles = Lists.newArrayList();
        headTitles.add(Lists.newArrayList("日期"));
        wasteTypeList.forEach(item -> {
            headTitles.add(Lists.newArrayList("医疗废物接收量(kg)", item.getDictLabel()));
            headTitles.add(Lists.newArrayList("医疗废物接收量(kg)", item.getDictLabel()));
        });
        wasteTypeList.forEach(item -> {
            headTitles.add(Lists.newArrayList("医疗废物处置量(kg)", item.getDictLabel()));
            headTitles.add(Lists.newArrayList("医疗废物处置量(kg)", item.getDictLabel()));
        });
        return headTitles;
    }
    public DepartmentReportVO regulationReport(DisposalReportQuery query) {
        DepartmentReportVO vo = new DepartmentReportVO();
        //医废产生量
        List<MwCollectRecordVO> collectRecordList = mwCollectRecordService.getRegulationReportList(query);
        //医废转移量
        List<MwCollectRecordVO> checkoutRecordList = mwCheckoutRecordService.getRegulationReportList(query);
        //医废处置量
        List<MwCollectRecordVO> disposalRecordList = mwDisposalRecordService.getRegulationReportList(query);
        SimpleDateFormat sdf = new SimpleDateFormat(DateUtils.YYYY_MM_DD_HH_MM_SS);
        switch (query.getDateType()) {
            case 1:
                sdf = new SimpleDateFormat(DateUtils.YYYY_MM_DD);
                break;
            case 2:
                sdf = new SimpleDateFormat(DateUtils.YYYY_MM);
                break;
            case 3:
                sdf = new SimpleDateFormat(DateUtils.YYYY);
                break;
        }
        List<String> dateList = DateUtils.getDayBetween(query.getStartTime(), query.getEndTime(), query.getDateType());
        //查询医废类型
        List<SysDictData> wasteTypeList = sysDictDataService.lambdaQuery().in(SysDictData::getDictCode, query.getWasteTypeCodeList()).list();
        if (CollUtils.isNotEmpty(wasteTypeList)) {
            vo.setLegend(wasteTypeList.stream().map(SysDictData::getDictLabel).collect(Collectors.toList()));
            vo.setList(new ArrayList<>());
            for (String date : dateList) {
                DepartmentReportItemVO departmentReportItemVO = new DepartmentReportItemVO();
                departmentReportItemVO.setName(date);
                SimpleDateFormat finalSdf = sdf;
                for (SysDictData sysDictData : wasteTypeList) {
                    collectRecordList.stream().filter(e -> e.getWasteType().equals(sysDictData.getDictCode()) && finalSdf.format(e.getCollectTime()).equals(date)).map(MwCollectRecordVO::getWeight).reduce(BigDecimal.ZERO, BigDecimal::add);
                }
            }
        }
        return null;
    }
}
medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwCheckoutRecordServiceImpl.java
@@ -8,12 +8,16 @@
import com.sinata.common.utils.StringUtils;
import com.sinata.system.domain.MwCheckoutRecord;
import com.sinata.system.domain.query.CheckoutRecordQuery;
import com.sinata.system.domain.query.DisposalReportQuery;
import com.sinata.system.domain.query.MwCheckoutRecordItemQuery;
import com.sinata.system.domain.query.MwTransitRecordQuery;
import com.sinata.system.domain.query.TransformQuery;
import com.sinata.system.domain.vo.MwCheckoutRecordExcelVO;
import com.sinata.system.domain.vo.MwCheckoutRecordVO;
import com.sinata.system.domain.vo.MwCollectRecordVO;
import com.sinata.system.domain.vo.MwMedicalWasteBoxVO;
import com.sinata.system.domain.vo.MwTransitRecordVO;
import com.sinata.system.domain.vo.TransformVO;
import com.sinata.system.mapper.MwCheckoutRecordMapper;
import com.sinata.system.service.MwCheckoutRecordService;
import com.sinata.system.service.SysDepartmentService;
@@ -138,4 +142,28 @@
        Page<MwMedicalWasteBoxVO> page = baseMapper.transitDetailPageList(new Page<>(query.getPageCurr(), query.getPageSize()), query.getId());
        return PageDTO.of(page);
    }
    /**
     * 转移联单数据
     *
     * @param query
     * @param treeCode
     * @return
     */
    @Override
    public List<TransformVO> getCheckoutRecordList(TransformQuery query, String treeCode) {
        return baseMapper.getCheckoutRecordList(query, treeCode);
    }
    /**
     * 监管报表医疗废物转移列表
     *
     * @param query
     * @return
     */
    @Override
    public List<MwCollectRecordVO> getRegulationReportList(DisposalReportQuery query) {
        String treeCode = sysDepartmentService.getTreeCodeByDepartmentId(query.getDepartmentId());
        return baseMapper.getRegulationReportList(query, treeCode);
    }
}
medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwCollectRecordServiceImpl.java
@@ -7,6 +7,7 @@
import com.sinata.common.utils.StringUtils;
import com.sinata.system.domain.MwCollectRecord;
import com.sinata.system.domain.dto.MwCollectRecordDTO;
import com.sinata.system.domain.query.DisposalReportQuery;
import com.sinata.system.domain.query.MwCollectRecordQuery;
import com.sinata.system.domain.vo.MedicalWasteProcessVO;
import com.sinata.system.domain.vo.MwCollectRecordVO;
@@ -102,4 +103,16 @@
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        FastExcel.write(response.getOutputStream(), MwCollectRecordVO.class).sheet("医废收集记录").doWrite(vo);
    }
    /**
     * 监管报表医疗废物产生列表
     *
     * @param query
     * @return
     */
    @Override
    public List<MwCollectRecordVO> getRegulationReportList(DisposalReportQuery query) {
        String treeCode = sysDepartmentService.getTreeCodeByDepartmentId(query.getDepartmentId());
        return baseMapper.getRegulationReportList(query, treeCode);
    }
}
medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwDisposalHandleRecordServiceImpl.java
New file
@@ -0,0 +1,20 @@
package com.sinata.system.service.impl;
import com.sinata.system.domain.MwDisposalHandleRecord;
import com.sinata.system.mapper.MwDisposalHandleRecordMapper;
import com.sinata.system.service.MwDisposalHandleRecordService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
 * <p>
 *  处置记录服务实现类
 * </p>
 *
 * @author mitao
 * @since 2024-12-27
 */
@Service
public class MwDisposalHandleRecordServiceImpl extends ServiceImpl<MwDisposalHandleRecordMapper, MwDisposalHandleRecord> implements MwDisposalHandleRecordService {
}
medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwDisposalRecordServiceImpl.java
@@ -6,10 +6,13 @@
import com.sinata.common.utils.CollUtils;
import com.sinata.common.utils.StringUtils;
import com.sinata.system.domain.MwDisposalRecord;
import com.sinata.system.domain.query.DisposalReportQuery;
import com.sinata.system.domain.query.MwDisposalRecordItemQuery;
import com.sinata.system.domain.query.MwDisposalRecordQuery;
import com.sinata.system.domain.vo.DisposalRecordStaticsVO;
import com.sinata.system.domain.vo.MwCollectRecordVO;
import com.sinata.system.domain.vo.MwDisposalRecordItemVO;
import com.sinata.system.domain.vo.MwDisposalRecordReportVO;
import com.sinata.system.domain.vo.MwDisposalRecordVO;
import com.sinata.system.mapper.MwDisposalRecordMapper;
import com.sinata.system.service.MwDisposalRecordService;
@@ -84,4 +87,28 @@
        Page<MwDisposalRecordItemVO> page = baseMapper.pageDetail(new Page<>(query.getPageCurr(), query.getPageSize()), query.getDisposalRecordId());
        return PageDTO.of(page);
    }
    /**
     * 处置报表
     *
     * @param query
     * @param type
     * @return
     */
    @Override
    public List<MwDisposalRecordReportVO> disposalReportByType(DisposalReportQuery query, Integer type) {
        return baseMapper.disposalReportByType(query, type);
    }
    /**
     * 监管报表医疗废物处置列表
     *
     * @param query
     * @return
     */
    @Override
    public List<MwCollectRecordVO> getRegulationReportList(DisposalReportQuery query) {
        String treeCode = sysDepartmentService.getTreeCodeByDepartmentId(query.getDepartmentId());
        return baseMapper.getRegulationReportList(query, treeCode);
    }
}
medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwMicroEquipmentRecordServiceImpl.java
@@ -180,10 +180,13 @@
        switch (query.getDateType()) {
            case 1:
                sdf = new SimpleDateFormat(DateUtils.YYYY_MM_DD);
                break;
            case 2:
                sdf = new SimpleDateFormat(DateUtils.YYYY_MM);
                break;
            case 3:
                sdf = new SimpleDateFormat(DateUtils.YYYY);
                break;
        }
        List<String> dateList = DateUtils.getDayBetween(query.getStartTime(), query.getEndTime(), query.getDateType());
        List<List<String>> result = new ArrayList<>();
medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwWarningConfigServiceImpl.java
@@ -1,10 +1,25 @@
package com.sinata.system.service.impl;
import com.sinata.system.domain.MwWarningConfig;
import com.sinata.system.mapper.MwWarningConfigMapper;
import com.sinata.system.service.MwWarningConfigService;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sinata.common.exception.ServiceException;
import com.sinata.common.utils.CollUtils;
import com.sinata.system.domain.MwWarningConfig;
import com.sinata.system.domain.MwWarningConfigItem;
import com.sinata.system.domain.dto.MwWarningConfigDTO;
import com.sinata.system.domain.vo.MwWarningConfigItemVO;
import com.sinata.system.domain.vo.MwWarningConfigVO;
import com.sinata.system.enums.WarningConfigTypeEnum;
import com.sinata.system.mapper.MwWarningConfigMapper;
import com.sinata.system.service.MwWarningConfigItemService;
import com.sinata.system.service.MwWarningConfigService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Objects;
/**
 * <p>
@@ -15,6 +30,51 @@
 * @since 2024-12-02
 */
@Service
@RequiredArgsConstructor
public class MwWarningConfigServiceImpl extends ServiceImpl<MwWarningConfigMapper, MwWarningConfig> implements MwWarningConfigService {
    private final MwWarningConfigItemService mwWarningConfigItemService;
    /**
     * 保存设置
     *
     * @param dto
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveConfig(MwWarningConfigDTO dto) {
        MwWarningConfig mwWarningConfig = lambdaQuery().eq(MwWarningConfig::getType, dto.getType()).last("limit 1").oneOpt().orElse(new MwWarningConfig());
        BeanUtils.copyProperties(dto, mwWarningConfig);
        saveOrUpdate(mwWarningConfig);
        if (dto.getType().equals(WarningConfigTypeEnum.MEDICAL_WASTE.getCode()) || dto.getType().equals(WarningConfigTypeEnum.STAGING_ROOM_CAPACITY.getCode())) {
            if (CollUtils.isEmpty(dto.getWarningConfigItemList())) {
                throw new ServiceException("预警配置项不能为空");
            }
            //清空配置项
            mwWarningConfigItemService.lambdaUpdate().eq(MwWarningConfigItem::getConfigId, mwWarningConfig.getId()).remove();
            List<MwWarningConfigItem> mwWarningConfigItems = BeanUtil.copyToList(dto.getWarningConfigItemList(), MwWarningConfigItem.class);
            mwWarningConfigItems.forEach(item -> item.setConfigId(mwWarningConfig.getId()));
            mwWarningConfigItemService.saveBatch(mwWarningConfigItems);
        }
    }
    /**
     * 根据类型获取配置信息
     *
     * @param type
     * @return
     */
    @Override
    public MwWarningConfigVO getByType(Integer type) {
        MwWarningConfig mwWarningConfig = lambdaQuery().eq(MwWarningConfig::getType, type).last("limit 1").one();
        MwWarningConfigVO mwWarningConfigVO = null;
        if (Objects.nonNull(mwWarningConfig)) {
            mwWarningConfigVO = BeanUtil.copyProperties(mwWarningConfig, MwWarningConfigVO.class);
            if (type.equals(WarningConfigTypeEnum.MEDICAL_WASTE.getCode()) || type.equals(WarningConfigTypeEnum.STAGING_ROOM_CAPACITY.getCode())) {
                List<MwWarningConfigItem> mwWarningConfigItems = mwWarningConfigItemService.lambdaQuery().eq(MwWarningConfigItem::getConfigId, mwWarningConfig.getId()).list();
                mwWarningConfigVO.setWarningConfigItemList(BeanUtil.copyToList(mwWarningConfigItems, MwWarningConfigItemVO.class));
            }
        }
        return mwWarningConfigVO;
    }
}
medicalWaste-system/src/main/java/com/sinata/system/service/impl/SysDictDataServiceImpl.java
@@ -14,6 +14,7 @@
import com.sinata.system.mapper.SysDictDataMapper;
import com.sinata.system.mapper.SysDictTypeMapper;
import com.sinata.system.service.ISysDictDataService;
import org.jetbrains.annotations.Nullable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -22,7 +23,7 @@
/**
 * 字典 业务层处理
 *
 *
 * @author ruoyi
 */
@Service
@@ -35,7 +36,7 @@
    /**
     * 根据条件分页查询字典数据
     *
     *
     * @param dictData 字典数据信息
     * @return 字典数据集合信息
     */
@@ -47,7 +48,7 @@
    /**
     * 根据字典类型和字典键值查询字典数据信息
     *
     *
     * @param dictType 字典类型
     * @param dictValue 字典键值
     * @return 字典标签
@@ -60,7 +61,7 @@
    /**
     * 根据字典数据ID查询信息
     *
     *
     * @param dictCode 字典数据ID
     * @return 字典数据
     */
@@ -72,7 +73,7 @@
    /**
     * 批量删除字典数据信息
     *
     *
     * @param dictCodes 需要删除的字典数据ID
     */
    @Override
@@ -89,7 +90,7 @@
    /**
     * 新增保存字典数据信息
     *
     *
     * @param data 字典数据信息
     * @return 结果
     */
@@ -107,7 +108,7 @@
    /**
     * 修改保存字典数据信息
     *
     *
     * @param data 字典数据信息
     * @return 结果
     */
@@ -142,4 +143,45 @@
            baseMapper.insert(sysDictData);
        }
    }
    @Override
    public List<SysDictDataVO> medicalWasteTypeList() {
        return getSysDictDataVOListByType("medical_waste_type");
    }
    @Nullable
    private List<SysDictDataVO> getSysDictDataVOListByType(String dictType) {
        List<SysDictData> medicalWasteTypeList = lambdaQuery().eq(SysDictData::getDictType, dictType).list();
        return BeanUtils.copyToList(medicalWasteTypeList, SysDictDataVO.class);
    }
    /**
     * 器具类型列表
     *
     * @return
     */
    @Override
    public List<SysDictDataVO> equipmentTypeList() {
        return getSysDictDataVOListByType("protection_equipment_type");
    }
    /**
     * 规章制度类型列表
     *
     * @return
     */
    @Override
    public List<SysDictDataVO> regulationsTypeList() {
        return getSysDictDataVOListByType("protection_regulation_type");
    }
    /**
     * 作业类型
     *
     * @return
     */
    @Override
    public List<SysDictDataVO> workTypeList() {
        return getSysDictDataVOListByType("protective_work_type");
    }
}
medicalWaste-system/src/main/resources/mapper/system/MwCheckoutRecordMapper.xml
@@ -18,7 +18,21 @@
        <result column="DRIVER_ID" property="driverId" />
        <result column="CAR_ID" property="carId" />
    </resultMap>
    <resultMap id="TransformVOMap" type="com.sinata.system.domain.vo.TransformVO">
        <id column="ID" property="id"/>
        <result column="CHECKOUT_TIME" property="checkoutTime"/>
        <result column="HOSPITAL_NAME" property="hospitalName"/>
        <result column="DEPARTMENT_ID" property="departmentId"/>
        <result column="HOSPITAL_SIGNATURE" property="hospitalSignature"/>
        <result column="driverName" property="driverName"/>
        <collection property="collectRecordList" javaType="java.util.List"
                    ofType="com.sinata.system.domain.vo.MwMedicalWasteBoxVO">
            <result column="WASTE_TYPE_STR" property="wasteTypeStr"/>
            <result column="WASTE_TYPE" property="wasteType"/>
            <result column="bagNum" property="bagNum"/>
            <result column="totalWeight" property="totalWeight"/>
        </collection>
    </resultMap>
    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        DEL_FLAG,
@@ -54,6 +68,7 @@
            </if>
        </where>
        GROUP BY mcr.DEPARTMENT_ID
        ORDER BY mcr.CHECKOUT_TIME DESC
    </select>
    <select id="hospitalDetail" resultType="com.sinata.system.domain.vo.MwCheckoutRecordVO">
        SELECT mcr.ID,
@@ -209,5 +224,64 @@
        </where>
        GROUP BY mcr.DEPARTMENT_ID
    </select>
    <select id="getCheckoutRecordList" resultMap="TransformVOMap">
        SELECT MCR.ID,
        MCR.CHECKOUT_TIME,
        MCR.DEPARTMENT_ID,
        MCR.HOSPITAL_NAME,
        MCR.STAGING_ROOM_ID,
        MCR.HOSPITAL_SIGNATURE,
        SU.NICK_NAME AS driverName,
        COUNT(MCR2.ID) AS bagNum,
        SUM(MCR2.WEIGHT) AS totalWeight,
        MCR2.WASTE_TYPE,
        MCR2.WASTE_TYPE_STR
        FROM MW_CHECKOUT_RECORD MCR
        LEFT JOIN MW_CHECKOUT_RECORD_ITEM MCRI ON MCRI.CHECKOUT_RECORD_ID = MCR.ID
        LEFT JOIN MW_COLLECT_RECORD MCR2 ON MCR2.ID = MCRI.COLLECT_RECORD_ID
        LEFT JOIN SYS_DEPARTMENT SD ON SD.ID = MCR.DEPARTMENT_ID
        LEFT JOIN SYS_USER SU ON SU.USER_ID = MCR.DRIVER_ID
        <where>
            <if test="treeCode != null and treeCode != ''">
                AND SD.TREE_CODE LIKE CONCAT(#{treeCode},'%')
            </if>
            <if test="query.startTime != null and query.endTime != null">
                AND MCR.CHECKOUT_TIME BETWEEN #{query.startTime} AND #{query.endTime}
            </if>
            <if test="query.wasteTypeList != null and query.wasteTypeList.size()>0">
                AND MCR2.WASTE_TYPE IN
                <foreach collection="query.wasteTypeList" item="wasteType" separator="," open="(" close=")">
                    #{wasteType}
                </foreach>
            </if>
        </where>
        GROUP BY MCR2.BOX_NUMBER
    </select>
    <select id="getRegulationReportList" resultType="com.sinata.system.domain.vo.MwCollectRecordVO">
        SELECT MCR2.ID,
        MCR2.WASTE_TYPE,
        MCR2.WASTE_TYPE_STR,
        MCR2.WEIGHT,
        MCR.CHECKOUT_TIME
        FROM MW_CHECKOUT_RECORD MCR
        LEFT JOIN MW_CHECKOUT_RECORD_ITEM MCRI ON MCRI.CHECKOUT_RECORD_ID = MCR.ID
        LEFT JOIN MW_COLLECT_RECORD MCR2 ON MCR2.ID = MCRI.COLLECT_RECORD_ID
        LEFT JOIN SYS_DEPARTMENT SD ON SD.ID = MCR.DEPARTMENT_ID
        <where>
            MCR.DEL_FLAG = 0
            <if test="treeCode != null and treeCode !=''">
                AND SD.TREE_CODE LIKE CONCAT(#{treeCode},'%')
            </if>
            <if test="query.startTime != null and query.endTime != null">
                AND MCR.CHECKOUT_TIME BETWEEN #{query.startTime} AND #{query.endTime}
            </if>
            <if test="query.wasteTypeList != null and query.wasteTypeList.size()>0">
                AND MCR2.WASTE_TYPE IN
                <foreach collection="query.wasteTypeList" item="wasteType" separator="," open="(" close=")">
                    #{wasteType}
                </foreach>
            </if>
        </where>
    </select>
</mapper>
medicalWaste-system/src/main/resources/mapper/system/MwCollectRecordMapper.xml
@@ -207,5 +207,45 @@
        </where>
        ORDER BY mcr.CREATE_TIME DESC
    </select>
    <select id="getRegulationReportList" resultType="com.sinata.system.domain.vo.MwCollectRecordVO">
        SELECT MCR.ID,
        MCR.DEPARTMENT_ID,
        MCR.HOSPITAL_NAME,
        MCR.STAGING_ROOM_ID,
        MCR.MEDICAL_WASTE_NUMBER,
        MCR.BOX_ID,
        MCR.BOX_NUMBER,
        MCR.WASTE_TYPE,
        MCR.WASTE_TYPE_STR,
        MCR.WEIGHT,
        MCR.CHECKOUT_USER_ID,
        MCR.CHECKOUT_TIME,
        MCR.STATUS,
        MCR.BOX_TIME,
        MCR.DEL_FLAG,
        MCR.CREATE_BY,
        MCR.CREATE_TIME,
        MCR.UPDATE_BY,
        MCR.UPDATE_TIME,
        MCR.COLLECT_USER_ID,
        MCR.COLLECT_TIME
        FROM MW_COLLECT_RECORD MCR
        LEFT JOIN SYS_DEPARTMENT SD ON SD.ID = MCR.DEPARTMENT_ID
        <where>
            MCR.DEL_FLAG = 0
            <if test="treeCode != null and treeCode != ''">
                and SD.TREE_CODE = #{treeCode}
            </if>
            <if test="query.startTime != null and query.endTime != null">
                and MCR.COLLECT_TIME between #{query.startTime} and #{query.endTime}
            </if>
            <if test="query.wasteTypeCodeList != null and query.wasteTypeCodeList.size() > 0">
                and MCR.WASTE_TYPE in
                <foreach collection="query.wasteTypeCodeList" item="code" open="(" separator="," close=")">
                    #{code}
                </foreach>
            </if>
        </where>
    </select>
</mapper>
medicalWaste-system/src/main/resources/mapper/system/MwDisposalHandleRecordMapper.xml
New file
@@ -0,0 +1,30 @@
<?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="com.sinata.system.mapper.MwDisposalHandleRecordMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.sinata.system.domain.MwDisposalHandleRecord">
        <id column="ID" property="id" />
        <result column="DEL_FLAG" property="delFlag" />
        <result column="CREATE_BY" property="createBy" />
        <result column="CREATE_TIME" property="createTime" />
        <result column="UPDATE_BY" property="updateBy" />
        <result column="UPDATE_TIME" property="updateTime" />
        <result column="DEPARTMENT_ID" property="departmentId" />
        <result column="DISPOSAL_UNIT_NAME" property="disposalUnitName" />
        <result column="DISPOSAL_TIME" property="disposalTime" />
        <result column="DISPOSAL_USER_ID" property="disposalUserId" />
        <result column="DISPOSAL_RECORD_ID" property="disposalRecordId" />
    </resultMap>
    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        DEL_FLAG,
        CREATE_BY,
        CREATE_TIME,
        UPDATE_BY,
        UPDATE_TIME,
        ID, DEPARTMENT_ID, DISPOSAL_UNIT_NAME, DISPOSAL_TIME, DISPOSAL_USER_ID, DISPOSAL_RECORD_ID
    </sql>
</mapper>
medicalWaste-system/src/main/resources/mapper/system/MwDisposalRecordMapper.xml
@@ -79,5 +79,66 @@
        </where>
        GROUP BY MCR.BOX_ID
    </select>
    <select id="disposalReportByType" resultType="com.sinata.system.domain.vo.MwDisposalRecordReportVO">
        SELECT MCR.ID, MDR.RECEIVE_TIME, MDR.DISPOSAL_TIME, MCR.WASTE_TYPE, MCR.WEIGHT, MCR.STATUS
        FROM MW_DISPOSAL_RECORD MDR
        LEFT JOIN MW_DISPOSAL_RECORD_ITEM MDRI ON MDRI.DISPOSAL_RECORD_ID = MDR.ID
        LEFT JOIN MW_COLLECT_RECORD MCR ON MCR.ID = MDRI.COLLECT_RECORD_ID
        <where>
            <if test="query.departmentId != null">
                AND MDR.DEPARTMENT_ID = #{query.departmentId}
            </if>
            <!-- 判断 type 为 1 或 2 的状态条件 -->
            <choose>
                <when test="type == 1">
                    AND MCR.STATUS = 3
                </when>
                <when test="type == 2">
                    AND MCR.STATUS = 4
                </when>
            </choose>
            <if test="query.startTime != null and query.endTime != null">
                <choose>
                    <when test="type == 1">
                        AND MDR.RECEIVE_TIME BETWEEN #{query.startTime} AND #{query.endTime}
                    </when>
                    <when test="type == 2">
                        AND MDR.DISPOSAL_TIME BETWEEN #{query.startTime} AND #{query.endTime}
                    </when>
                </choose>
            </if>
            <if test="query.wasteTypeCodeList != null and query.wasteTypeCodeList.size()>0">
                AND MCR.WASTE_TYPE IN
                <foreach collection="query.wasteTypeCodeList" item="item" open="(" separator="," close=")">
                    #{item}
                </foreach>
            </if>
        </where>
    </select>
    <select id="getRegulationReportList" resultType="com.sinata.system.domain.vo.MwCollectRecordVO">
        SELECT MCR.ID,
        MCR.WASTE_TYPE,
        MCR.WEIGHT,
        MDR.DISPOSAL_TIME AS collectTime
        FROM MW_DISPOSAL_RECORD MDR
        LEFT JOIN MW_DISPOSAL_RECORD_ITEM MDRI ON MDRI.DISPOSAL_RECORD_ID = MDR.ID
        LEFT JOIN MW_COLLECT_RECORD MCR ON MCR.ID = MDRI.COLLECT_RECORD_ID
        LEFT JOIN SYS_DEPARTMENT SD ON SD.ID = MCR.DEPARTMENT_ID
        <where>
            MDR.DEL_FLAG = 0
            <if test="treeCode != null and treeCode != ''">
                AND SD.TREE_CODE LIKE CONCAT(#{treeCode}, '%')
            </if>
            <if test="query.startTime != null and query.endTime != null">
                AND MDR.DISPOSAL_TIME BETWEEN #{query.startTime} AND #{query.endTime}
            </if>
            <if test="query.wasteTypeList != null and query.wasteTypeList.size()>0">
                AND MCR.WASTE_TYPE IN
                <foreach collection="query.wasteTypeList" item="wasteType" separator="," open="(" close=")">
                    #{wasteType}
                </foreach>
            </if>
        </where>
    </select>
</mapper>
medicalWaste-system/src/main/resources/mapper/system/SysAgreementMapper.xml
medicalWaste-system/src/main/resources/mapper/system/SysDepartmentMapper.xml
@@ -219,6 +219,7 @@
        <where>
            SD.ORG_TYPE = 2 AND MTRP.ID = #{id}
        </where>
        ORDER BY MTRP.SORT_ORDER ASC
    </select>