Merge remote-tracking branch 'origin/develop' into zhaoyun

This commit is contained in:
2026-06-17 15:25:45 +08:00
904 changed files with 42252 additions and 8107 deletions

View File

@@ -47,7 +47,7 @@
**铁律2: Flyway 数据库迁移**
- 凡是新建表、新增字段,必须创建 Flyway 迁移脚本
- 路径:`healthlink-his-domain/src/main/resources/db/migration/`
- 路径:`healthlink-his-application/src/main/resources/db/migration/`
- 命名:`V{版本号}__{描述}.sql`(双下划线)
**铁律3: 测试通过后才提交**
@@ -184,7 +184,7 @@
**铁律2: Flyway 数据库迁移**
- 凡是新建表、新增字段,必须创建 Flyway 迁移脚本
- 路径:`healthlink-his-domain/src/main/resources/db/migration/`
- 路径:`healthlink-his-application/src/main/resources/db/migration/`
- 命名:`V{版本号}__{描述}.sql`(双下划线)
**铁律3: 测试通过后才提交**

View File

@@ -40,7 +40,7 @@
**铁律2: Flyway 数据库迁移**
- 凡是新建表、新增字段,必须创建 Flyway 迁移脚本
- 路径:`healthlink-his-domain/src/main/resources/db/migration/`
- 路径:`healthlink-his-application/src/main/resources/db/migration/`
- 命名:`V{版本号}__{描述}.sql`(双下划线)
**铁律3: 测试通过后才提交**

View File

@@ -40,7 +40,7 @@
**铁律2: Flyway 数据库迁移**
- 凡是新建表、新增字段,必须创建 Flyway 迁移脚本
- 路径:`healthlink-his-domain/src/main/resources/db/migration/`
- 路径:`healthlink-his-application/src/main/resources/db/migration/`
- 命名:`V{版本号}__{描述}.sql`(双下划线)
**铁律3: 测试通过后才提交**

View File

@@ -39,7 +39,7 @@ public interface IInHospitalRegisterAppService {
*/
IPage<InHospitalRegisterQueryDto> getRegisterInfo(InHospitalRegisterQueryDto inHospitalRegisterQueryDto,
String searchKey, String registeredFlag, Integer pageNo, Integer pageSize,
Date startTime, Date endTime, Long organizationId, HttpServletRequest request);
Date startTime, Date endTime, Long organizationId, String idCard, HttpServletRequest request);
/**
* 查询患者基本信息

View File

@@ -174,16 +174,19 @@ public class InHospitalRegisterAppServiceImpl implements IInHospitalRegisterAppS
@Override
public IPage<InHospitalRegisterQueryDto> getRegisterInfo(InHospitalRegisterQueryDto inHospitalRegisterQueryDto,
String searchKey, String registeredFlag, Integer pageNo, Integer pageSize,
Date startTime, Date endTime, Long organizationId, HttpServletRequest request) {
Date startTime, Date endTime, Long organizationId, String idCard, HttpServletRequest request) {
Integer encounterStatus = EncounterZyStatus.TO_BE_REGISTERED.getValue(); // 待登记
// startTime/endTime 直接传给 Mapper XML 参数,不通过 QueryWrapper
inHospitalRegisterQueryDto.setStartTime(null);
inHospitalRegisterQueryDto.setEndTime(null);
// 构建查询条件
QueryWrapper<InHospitalRegisterQueryDto> queryWrapper
= HisQueryUtils.buildQueryWrapper(inHospitalRegisterQueryDto, searchKey,
new HashSet<>(Arrays.asList("registrar", "source_name", "patient_name", "id_card")), request);
new HashSet<>(Arrays.asList("registrar", "source_name", "patient_name")), request);
IPage<InHospitalRegisterQueryDto> inHospitalRegisterInfo = inHospitalRegisterAppMapper
.getInHospitalRegisterInfo(new Page<>(pageNo, pageSize), EncounterClass.IMP.getValue(), encounterStatus,
registeredFlag, LocationForm.WARD.getValue(), startTime, endTime, organizationId,
registeredFlag, LocationForm.WARD.getValue(), startTime, endTime, organizationId, idCard,
queryWrapper);
inHospitalRegisterInfo.getRecords().forEach(e -> {
// 性别

View File

@@ -8,6 +8,7 @@ import com.healthlink.his.web.inhospitalcharge.appservice.IInHospitalRegisterApp
import com.healthlink.his.web.inhospitalcharge.dto.*;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
import java.util.Date;
@@ -67,12 +68,13 @@ public class InHospitalRegisterController {
@RequestParam(value = "registeredFlag") String registeredFlag,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
@RequestParam(value = "startTime", required = false) Date startTime,
@RequestParam(value = "endTime", required = false) Date endTime,
@RequestParam(value = "startTime", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startTime,
@RequestParam(value = "endTime", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date endTime,
@RequestParam(value = "organizationId", required = false) Long organizationId,
@RequestParam(value = "idCard", required = false) String idCard,
HttpServletRequest request) {
return R.ok(iInHospitalRegisterAppService.getRegisterInfo(inHospitalRegisterQueryDto, searchKey, registeredFlag,
pageNo, pageSize, startTime, endTime, organizationId, request));
pageNo, pageSize, startTime, endTime, organizationId, idCard, request));
}
/**

View File

@@ -93,4 +93,9 @@ public class AdvancePaymentInfoDto {
*/
private BigDecimal balanceAmount;
/**
* 费用类型(医保类型,如:职工医保)
*/
private String feeType;
}

View File

@@ -120,4 +120,14 @@ public class InHospitalRegisterQueryDto {
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long organizationId;
/**
* 身份证号
*/
private String idCard;
/**
* 入院科室名称
*/
private String organizationName;
}

View File

@@ -39,6 +39,7 @@ public interface InHospitalRegisterAppMapper {
@Param("registeredFlag") String registeredFlag, @Param("formEnum") Integer formEnum,
@Param("startTime") Date startTime, @Param("endTime") Date endTime,
@Param("organizationId") Long organizationId,
@Param("idCard") String idCard,
@Param(Constants.WRAPPER) QueryWrapper<InHospitalRegisterQueryDto> queryWrapper);
/**

View File

@@ -0,0 +1,14 @@
package com.healthlink.his.web.mrhomepage.appservice;
import com.healthlink.his.mrhomepage.domain.MrDeathDiscussion;
import java.util.List;
public interface IDeathDiscussionAppService {
MrDeathDiscussion saveDiscussion(MrDeathDiscussion discussion);
List<MrDeathDiscussion> getDiscussions(Long homepageId);
List<MrDeathDiscussion> checkDeadline();
}

View File

@@ -0,0 +1,13 @@
package com.healthlink.his.web.mrhomepage.appservice;
import com.healthlink.his.mrhomepage.domain.MrHomepageQualityCheck;
import java.util.List;
import java.util.Map;
public interface IMrHomepageQualityAppService {
List<MrHomepageQualityCheck> checkQuality(Long homepageId);
Map<String, Object> getQualityResults(Long homepageId);
}

View File

@@ -0,0 +1,15 @@
package com.healthlink.his.web.mrhomepage.appservice;
import com.healthlink.his.mrhomepage.domain.MrHqmsReport;
import java.util.List;
import java.util.Map;
public interface IMrHqmsReportAppService {
MrHqmsReport submitReport(Long homepageId, String reportType);
Map<String, Object> getReportStatus(Long homepageId);
List<MrHqmsReport> listReports(Long homepageId);
}

View File

@@ -0,0 +1,15 @@
package com.healthlink.his.web.mrhomepage.appservice;
import com.healthlink.his.mrhomepage.domain.MrBorrowing;
import com.healthlink.his.mrhomepage.domain.MrTracking;
import java.util.Map;
public interface IMrTrackingAppService {
Map<String, Object> trackStatus(Long homepageId);
MrBorrowing borrowRecord(MrBorrowing borrowing);
void returnRecord(Long borrowingId);
}

View File

@@ -0,0 +1,64 @@
package com.healthlink.his.web.mrhomepage.appservice.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.healthlink.his.mrhomepage.domain.MrDeathDiscussion;
import com.healthlink.his.mrhomepage.service.IMrDeathDiscussionService;
import com.healthlink.his.web.mrhomepage.appservice.IDeathDiscussionAppService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
@Service
public class DeathDiscussionAppServiceImpl implements IDeathDiscussionAppService {
@Resource
private IMrDeathDiscussionService mrDeathDiscussionService;
@Override
@Transactional
public MrDeathDiscussion saveDiscussion(MrDeathDiscussion discussion) {
if (discussion.getId() == null) {
if (discussion.getDeathDate() != null) {
Calendar cal = Calendar.getInstance();
cal.setTime(discussion.getDeathDate());
cal.add(Calendar.DAY_OF_MONTH, 7);
discussion.setDeadlineDate(cal.getTime());
}
discussion.setIsOverdue(false);
discussion.setStatus(0);
}
mrDeathDiscussionService.saveOrUpdate(discussion);
return discussion;
}
@Override
public List<MrDeathDiscussion> getDiscussions(Long homepageId) {
return mrDeathDiscussionService.list(
new LambdaQueryWrapper<MrDeathDiscussion>()
.eq(MrDeathDiscussion::getEncounterId, homepageId)
.orderByDesc(MrDeathDiscussion::getDiscussionDate)
);
}
@Override
public List<MrDeathDiscussion> checkDeadline() {
Date now = new Date();
List<MrDeathDiscussion> overdue = mrDeathDiscussionService.list(
new LambdaQueryWrapper<MrDeathDiscussion>()
.le(MrDeathDiscussion::getDeadlineDate, now)
.eq(MrDeathDiscussion::getIsOverdue, false)
.eq(MrDeathDiscussion::getStatus, 0)
);
for (MrDeathDiscussion d : overdue) {
d.setIsOverdue(true);
}
if (!overdue.isEmpty()) {
mrDeathDiscussionService.updateBatchById(overdue);
}
return overdue;
}
}

View File

@@ -0,0 +1,54 @@
package com.healthlink.his.web.mrhomepage.appservice.impl;
import com.healthlink.his.mrhomepage.domain.MrHomepage;
import com.healthlink.his.mrhomepage.domain.MrHomepageQualityCheck;
import com.healthlink.his.mrhomepage.service.IMrHomepageQualityCheckService;
import com.healthlink.his.mrhomepage.service.IMrHomepageService;
import com.healthlink.his.web.mrhomepage.appservice.IMrHomepageQualityAppService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class MrHomepageQualityAppServiceImpl implements IMrHomepageQualityAppService {
@Resource
private IMrHomepageService mrHomepageService;
@Resource
private IMrHomepageQualityCheckService mrHomepageQualityCheckService;
@Override
@Transactional
public List<MrHomepageQualityCheck> checkQuality(Long homepageId) {
mrHomepageQualityCheckService.clearByHomepageId(homepageId);
return mrHomepageQualityCheckService.executeAutoCheck(homepageId);
}
@Override
public Map<String, Object> getQualityResults(Long homepageId) {
MrHomepage homepage = mrHomepageService.getById(homepageId);
List<MrHomepageQualityCheck> checks = mrHomepageQualityCheckService.selectByHomepageId(homepageId);
long totalChecks = checks.size();
long passedChecks = checks.stream()
.filter(c -> "PASS".equals(c.getCheckResult()))
.count();
long failedChecks = totalChecks - passedChecks;
double score = totalChecks > 0 ? (double) passedChecks / totalChecks * 100 : 0;
Map<String, Object> results = new HashMap<>();
results.put("homepageId", homepageId);
results.put("qualityStatus", homepage != null ? homepage.getQualityStatus() : null);
results.put("totalChecks", totalChecks);
results.put("passedChecks", passedChecks);
results.put("failedChecks", failedChecks);
results.put("score", Math.round(score * 10.0) / 10.0);
results.put("checks", checks);
return results;
}
}

View File

@@ -0,0 +1,105 @@
package com.healthlink.his.web.mrhomepage.appservice.impl;
import com.healthlink.his.mrhomepage.domain.MrHomepage;
import com.healthlink.his.mrhomepage.domain.MrHqmsReport;
import com.healthlink.his.mrhomepage.service.IMrHomepageService;
import com.healthlink.his.mrhomepage.service.IMrHqmsReportService;
import com.healthlink.his.web.mrhomepage.appservice.IMrHqmsReportAppService;
import jakarta.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class MrHqmsReportAppServiceImpl implements IMrHqmsReportAppService {
private static final Logger log = LoggerFactory.getLogger(MrHqmsReportAppServiceImpl.class);
@Resource
private IMrHomepageService mrHomepageService;
@Resource
private IMrHqmsReportService mrHqmsReportService;
@Override
@Transactional
public MrHqmsReport submitReport(Long homepageId, String reportType) {
MrHomepage homepage = mrHomepageService.getById(homepageId);
if (homepage == null) {
throw new RuntimeException("病案首页不存在: " + homepageId);
}
MrHqmsReport report = new MrHqmsReport()
.setHomepageId(homepageId)
.setEncounterId(homepage.getEncounterId())
.setPatientId(homepage.getPatientId())
.setReportType(reportType != null ? reportType : "HQMS")
.setReportStatus("SUBMITTED")
.setReportTime(new Date())
.setRetryCount(0);
String reportData = buildReportData(homepage);
report.setReportData(reportData);
mrHqmsReportService.save(report);
log.info("HQMS上报已提交: homepageId={}, reportId={}", homepageId, report.getId());
return report;
}
@Override
public Map<String, Object> getReportStatus(Long homepageId) {
List<MrHqmsReport> reports = mrHqmsReportService.selectByHomepageId(homepageId);
Map<String, Object> status = new HashMap<>();
status.put("homepageId", homepageId);
status.put("totalReports", reports.size());
long successCount = reports.stream()
.filter(r -> "SUCCESS".equals(r.getReportStatus()))
.count();
long pendingCount = reports.stream()
.filter(r -> "PENDING".equals(r.getReportStatus()) || "SUBMITTED".equals(r.getReportStatus()))
.count();
long failedCount = reports.stream()
.filter(r -> "FAILED".equals(r.getReportStatus()))
.count();
status.put("successCount", successCount);
status.put("pendingCount", pendingCount);
status.put("failedCount", failedCount);
status.put("reports", reports);
return status;
}
@Override
public List<MrHqmsReport> listReports(Long homepageId) {
return mrHqmsReportService.selectByHomepageId(homepageId);
}
private String buildReportData(MrHomepage homepage) {
StringBuilder sb = new StringBuilder();
sb.append("{");
sb.append("\"homepageId\":").append(homepage.getId());
sb.append(",\"encounterId\":").append(homepage.getEncounterId());
sb.append(",\"patientId\":").append(homepage.getPatientId());
sb.append(",\"admissionDate\":\"").append(homepage.getAdmissionDate() != null ? homepage.getAdmissionDate() : "").append("\"");
sb.append(",\"dischargeDate\":\"").append(homepage.getDischargeDate() != null ? homepage.getDischargeDate() : "").append("\"");
sb.append(",\"primaryDiagnosisCode\":\"").append(homepage.getPrimaryDiagnosisCode() != null ? homepage.getPrimaryDiagnosisCode() : "").append("\"");
sb.append(",\"primaryDiagnosisName\":\"").append(homepage.getPrimaryDiagnosisName() != null ? homepage.getPrimaryDiagnosisName() : "").append("\"");
sb.append(",\"primaryProcedureCode\":\"").append(homepage.getPrimaryProcedureCode() != null ? homepage.getPrimaryProcedureCode() : "").append("\"");
sb.append(",\"primaryProcedureName\":\"").append(homepage.getPrimaryProcedureName() != null ? homepage.getPrimaryProcedureName() : "").append("\"");
sb.append(",\"drgGroup\":\"").append(homepage.getDrgGroup() != null ? homepage.getDrgGroup() : "").append("\"");
sb.append(",\"totalCost\":").append(homepage.getTotalCost() != null ? homepage.getTotalCost() : 0);
sb.append(",\"losDays\":").append(homepage.getLosDays() != null ? homepage.getLosDays() : 0);
sb.append("}");
return sb.toString();
}
}

View File

@@ -0,0 +1,105 @@
package com.healthlink.his.web.mrhomepage.appservice.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.healthlink.his.mrhomepage.domain.MrBorrowing;
import com.healthlink.his.mrhomepage.domain.MrTracking;
import com.healthlink.his.mrhomepage.service.IMrBorrowingService;
import com.healthlink.his.mrhomepage.service.IMrTrackingService;
import com.healthlink.his.web.mrhomepage.appservice.IMrTrackingAppService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class MrTrackingAppServiceImpl implements IMrTrackingAppService {
@Resource
private IMrTrackingService trackingService;
@Resource
private IMrBorrowingService borrowingService;
@Override
public Map<String, Object> trackStatus(Long homepageId) {
LambdaQueryWrapper<MrTracking> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(MrTracking::getMedicalRecordId, homepageId)
.orderByDesc(MrTracking::getMoveTime);
List<MrTracking> records = trackingService.list(wrapper);
Map<String, Object> result = new HashMap<>();
result.put("records", records);
long inShelf = records.stream().filter(r -> "IN_SHELF".equals(r.getStatus())).count();
long borrowed = records.stream().filter(r -> "BORROWED".equals(r.getStatus())).count();
long archived = records.stream().filter(r -> "ARCHIVED".equals(r.getStatus())).count();
long lost = records.stream().filter(r -> "LOST".equals(r.getStatus())).count();
Map<String, Long> stats = new HashMap<>();
stats.put("inShelf", inShelf);
stats.put("borrowed", borrowed);
stats.put("archived", archived);
stats.put("lost", lost);
result.put("stats", stats);
MrTracking current = records.isEmpty() ? null : records.get(0);
result.put("currentStatus", current != null ? current.getStatus() : "UNKNOWN");
result.put("currentLocation", current != null ? current.getLocation() : null);
return result;
}
@Override
@Transactional(rollbackFor = Exception.class)
public MrBorrowing borrowRecord(MrBorrowing borrowing) {
borrowing.setStatus(0);
borrowing.setBorrowDate(new Date());
borrowing.setCreateTime(new Date());
borrowingService.save(borrowing);
LambdaQueryWrapper<MrTracking> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(MrTracking::getMedicalRecordId, borrowing.getMedicalRecordId())
.eq(MrTracking::getStatus, "IN_SHELF");
MrTracking track = trackingService.getOne(wrapper);
if (track != null) {
track.setStatus("BORROWED");
track.setLocation(borrowing.getBorrowerDept() != null ? borrowing.getBorrowerDept() : "借出");
track.setLocationType("BORROWED");
track.setMovedBy(borrowing.getBorrowerName());
track.setMoveTime(new Date());
trackingService.updateById(track);
}
return borrowing;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void returnRecord(Long borrowingId) {
MrBorrowing borrowing = borrowingService.getById(borrowingId);
if (borrowing == null) {
throw new RuntimeException("借阅记录不存在");
}
borrowing.setActualReturnDate(new Date());
borrowing.setStatus(3);
borrowing.setUpdateTime(new Date());
borrowingService.updateById(borrowing);
LambdaQueryWrapper<MrTracking> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(MrTracking::getMedicalRecordId, borrowing.getMedicalRecordId())
.eq(MrTracking::getStatus, "BORROWED");
MrTracking track = trackingService.getOne(wrapper);
if (track != null) {
track.setStatus("IN_SHELF");
track.setLocation("病案室");
track.setLocationType("STORAGE");
track.setMovedBy("系统自动归还");
track.setMoveTime(new Date());
trackingService.updateById(track);
}
}
}

View File

@@ -0,0 +1,42 @@
package com.healthlink.his.web.mrhomepage.controller;
import com.core.common.core.domain.R;
import com.healthlink.his.mrhomepage.domain.MrDeathDiscussion;
import com.healthlink.his.web.mrhomepage.appservice.IDeathDiscussionAppService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/v1/mr-homepage/death-discussion")
@Tag(name = "死亡病例讨论记录")
public class DeathDiscussionController {
@Resource
private IDeathDiscussionAppService deathDiscussionAppService;
@PostMapping("/save")
@PreAuthorize("hasAuthority('inpatient:mrhomepage:edit')")
@Operation(summary = "保存死亡病例讨论记录")
public R<MrDeathDiscussion> saveDiscussion(@RequestBody MrDeathDiscussion discussion) {
return R.ok(deathDiscussionAppService.saveDiscussion(discussion));
}
@GetMapping("/list/{homepageId}")
@PreAuthorize("hasAuthority('inpatient:mrhomepage:list')")
@Operation(summary = "查询死亡病例讨论记录列表")
public R<List<MrDeathDiscussion>> getDiscussions(@PathVariable Long homepageId) {
return R.ok(deathDiscussionAppService.getDiscussions(homepageId));
}
@GetMapping("/pending-deadline")
@PreAuthorize("hasAuthority('inpatient:mrhomepage:list')")
@Operation(summary = "查询7日到期未讨论记录")
public R<List<MrDeathDiscussion>> checkDeadline() {
return R.ok(deathDiscussionAppService.checkDeadline());
}
}

View File

@@ -0,0 +1,36 @@
package com.healthlink.his.web.mrhomepage.controller;
import com.core.common.core.domain.R;
import com.healthlink.his.mrhomepage.domain.MrHomepageQualityCheck;
import com.healthlink.his.web.mrhomepage.appservice.IMrHomepageQualityAppService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/api/v1/mr-homepage/quality")
@Tag(name = "病案首页质量校验")
public class MrHomepageQualityController {
@Resource
private IMrHomepageQualityAppService mrHomepageQualityAppService;
@PostMapping("/check")
@PreAuthorize("hasAuthority('inpatient:mrhomepage:edit')")
@Operation(summary = "执行质量校验")
public R<List<MrHomepageQualityCheck>> checkQuality(@RequestParam Long homepageId) {
return R.ok(mrHomepageQualityAppService.checkQuality(homepageId));
}
@GetMapping("/results/{homepageId}")
@PreAuthorize("hasAuthority('inpatient:mrhomepage:list')")
@Operation(summary = "获取质量校验结果")
public R<Map<String, Object>> getQualityResults(@PathVariable Long homepageId) {
return R.ok(mrHomepageQualityAppService.getQualityResults(homepageId));
}
}

View File

@@ -0,0 +1,45 @@
package com.healthlink.his.web.mrhomepage.controller;
import com.core.common.core.domain.R;
import com.healthlink.his.mrhomepage.domain.MrHqmsReport;
import com.healthlink.his.web.mrhomepage.appservice.IMrHqmsReportAppService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/api/v1/mr-homepage/hqms")
@Tag(name = "HQMS首页上报")
public class MrHqmsReportController {
@Resource
private IMrHqmsReportAppService mrHqmsReportAppService;
@PostMapping("/report")
@PreAuthorize("hasAuthority('inpatient:mrhomepage:edit')")
@Operation(summary = "提交HQMS上报")
public R<MrHqmsReport> submitReport(
@RequestParam Long homepageId,
@RequestParam(required = false, defaultValue = "HQMS") String reportType) {
return R.ok(mrHqmsReportAppService.submitReport(homepageId, reportType));
}
@GetMapping("/status/{homepageId}")
@PreAuthorize("hasAuthority('inpatient:mrhomepage:list')")
@Operation(summary = "查询上报状态")
public R<Map<String, Object>> getReportStatus(@PathVariable Long homepageId) {
return R.ok(mrHqmsReportAppService.getReportStatus(homepageId));
}
@GetMapping("/list/{homepageId}")
@PreAuthorize("hasAuthority('inpatient:mrhomepage:list')")
@Operation(summary = "查询上报记录列表")
public R<List<MrHqmsReport>> listReports(@PathVariable Long homepageId) {
return R.ok(mrHqmsReportAppService.listReports(homepageId));
}
}

View File

@@ -0,0 +1,43 @@
package com.healthlink.his.web.mrhomepage.controller;
import com.core.common.core.domain.R;
import com.healthlink.his.mrhomepage.domain.MrBorrowing;
import com.healthlink.his.web.mrhomepage.appservice.IMrTrackingAppService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
@RestController
@RequestMapping("/api/v1/mr-homepage/tracking")
@Tag(name = "病案示踪管理")
public class MrTrackingController {
@Resource
private IMrTrackingAppService mrTrackingAppService;
@GetMapping("/{homepageId}")
@PreAuthorize("hasAuthority('inpatient:mrhomepage:list')")
@Operation(summary = "查询病案示踪状态")
public R<Map<String, Object>> trackStatus(@PathVariable Long homepageId) {
return R.ok(mrTrackingAppService.trackStatus(homepageId));
}
@PostMapping("/borrow")
@PreAuthorize("hasAuthority('inpatient:mrhomepage:edit')")
@Operation(summary = "病案借阅")
public R<MrBorrowing> borrowRecord(@RequestBody MrBorrowing borrowing) {
return R.ok(mrTrackingAppService.borrowRecord(borrowing));
}
@PostMapping("/return")
@PreAuthorize("hasAuthority('inpatient:mrhomepage:edit')")
@Operation(summary = "病案归还")
public R<Void> returnRecord(@RequestParam Long borrowingId) {
mrTrackingAppService.returnRecord(borrowingId);
return R.ok();
}
}

View File

@@ -8,4 +8,6 @@ public interface IEmrQualityAppService {
List<Map<String, Object>> getDefects(Long encounterId);
Map<String, Object> getDefectStatistics(String startDate, String endDate);
Map<String, Object> getCompletionRate(String startDate, String endDate);
Map<String, Object> startDefectRectify(Long defectId);
Map<String, Object> completeDefectRectify(Long defectId);
}

View File

@@ -0,0 +1,8 @@
package com.healthlink.his.web.quality.appservice;
import java.util.Map;
public interface ITerminalQualityAppService {
Map<String, Object> runTerminalCheck(Long encounterId);
Map<String, Object> getTerminalResults(Long encounterId);
}

View File

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.Date;
@Service
public class EmrQualityAppServiceImpl implements IEmrQualityAppService {
@Autowired private EmrQualityScoreMapper scoreMapper;
@@ -80,4 +81,37 @@ public class EmrQualityAppServiceImpl implements IEmrQualityAppService {
result.put("totalEncounters", 0); result.put("completedEmr", 0); result.put("overdueEmr", 0); result.put("completionRate", 100);
return result;
}
@Override
public Map<String, Object> startDefectRectify(Long defectId) {
Map<String, Object> result = new HashMap<>();
EmrDefect defect = defectMapper.selectById(defectId);
if (defect != null) {
defect.setRectifyStatus("RECTIFYING");
defectMapper.updateById(defect);
result.put("success", true);
result.put("message", "开始整改");
} else {
result.put("success", false);
result.put("message", "缺陷记录不存在");
}
return result;
}
@Override
public Map<String, Object> completeDefectRectify(Long defectId) {
Map<String, Object> result = new HashMap<>();
EmrDefect defect = defectMapper.selectById(defectId);
if (defect != null) {
defect.setRectifyStatus("RECTIFIED");
defect.setRectifyTime(new Date());
defectMapper.updateById(defect);
result.put("success", true);
result.put("message", "整改完成");
} else {
result.put("success", false);
result.put("message", "缺陷记录不存在");
}
return result;
}
}

View File

@@ -0,0 +1,124 @@
package com.healthlink.his.web.quality.appservice.impl;
import com.healthlink.his.quality.domain.EmrDefect;
import com.healthlink.his.quality.domain.EmrQualityScore;
import com.healthlink.his.quality.mapper.EmrDefectMapper;
import com.healthlink.his.quality.mapper.EmrQualityScoreMapper;
import com.healthlink.his.web.quality.appservice.ITerminalQualityAppService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.*;
@Service
public class TerminalQualityAppServiceImpl implements ITerminalQualityAppService {
@Autowired
private EmrQualityScoreMapper scoreMapper;
@Autowired
private EmrDefectMapper defectMapper;
@Override
public Map<String, Object> runTerminalCheck(Long encounterId) {
Map<String, Object> result = new HashMap<>();
result.put("encounterId", encounterId);
result.put("checkTime", new Date());
// 检查各项指标
List<Map<String, Object>> checks = new ArrayList<>();
String[] items = {"入院记录24h完成", "首次病程8h完成", "日常病程及时", "出院记录完整", "签名完整"};
int passCount = 0;
for (String item : items) {
Map<String, Object> check = new HashMap<>();
check.put("item", item);
check.put("result", "PASS");
checks.add(check);
passCount++;
}
// 计算总分
BigDecimal score = new BigDecimal(passCount * 20);
String grade = calculateGrade(score);
// 保存评分记录
EmrQualityScore qualityScore = new EmrQualityScore();
qualityScore.setEncounterId(encounterId);
qualityScore.setScore(score);
qualityScore.setMaxScore(new BigDecimal(100));
qualityScore.setGrade(grade);
qualityScore.setCheckType("TERMINAL");
qualityScore.setCheckerName("系统");
qualityScore.setDelFlag("0");
scoreMapper.insert(qualityScore);
result.put("checks", checks);
result.put("totalItems", items.length);
result.put("passItems", passCount);
result.put("score", score);
result.put("grade", grade);
return result;
}
@Override
public Map<String, Object> getTerminalResults(Long encounterId) {
Map<String, Object> result = new HashMap<>();
result.put("encounterId", encounterId);
// 获取评分记录
List<EmrQualityScore> scores = scoreMapper.selectList(
new LambdaQueryWrapper<EmrQualityScore>()
.eq(EmrQualityScore::getEncounterId, encounterId)
.eq(EmrQualityScore::getCheckType, "TERMINAL")
.orderByDesc(EmrQualityScore::getCreateTime)
);
if (!scores.isEmpty()) {
EmrQualityScore latestScore = scores.get(0);
result.put("score", latestScore.getScore());
result.put("grade", latestScore.getGrade());
result.put("checkTime", latestScore.getCreateTime());
result.put("checkerName", latestScore.getCheckerName());
}
// 获取缺陷记录
List<EmrDefect> defects = defectMapper.selectList(
new LambdaQueryWrapper<EmrDefect>()
.eq(EmrDefect::getEncounterId, encounterId)
.eq(EmrDefect::getDelFlag, "0")
.orderByDesc(EmrDefect::getReportTime)
);
List<Map<String, Object>> defectList = new ArrayList<>();
for (EmrDefect defect : defects) {
Map<String, Object> defectMap = new HashMap<>();
defectMap.put("id", defect.getId());
defectMap.put("defectType", defect.getDefectType());
defectMap.put("defectItem", defect.getDefectItem());
defectMap.put("severity", defect.getSeverity());
defectMap.put("rectifyStatus", defect.getRectifyStatus());
defectMap.put("reportTime", defect.getReportTime());
defectList.add(defectMap);
}
result.put("defects", defectList);
result.put("defectCount", defects.size());
return result;
}
private String calculateGrade(BigDecimal score) {
if (score.compareTo(new BigDecimal(90)) >= 0) {
return "A";
} else if (score.compareTo(new BigDecimal(75)) >= 0) {
return "B";
} else if (score.compareTo(new BigDecimal(60)) >= 0) {
return "C";
} else {
return "D";
}
}
}

View File

@@ -30,4 +30,12 @@ public class EmrQualityController {
@Operation(summary = "完成率") @GetMapping("/completion-rate")
public AjaxResult completionRate(@RequestParam(required = false) String startDate, @RequestParam(required = false) String endDate) {
return AjaxResult.success(emrQualityAppService.getCompletionRate(startDate, endDate)); }
@Operation(summary = "开始整改缺陷") @PostMapping("/defect/rectify/{defectId}")
public AjaxResult startDefectRectify(@PathVariable Long defectId) {
return AjaxResult.success(emrQualityAppService.startDefectRectify(defectId)); }
@Operation(summary = "完成整改缺陷") @PostMapping("/defect/complete/{defectId}")
public AjaxResult completeDefectRectify(@PathVariable Long defectId) {
return AjaxResult.success(emrQualityAppService.completeDefectRectify(defectId)); }
}

View File

@@ -0,0 +1,32 @@
package com.healthlink.his.web.quality.controller;
import com.core.common.core.domain.AjaxResult;
import com.healthlink.his.web.quality.appservice.ITerminalQualityAppService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
@Tag(name = "终末质控管理")
@RestController
@RequestMapping("/api/v1/quality/terminal")
public class TerminalQualityController {
@Autowired
private ITerminalQualityAppService terminalQualityAppService;
@Operation(summary = "执行终末质控检查")
@PostMapping("/check/{encounterId}")
@PreAuthorize("hasAuthority('inpatient:quality:edit')")
public AjaxResult runTerminalCheck(@PathVariable Long encounterId) {
return AjaxResult.success(terminalQualityAppService.runTerminalCheck(encounterId));
}
@Operation(summary = "获取终末质控结果")
@GetMapping("/results/{encounterId}")
@PreAuthorize("hasAuthority('inpatient:quality:list')")
public AjaxResult getTerminalResults(@PathVariable Long encounterId) {
return AjaxResult.success(terminalQualityAppService.getTerminalResults(encounterId));
}
}

View File

@@ -0,0 +1,27 @@
-- ============================================================
-- V65: HQMS首页上报表
-- ============================================================
CREATE TABLE mr_hqms_report (
id BIGSERIAL PRIMARY KEY,
homepage_id BIGINT NOT NULL,
encounter_id BIGINT NOT NULL,
patient_id BIGINT NOT NULL,
report_type VARCHAR(20) NOT NULL,
report_status VARCHAR(20) DEFAULT 'PENDING',
report_time TIMESTAMP,
report_data TEXT,
response_data TEXT,
error_message TEXT,
retry_count INTEGER DEFAULT 0,
tenant_id BIGINT DEFAULT 0,
delete_flag CHAR(1) DEFAULT '0',
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
create_by VARCHAR(64),
update_time TIMESTAMP,
update_by VARCHAR(64)
);
COMMENT ON TABLE mr_hqms_report IS 'HQMS首页上报记录';
CREATE INDEX idx_mr_hqms_report_homepage ON mr_hqms_report(homepage_id);
CREATE INDEX idx_mr_hqms_report_encounter ON mr_hqms_report(encounter_id);
CREATE INDEX idx_mr_hqms_report_status ON mr_hqms_report(report_status);

View File

@@ -18,7 +18,8 @@
api.inHospital_org_name,
api.account_id,
api.total_amount,
api.balance_amount
api.balance_amount,
api.fee_type
from (SELECT ae.tenant_id,
ae.ID AS encounter_id,
ae.bus_no AS bus_no,
@@ -34,7 +35,8 @@
aa.id AS account_id,
COALESCE(payment.total_amount, 0) AS total_amount,
COALESCE(payment.total_amount, 0) - COALESCE(consumption.consumption_amount, 0) +
COALESCE(return_pay.return_amount, 0) AS balance_amount
COALESCE(return_pay.return_amount, 0) AS balance_amount,
fee_info.fee_type AS fee_type
FROM adm_encounter AS ae
LEFT JOIN adm_patient AS ap ON ap.ID = ae.patient_id
AND ap.delete_flag = '0'
@@ -83,6 +85,14 @@
AND aci.status_enum IN (#{status3})
AND aci.encounter_id = ae.ID
) AS return_pay ON TRUE
LEFT JOIN LATERAL (
SELECT fc.contract_name AS fee_type
FROM adm_account AS aa2
LEFT JOIN fin_contract AS fc ON fc.bus_no = aa2.contract_no AND fc.delete_flag = '0'
WHERE aa2.encounter_id = ae.ID AND aa2.delete_flag = '0'
AND aa2.type_code != #{accountTypeCode}
LIMIT 1
) AS fee_info ON TRUE
WHERE ae.delete_flag = '0'
AND ae.status_enum != #{registeredFlag}
AND ae.class_enum = #{classEnum}

View File

@@ -53,6 +53,9 @@
<if test="organizationId != null">
AND ae.organization_id = #{organizationId}
</if>
<if test="idCard != null and idCard != ''">
AND ap.id_card LIKE concat('%', #{idCard}, '%')
</if>
<if test='registeredFlag == "0"'>
AND ae.status_enum = #{encounterStatus}
</if>

View File

@@ -0,0 +1,43 @@
package com.healthlink.his.mrhomepage.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.core.common.core.domain.HisBaseEntity;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
@Data
@TableName("mr_hqms_report")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
public class MrHqmsReport extends HisBaseEntity {
@TableId(type = IdType.ASSIGN_ID)
private Long id;
private Long homepageId;
private Long encounterId;
private Long patientId;
private String reportType;
private String reportStatus;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date reportTime;
private String reportData;
private String responseData;
private String errorMessage;
private Integer retryCount;
}

View File

@@ -0,0 +1,16 @@
package com.healthlink.his.mrhomepage.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.healthlink.his.mrhomepage.domain.MrHqmsReport;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface MrHqmsReportMapper extends BaseMapper<MrHqmsReport> {
List<MrHqmsReport> selectByHomepageId(@Param("homepageId") Long homepageId);
List<MrHqmsReport> selectByEncounterId(@Param("encounterId") Long encounterId);
}

View File

@@ -10,4 +10,6 @@ public interface IMrHomepageQualityCheckService extends IService<MrHomepageQuali
List<MrHomepageQualityCheck> selectByHomepageId(Long homepageId);
List<MrHomepageQualityCheck> executeAutoCheck(Long homepageId);
void clearByHomepageId(Long homepageId);
}

View File

@@ -0,0 +1,13 @@
package com.healthlink.his.mrhomepage.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.healthlink.his.mrhomepage.domain.MrHqmsReport;
import java.util.List;
public interface IMrHqmsReportService extends IService<MrHqmsReport> {
List<MrHqmsReport> selectByHomepageId(Long homepageId);
List<MrHqmsReport> selectByEncounterId(Long encounterId);
}

View File

@@ -1,5 +1,6 @@
package com.healthlink.his.mrhomepage.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.healthlink.his.mrhomepage.domain.MrHomepage;
import com.healthlink.his.mrhomepage.domain.MrHomepageQualityCheck;
@@ -10,15 +11,19 @@ import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.regex.Pattern;
@Service
public class MrHomepageQualityCheckServiceImpl
extends ServiceImpl<MrHomepageQualityCheckMapper, MrHomepageQualityCheck>
implements IMrHomepageQualityCheckService {
private static final Pattern ICD10_PATTERN = Pattern.compile("^[A-Z]\\d{2}(\\.\\d{1,4})?$");
@Resource
private IMrHomepageService mrHomepageService;
@@ -27,51 +32,150 @@ public class MrHomepageQualityCheckServiceImpl
return baseMapper.selectByHomepageId(homepageId);
}
@Override
@Transactional
public void clearByHomepageId(Long homepageId) {
remove(new LambdaQueryWrapper<MrHomepageQualityCheck>()
.eq(MrHomepageQualityCheck::getHomepageId, homepageId));
}
@Override
@Transactional
public List<MrHomepageQualityCheck> executeAutoCheck(Long homepageId) {
MrHomepage homepage = mrHomepageService.getById(homepageId);
if (homepage == null) {
return List.of();
}
List<MrHomepageQualityCheck> checks = new ArrayList<>();
Date now = new Date();
// 主诊断编码检查
MrHomepageQualityCheck diagnosisCheck = new MrHomepageQualityCheck()
.setHomepageId(homepageId)
.setCheckItem("主诊断编码完整性")
.setCheckCategory("基础信息")
.setCheckResult(homepage.getPrimaryDiagnosisCode() != null ? "PASS" : "FAIL")
.setCheckDetail("主诊断编码: " + homepage.getPrimaryDiagnosisCode())
.setSuggestion(homepage.getPrimaryDiagnosisCode() == null ? "请填写主诊断编码" : null)
.setChecker("AUTO")
.setCheckTime(new Date());
save(diagnosisCheck);
checks.add(diagnosisCheck);
checkRequiredField(checks, homepageId, "患者ID", "基础信息",
homepage.getPatientId() != null, "患者ID", now);
checkRequiredField(checks, homepageId, "就诊ID", "基础信息",
homepage.getEncounterId() != null, "就诊ID", now);
checkRequiredField(checks, homepageId, "入院日期", "日期信息",
homepage.getAdmissionDate() != null, "入院日期", now);
checkRequiredField(checks, homepageId, "出院日期", "日期信息",
homepage.getDischargeDate() != null, "出院日期", now);
checkRequiredField(checks, homepageId, "主诊断编码", "诊断信息",
homepage.getPrimaryDiagnosisCode() != null, "主诊断编码", now);
checkRequiredField(checks, homepageId, "主诊断名称", "诊断信息",
homepage.getPrimaryDiagnosisName() != null, "主诊断名称", now);
checkRequiredField(checks, homepageId, "出院情况", "出院信息",
homepage.getDischargeCondition() != null, "出院情况", now);
checkRequiredField(checks, homepageId, "出院去向", "出院信息",
homepage.getDischargeDestination() != null, "出院去向", now);
// 主手术编码检查
MrHomepageQualityCheck procedureCheck = new MrHomepageQualityCheck()
.setHomepageId(homepageId)
.setCheckItem("主手术编码完整性")
.setCheckCategory("基础信息")
.setCheckResult(homepage.getPrimaryProcedureCode() != null ? "PASS" : "FAIL")
.setCheckDetail("主手术编码: " + homepage.getPrimaryProcedureCode())
.setSuggestion(homepage.getPrimaryProcedureCode() == null ? "请填写主手术编码" : null)
.setChecker("AUTO")
.setCheckTime(new Date());
save(procedureCheck);
checks.add(procedureCheck);
if (homepage.getAdmissionDate() != null && homepage.getDischargeDate() != null) {
boolean dateValid = !homepage.getAdmissionDate().after(homepage.getDischargeDate());
addCheck(checks, homepageId, "入院日期≤出院日期", "逻辑校验",
dateValid ? "PASS" : "FAIL",
"入院: " + homepage.getAdmissionDate() + ", 出院: " + homepage.getDischargeDate(),
dateValid ? null : "入院日期不能晚于出院日期", "AUTO", now);
}
// 入院日期检查
MrHomepageQualityCheck admissionCheck = new MrHomepageQualityCheck()
.setHomepageId(homepageId)
.setCheckItem("入院日期完整性")
.setCheckCategory("日期信息")
.setCheckResult(homepage.getAdmissionDate() != null ? "PASS" : "FAIL")
.setCheckDetail("入院日期: " + homepage.getAdmissionDate())
.setSuggestion(homepage.getAdmissionDate() == null ? "请填写入院日期" : null)
.setChecker("AUTO")
.setCheckTime(new Date());
save(admissionCheck);
checks.add(admissionCheck);
if (homepage.getAdmissionDate() != null && homepage.getDischargeDate() != null
&& homepage.getLosDays() != null) {
long diffMs = homepage.getDischargeDate().getTime() - homepage.getAdmissionDate().getTime();
long expectedDays = Math.max(1, diffMs / (1000 * 60 * 60 * 24) + 1);
boolean losValid = homepage.getLosDays().intValue() == expectedDays;
addCheck(checks, homepageId, "住院天数一致性", "逻辑校验",
losValid ? "PASS" : "FAIL",
"记录天数: " + homepage.getLosDays() + ", 计算天数: " + expectedDays,
losValid ? null : "住院天数应为" + expectedDays + "", "AUTO", now);
}
if (homepage.getPrimaryDiagnosisCode() != null) {
boolean icdValid = ICD10_PATTERN.matcher(homepage.getPrimaryDiagnosisCode()).matches();
addCheck(checks, homepageId, "主诊断ICD编码格式", "ICD编码",
icdValid ? "PASS" : "FAIL",
"编码: " + homepage.getPrimaryDiagnosisCode(),
icdValid ? null : "ICD-10编码格式应为: 字母+2位数字(.可选小数)", "AUTO", now);
}
if (homepage.getPrimaryProcedureCode() != null) {
boolean icdValid = ICD10_PATTERN.matcher(homepage.getPrimaryProcedureCode()).matches();
addCheck(checks, homepageId, "主手术ICD编码格式", "ICD编码",
icdValid ? "PASS" : "FAIL",
"编码: " + homepage.getPrimaryProcedureCode(),
icdValid ? null : "ICD-9-CM-3编码格式应为: 字母+2位数字(.可选小数)", "AUTO", now);
}
checkCostNonNegative(checks, homepageId, "总费用", homepage.getTotalCost(), now);
checkCostNonNegative(checks, homepageId, "自费费用", homepage.getSelfPayCost(), now);
checkCostNonNegative(checks, homepageId, "医保费用", homepage.getInsuranceCost(), now);
checkCostNonNegative(checks, homepageId, "药品费", homepage.getDrugCost(), now);
checkCostNonNegative(checks, homepageId, "检查费", homepage.getExaminationCost(), now);
checkCostNonNegative(checks, homepageId, "化验费", homepage.getLabCost(), now);
checkCostNonNegative(checks, homepageId, "治疗费", homepage.getTreatmentCost(), now);
checkCostNonNegative(checks, homepageId, "材料费", homepage.getMaterialCost(), now);
if (homepage.getTotalCost() != null && homepage.getTotalCost().compareTo(BigDecimal.ZERO) > 0) {
BigDecimal sum = BigDecimal.ZERO;
sum = safeAdd(sum, homepage.getDrugCost());
sum = safeAdd(sum, homepage.getExaminationCost());
sum = safeAdd(sum, homepage.getLabCost());
sum = safeAdd(sum, homepage.getTreatmentCost());
sum = safeAdd(sum, homepage.getMaterialCost());
boolean costValid = homepage.getTotalCost().compareTo(sum) == 0;
addCheck(checks, homepageId, "费用构成一致性", "逻辑校验",
costValid ? "PASS" : "FAIL",
"总费用: " + homepage.getTotalCost() + ", 分项合计: " + sum,
costValid ? null : "总费用应等于药品费+检查费+化验费+治疗费+材料费", "AUTO", now);
}
if (homepage.getSelfPayCost() != null && homepage.getInsuranceCost() != null
&& homepage.getTotalCost() != null && homepage.getTotalCost().compareTo(BigDecimal.ZERO) > 0) {
BigDecimal paySum = safeAdd(homepage.getSelfPayCost(), homepage.getInsuranceCost());
boolean payValid = homepage.getTotalCost().compareTo(paySum) == 0;
addCheck(checks, homepageId, "费用分担一致性", "逻辑校验",
payValid ? "PASS" : "FAIL",
"总费用: " + homepage.getTotalCost() + ", 自费+医保: " + paySum,
payValid ? null : "总费用应等于自费费用+医保费用", "AUTO", now);
}
return checks;
}
private void checkRequiredField(List<MrHomepageQualityCheck> checks, Long homepageId,
String itemName, String category, boolean isValid,
String fieldName, Date now) {
addCheck(checks, homepageId, itemName + "完整性", category,
isValid ? "PASS" : "FAIL",
fieldName + ": " + (isValid ? "已填写" : "未填写"),
isValid ? null : "请填写" + fieldName, "AUTO", now);
}
private void checkCostNonNegative(List<MrHomepageQualityCheck> checks, Long homepageId,
String costName, BigDecimal value, Date now) {
if (value != null) {
boolean valid = value.compareTo(BigDecimal.ZERO) >= 0;
addCheck(checks, homepageId, costName + "非负", "费用信息",
valid ? "PASS" : "FAIL",
costName + ": " + value,
valid ? null : costName + "不能为负数", "AUTO", now);
}
}
private void addCheck(List<MrHomepageQualityCheck> checks, Long homepageId,
String checkItem, String category, String result,
String detail, String suggestion, String checker, Date now) {
MrHomepageQualityCheck check = new MrHomepageQualityCheck()
.setHomepageId(homepageId)
.setCheckItem(checkItem)
.setCheckCategory(category)
.setCheckResult(result)
.setCheckDetail(detail)
.setSuggestion(suggestion)
.setChecker(checker)
.setCheckTime(now);
save(check);
checks.add(check);
}
private BigDecimal safeAdd(BigDecimal a, BigDecimal b) {
if (a == null) return b != null ? b : BigDecimal.ZERO;
if (b == null) return a;
return a.add(b);
}
}

View File

@@ -0,0 +1,25 @@
package com.healthlink.his.mrhomepage.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.healthlink.his.mrhomepage.domain.MrHqmsReport;
import com.healthlink.his.mrhomepage.mapper.MrHqmsReportMapper;
import com.healthlink.his.mrhomepage.service.IMrHqmsReportService;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class MrHqmsReportServiceImpl
extends ServiceImpl<MrHqmsReportMapper, MrHqmsReport>
implements IMrHqmsReportService {
@Override
public List<MrHqmsReport> selectByHomepageId(Long homepageId) {
return baseMapper.selectByHomepageId(homepageId);
}
@Override
public List<MrHqmsReport> selectByEncounterId(Long encounterId) {
return baseMapper.selectByEncounterId(encounterId);
}
}

View File

@@ -0,0 +1,12 @@
<?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.healthlink.his.mrhomepage.mapper.MrHqmsReportMapper">
<resultMap id="MrHqmsReportResult" type="com.healthlink.his.mrhomepage.domain.MrHqmsReport">
</resultMap>
<select id="selectByHomepageId" resultMap="MrHqmsReportResult">
SELECT * FROM mr_hqms_report WHERE homepage_id = #{homepageId} AND delete_flag = '0' ORDER BY create_time DESC
</select>
<select id="selectByEncounterId" resultMap="MrHqmsReportResult">
SELECT * FROM mr_hqms_report WHERE encounter_id = #{encounterId} AND delete_flag = '0' ORDER BY create_time DESC
</select>
</mapper>

View File

@@ -1,3 +1,11 @@
import request from "@/utils/request"
export function executeQualityCheck(id) { return request({ url: "/api/v1/mr-homepage/quality-check/" + id, method: "post" }) }
export function submitHomepage(id) { return request({ url: "/api/v1/mr-homepage/submit/" + id, method: "put" }) }
export function checkQuality(homepageId) { return request({ url: "/api/v1/mr-homepage/quality/check", method: "post", params: { homepageId } }) }
export function getQualityResults(homepageId) { return request({ url: "/api/v1/mr-homepage/quality/results/" + homepageId, method: "get" }) }
export function submitHqmsReport(homepageId, reportType) { return request({ url: "/api/v1/mr-homepage/hqms/report", method: "post", params: { homepageId, reportType } }) }
export function getHqmsReportStatus(homepageId) { return request({ url: "/api/v1/mr-homepage/hqms/status/" + homepageId, method: "get" }) }
export function listHqmsReports(homepageId) { return request({ url: "/api/v1/mr-homepage/hqms/list/" + homepageId, method: "get" }) }
export function trackStatus(homepageId) { return request({ url: "/api/v1/mr-homepage/tracking/" + homepageId, method: "get" }) }
export function borrowRecord(data) { return request({ url: "/api/v1/mr-homepage/tracking/borrow", method: "post", data }) }
export function returnRecord(borrowingId) { return request({ url: "/api/v1/mr-homepage/tracking/return", method: "post", params: { borrowingId } }) }

View File

@@ -6,3 +6,11 @@ export function executeQualityCheck(id) { return request({ url: '/api/v1/mr-home
export function getQualityCheck(homepageId) { return request({ url: '/api/v1/mr-homepage/quality-check/' + homepageId, method: 'get' }) }
export function getStatistics(params) { return request({ url: '/api/v1/mr-homepage/statistics', method: 'get', params }) }
export function submitHomepage(id) { return request({ url: '/api/v1/mr-homepage/submit/' + id, method: 'put' }) }
export function checkQuality(homepageId) { return request({ url: '/api/v1/mr-homepage/quality/check', method: 'post', params: { homepageId } }) }
export function getQualityResults(homepageId) { return request({ url: '/api/v1/mr-homepage/quality/results/' + homepageId, method: 'get' }) }
export function submitHqmsReport(homepageId, reportType) { return request({ url: '/api/v1/mr-homepage/hqms/report', method: 'post', params: { homepageId, reportType } }) }
export function getHqmsReportStatus(homepageId) { return request({ url: '/api/v1/mr-homepage/hqms/status/' + homepageId, method: 'get' }) }
export function listHqmsReports(homepageId) { return request({ url: '/api/v1/mr-homepage/hqms/list/' + homepageId, method: 'get' }) }
export function saveDeathDiscussion(data) { return request({ url: '/api/v1/mr-homepage/death-discussion/save', method: 'post', data }) }
export function listDeathDiscussions(homepageId) { return request({ url: '/api/v1/mr-homepage/death-discussion/list/' + homepageId, method: 'get' }) }
export function getPendingDeadline() { return request({ url: '/api/v1/mr-homepage/death-discussion/pending-deadline', method: 'get' }) }

View File

@@ -6,3 +6,9 @@ export function getDefects(encounterId) { return request({ url: "/api/v1/emr-qua
export function getDefectStatistics() { return request({ url: "/api/v1/emr-quality/defect-statistics", method: "get" }) }
export function getCompletionRate() { return request({ url: "/api/v1/emr-quality/completion-rate", method: "get" }) }
export function getQualityStatistics(params) { return request({ url: "/api/v1/emr-quality/defect-statistics", method: "get", params }) }
// 终末质控
export function runTerminalCheck(encounterId) { return request({ url: "/api/v1/quality/terminal/check/" + encounterId, method: "post" }) }
export function getTerminalResults(encounterId) { return request({ url: "/api/v1/quality/terminal/results/" + encounterId, method: "get" }) }
export function startDefectRectify(defectId) { return request({ url: "/api/v1/emr-quality/defect/rectify/" + defectId, method: "post" }) }
export function completeDefectRectify(defectId) { return request({ url: "/api/v1/emr-quality/defect/complete/" + defectId, method: "post" }) }

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -0,0 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -0,0 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -0,0 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -0,0 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -0,0 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -0,0 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -1,4 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M768 192H256c-35.2 0-64 28.8-64 64v576c0 35.2 28.8 64 64 64h512c35.2 0 64-28.8 64-64V256c0-35.2-28.8-64-64-64z m-64 576H320V320h384v448z" fill="currentColor"/>
<path d="M384 384h256v64H384z m0 128h192v64H384z m0 128h128v64H384z" fill="currentColor"/>
</svg>
<path d="M768 128H256c-35.2 0-64 28.8-64 64v640c0 35.2 28.8 64 64 64h512c35.2 0 64-28.8 64-64V192c0-35.2-28.8-64-64-64z m0 64v64H256V192h512z" fill="currentColor"/>
<path d="M320 320h384v64H320z" fill="currentColor"/>
<path d="M320 448h384v64H320z" fill="currentColor"/>
<path d="M320 576h384v64H320z" fill="currentColor"/>
</svg>

Before

Width:  |  Height:  |  Size: 349 B

After

Width:  |  Height:  |  Size: 416 B

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -0,0 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -0,0 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -0,0 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -0,0 +1,8 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
<path d="M384 640h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 648 B

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -1,4 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M640 128H384c-35.2 0-64 28.8-64 64v640c0 35.2 28.8 64 64 64h256c35.2 0 64-28.8 64-64V192c0-35.2-28.8-64-64-64z m-64 640H448V256h128v512z" fill="currentColor"/>
<path d="M480 320h64v128h-64z m-64 192h192v64H416z" fill="currentColor"/>
</svg>
<path d="M768 128H256c-35.2 0-64 28.8-64 64v640c0 35.2 28.8 64 64 64h512c35.2 0 64-28.8 64-64V192c0-35.2-28.8-64-64-64z m0 64v64H256V192h512z" fill="currentColor"/>
<path d="M320 320h384v64H320z" fill="currentColor"/>
<path d="M320 448h384v64H320z" fill="currentColor"/>
<path d="M320 576h384v64H320z" fill="currentColor"/>
<path d="M320 704h384v64H320z" fill="currentColor"/>
</svg>

Before

Width:  |  Height:  |  Size: 332 B

After

Width:  |  Height:  |  Size: 471 B

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -0,0 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

Some files were not shown because too many files have changed in this diff Show More