Browse Source

update: 演练/培训/卫生自查数据统计功能优化

zhongwei
liwen 11 months ago
parent
commit
01a3332553
  1. 3
      hzims-service-api/safeproduct-api/src/main/java/com/hnac/hzims/safeproduct/vo/RehearsalYearVO.java
  2. 3
      hzims-service-api/safeproduct-api/src/main/java/com/hnac/hzims/safeproduct/vo/TrainYearVO.java
  3. 8
      hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/controller/RehearsalController.java
  4. 8
      hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/controller/TrainController.java
  5. 9
      hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/mapper/RehearsalPlanMapper.java
  6. 9
      hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/mapper/RehearsalPlanMapper.xml
  7. 9
      hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/mapper/TrainPlanMapper.java
  8. 9
      hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/mapper/TrainPlanMapper.xml
  9. 6
      hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/service/IRehearsalPlanService.java
  10. 6
      hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/service/ITrainPlanService.java
  11. 42
      hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/service/impl/RehearsalPlanServiceImpl.java
  12. 42
      hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/service/impl/TrainPlanServiceImpl.java

3
hzims-service-api/safeproduct-api/src/main/java/com/hnac/hzims/safeproduct/vo/RehearsalYearVO.java

@ -50,4 +50,7 @@ public class RehearsalYearVO {
@ApiModelProperty("12月完成数")
private Long decemberNum;
@ApiModelProperty("合计完成数")
private Long sum;
}

3
hzims-service-api/safeproduct-api/src/main/java/com/hnac/hzims/safeproduct/vo/TrainYearVO.java

@ -50,4 +50,7 @@ public class TrainYearVO {
@ApiModelProperty("12月完成数")
private Long decemberNum;
@ApiModelProperty("合计完成数")
private Long sum;
}

8
hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/controller/RehearsalController.java

@ -124,16 +124,16 @@ public class RehearsalController extends BladeController {
@GetMapping("/dataByMonth")
@ApiOperation(value = "月度统计表")
@ApiOperationSupport(order = 11)
public R<IPage<RehearsalMonthVO>> dataByMonth(@RequestParam String month, Query query) {
IPage<RehearsalMonthVO> page = rehearsalPlanService.dataByMonth(month, query);
public R<IPage<RehearsalMonthVO>> dataByMonth(@RequestParam String month, String unit, Query query) {
IPage<RehearsalMonthVO> page = rehearsalPlanService.dataByMonth(month, unit, query);
return R.data(page);
}
@GetMapping("/dataByYear")
@ApiOperation(value = "年度统计表")
@ApiOperationSupport(order = 12)
public R<IPage<RehearsalYearVO>> dataByYear(@RequestParam String year, Query query) {
IPage<RehearsalYearVO> page = rehearsalPlanService.dataByYear(year, query);
public R<IPage<RehearsalYearVO>> dataByYear(@RequestParam String year, String unit, Query query) {
IPage<RehearsalYearVO> page = rehearsalPlanService.dataByYear(year, unit, query);
return R.data(page);
}

8
hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/controller/TrainController.java

@ -208,16 +208,16 @@ public class TrainController extends BladeController {
@GetMapping("/trainDataByMonth")
@ApiOperation(value = "培训月度统计表")
@ApiOperationSupport(order = 20)
public R<IPage<TrainMonthVO>> trainDataByMonth(@RequestParam String month, Query query) {
IPage<TrainMonthVO> page = trainPlanService.dataByMonth(month, query);
public R<IPage<TrainMonthVO>> trainDataByMonth(@RequestParam String month, String unit, Query query) {
IPage<TrainMonthVO> page = trainPlanService.dataByMonth(month, unit, query);
return R.data(page);
}
@GetMapping("/trainDataByYear")
@ApiOperation(value = "培训年度统计表")
@ApiOperationSupport(order = 21)
public R<IPage<TrainYearVO>> trainDataByYear(@RequestParam String year, Query query) {
IPage<TrainYearVO> page = trainPlanService.dataByYear(year, query);
public R<IPage<TrainYearVO>> trainDataByYear(@RequestParam String year, String unit, Query query) {
IPage<TrainYearVO> page = trainPlanService.dataByYear(year, unit, query);
return R.data(page);
}

9
hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/mapper/RehearsalPlanMapper.java

@ -24,26 +24,29 @@ public interface RehearsalPlanMapper extends BaseMapper<RehearsalPlanEntity> {
/**
* 查询当月各单位的演练总数
* @param page 分页类
* @param unit 单位
* @param month 月份
* @return 当月的演练总数据
*/
IPage<RehearsalMonthVO> selectByMonth(IPage<RehearsalMonthVO> page, String month);
IPage<RehearsalMonthVO> selectByMonth(IPage<RehearsalMonthVO> page, String unit, String month);
/**
* 查询当月各单位已完成的演练数据
* @param page 分页类
* @param unit 单位
* @param month 月份
* @return 当月的已完成数据
*/
IPage<RehearsalMonthVO> selectFinishedDataByMonth(IPage<RehearsalMonthVO> page, String month);
IPage<RehearsalMonthVO> selectFinishedDataByMonth(IPage<RehearsalMonthVO> page, String unit, String month);
/**
* 查询当年的所有单位
* @param page 分页类
* @param unit 单位
* @param year 年份
* @return 年度单位数据
*/
IPage<RehearsalYearVO> selectUnitByYear(IPage<RehearsalYearVO> page, @Param("year") String year);
IPage<RehearsalYearVO> selectUnitByYear(IPage<RehearsalYearVO> page, String unit, @Param("year") String year);
/**
* 查询各单位全年已完成的演练数据

9
hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/mapper/RehearsalPlanMapper.xml

@ -10,6 +10,9 @@
WHERE
is_deleted = 0
AND scheduled_end_time like concat('%', #{month}, '%')
<if test="unit != null and unit != ''">
AND unit like concat('%', #{unit}, '%')
</if>
GROUP BY
unit
ORDER BY
@ -25,6 +28,9 @@
is_deleted = 0
AND scheduled_end_time like concat('%', #{month}, '%')
AND rehearsal_status = 'FINISHED'
<if test="unit != null and unit != ''">
AND unit like concat('%', #{unit}, '%')
</if>
GROUP BY
unit
ORDER BY
@ -39,6 +45,9 @@
WHERE
is_deleted = 0
AND scheduled_end_time like concat('%', #{year}, '%')
<if test="unit != null and unit != ''">
AND unit like concat('%', #{unit}, '%')
</if>
ORDER BY
unit
</select>

9
hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/mapper/TrainPlanMapper.java

@ -22,26 +22,29 @@ public interface TrainPlanMapper extends BaseMapper<TrainPlanEntity> {
/**
* 查询当月各单位的培训计划总数
* @param page 分页类
* @param unit 单位
* @param month 月份
* @return 当月培训计划总数
*/
IPage<TrainMonthVO> selectByMonth(IPage<TrainMonthVO> page, String month);
IPage<TrainMonthVO> selectByMonth(IPage<TrainMonthVO> page, String unit, String month);
/**
* 查询当月各单位已完成的培训计划数据
* @param page1 分页类
* @param unit 单位
* @param month 月份
* @return 当月已完成培训计划数
*/
IPage<TrainMonthVO> selectFinishedDataByMonth(IPage<TrainMonthVO> page1, String month);
IPage<TrainMonthVO> selectFinishedDataByMonth(IPage<TrainMonthVO> page1, String unit, String month);
/**
* 查询当年的所有单位
* @param page 分页类
* @param unit 单位
* @param year 年份
* @return 年度单位数据
*/
IPage<TrainYearVO> selectUnitByYear(IPage<TrainYearVO> page, String year);
IPage<TrainYearVO> selectUnitByYear(IPage<TrainYearVO> page, String unit, String year);
/**
* 查询各单位全年已完成的培训计划数

9
hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/mapper/TrainPlanMapper.xml

@ -10,6 +10,9 @@
WHERE
is_deleted = 0
AND scheduled_end_time like concat('%', #{month}, '%')
<if test="unit != null and unit != ''">
AND unit like concat('%', #{unit}, '%')
</if>
GROUP BY
unit
ORDER BY
@ -25,6 +28,9 @@
is_deleted = 0
AND scheduled_end_time like concat('%', #{month}, '%')
AND train_status = 'FINISHED'
<if test="unit != null and unit != ''">
AND unit like concat('%', #{unit}, '%')
</if>
GROUP BY
unit
ORDER BY
@ -39,6 +45,9 @@
WHERE
is_deleted = 0
AND scheduled_end_time like concat('%', #{year}, '%')
<if test="unit != null and unit != ''">
AND unit like concat('%', #{unit}, '%')
</if>
ORDER BY
unit
</select>

6
hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/service/IRehearsalPlanService.java

@ -29,18 +29,20 @@ public interface IRehearsalPlanService extends IService<RehearsalPlanEntity> {
/**
* 演练月度数据
* @param month 月份
* @param unit 单位
* @param query 分页类
* @return 月度统计分页
*/
IPage<RehearsalMonthVO> dataByMonth(String month, Query query);
IPage<RehearsalMonthVO> dataByMonth(String month, String unit, Query query);
/**
* 演练年度数据
* @param year 年份
* @param unit 单位
* @param query 分页类
* @return 年度统计分页
*/
IPage<RehearsalYearVO> dataByYear(String year, Query query);
IPage<RehearsalYearVO> dataByYear(String year, String unit, Query query);
/**
* 演练计划数据导出

6
hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/service/ITrainPlanService.java

@ -22,18 +22,20 @@ public interface ITrainPlanService extends IService<TrainPlanEntity> {
/**
* 月度培训数据
* @param month 月份
* @param unit 单位
* @param query 分页类
* @return 月度培训分页
*/
IPage<TrainMonthVO> dataByMonth(String month, Query query);
IPage<TrainMonthVO> dataByMonth(String month, String unit, Query query);
/**
* 年度培训数据
* @param year 年份
* @param unit 单位
* @param query 分页类
* @return 年度培训分页
*/
IPage<TrainYearVO> dataByYear(String year, Query query);
IPage<TrainYearVO> dataByYear(String year, String unit, Query query);
/**
* 删除培训计划

42
hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/service/impl/RehearsalPlanServiceImpl.java

@ -32,6 +32,7 @@ import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@ -68,10 +69,10 @@ public class RehearsalPlanServiceImpl extends ServiceImpl<RehearsalPlanMapper, R
* 演练月度数据
*/
@Override
public IPage<RehearsalMonthVO> dataByMonth(String month, Query query) {
public IPage<RehearsalMonthVO> dataByMonth(String month, String unit, Query query) {
// 查询当月各单位的演练总数
IPage<RehearsalMonthVO> page = new Page<>(query.getCurrent(), query.getSize());
IPage<RehearsalMonthVO> unitPage = baseMapper.selectByMonth(page, month);
IPage<RehearsalMonthVO> unitPage = baseMapper.selectByMonth(page, unit, month);
List<RehearsalMonthVO> unitList = unitPage.getRecords();
// 若无数据,返回空页面
if (CollectionUtils.isEmpty(unitList)) {
@ -79,18 +80,18 @@ public class RehearsalPlanServiceImpl extends ServiceImpl<RehearsalPlanMapper, R
}
// 查询当月各单位已完成的演练数据
IPage<RehearsalMonthVO> page1 = new Page<>(query.getCurrent(), query.getSize());
IPage<RehearsalMonthVO> finishedPage = baseMapper.selectFinishedDataByMonth(page1, month);
IPage<RehearsalMonthVO> finishedPage = baseMapper.selectFinishedDataByMonth(page1, unit, month);
List<RehearsalMonthVO> finishedList = finishedPage.getRecords();
// 处理统计数据
for (RehearsalMonthVO unit : unitList) {
Long taskNum = unit.getScheduledTaskNum();
Optional<RehearsalMonthVO> finishedRehearsal = finishedList.stream().filter(x -> x.getUnit().equals(unit.getUnit())).findFirst();
for (RehearsalMonthVO u : unitList) {
Long taskNum = u.getScheduledTaskNum();
Optional<RehearsalMonthVO> finishedRehearsal = finishedList.stream().filter(x -> x.getUnit().equals(u.getUnit())).findFirst();
Long finishedTaskNum = finishedRehearsal.isPresent() ? finishedRehearsal.get().getFinishedTaskNum() : 0L;
unit.setFinishedTaskNum(finishedTaskNum);
unit.setUnfinishedTaskNum(taskNum - finishedTaskNum);
u.setFinishedTaskNum(finishedTaskNum);
u.setUnfinishedTaskNum(taskNum - finishedTaskNum);
BigDecimal taskDecimal = new BigDecimal(taskNum);
BigDecimal finishedDecimal = new BigDecimal(finishedTaskNum);
unit.setTaskCompletionRate(finishedDecimal.divide(taskDecimal, 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100"))
u.setTaskCompletionRate(finishedDecimal.divide(taskDecimal, 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100"))
.setScale(2, RoundingMode.HALF_UP));
}
unitPage.setRecords(unitList);
@ -101,10 +102,10 @@ public class RehearsalPlanServiceImpl extends ServiceImpl<RehearsalPlanMapper, R
* 演练年度数据
*/
@Override
public IPage<RehearsalYearVO> dataByYear(String year, Query query) {
public IPage<RehearsalYearVO> dataByYear(String year, String unit, Query query) {
IPage<RehearsalYearVO> page = new Page<>(query.getCurrent(), query.getSize());
// 查询当年的所有单位
IPage<RehearsalYearVO> unitPage = baseMapper.selectUnitByYear(page, year);
IPage<RehearsalYearVO> unitPage = baseMapper.selectUnitByYear(page, unit, year);
List<RehearsalYearVO> records = unitPage.getRecords();
// 若无数据,返回空页面
if (CollectionUtils.isEmpty(records)) {
@ -114,49 +115,66 @@ public class RehearsalPlanServiceImpl extends ServiceImpl<RehearsalPlanMapper, R
// 查询各单位全年已完成的演练数据
List<AnalysisYearDTO> unitMonthDataList = baseMapper.selectFinishedDataByUnit(unitList, year);
// 将各单位每个月的演练数据写入统计列表
List<RehearsalYearVO> res = new ArrayList<>();
unitMonthDataList.forEach(data -> {
RehearsalYearVO rehearsalYearVO = records.stream().filter(x -> x.getUnit().equals(data.getUnit()))
.collect(Collectors.toList()).get(0);
long sum = rehearsalYearVO.getSum() == null ? 0 : rehearsalYearVO.getSum();
// 根据月份匹配写入对应字段
switch (data.getDateTime()) {
case "01":
rehearsalYearVO.setJanuaryNum(data.getFinishedNum());
rehearsalYearVO.setSum(sum + data.getFinishedNum());
break;
case "02":
rehearsalYearVO.setFebruaryNum(data.getFinishedNum());
rehearsalYearVO.setSum(sum + data.getFinishedNum());
break;
case "03":
rehearsalYearVO.setMarchNum(data.getFinishedNum());
rehearsalYearVO.setSum(sum + data.getFinishedNum());
break;
case "04":
rehearsalYearVO.setAprilNum(data.getFinishedNum());
rehearsalYearVO.setSum(sum + data.getFinishedNum());
break;
case "05":
rehearsalYearVO.setMayNum(data.getFinishedNum());
rehearsalYearVO.setSum(sum + data.getFinishedNum());
break;
case "06":
rehearsalYearVO.setJuneNum(data.getFinishedNum());
rehearsalYearVO.setSum(sum + data.getFinishedNum());
break;
case "07":
rehearsalYearVO.setJulyNum(data.getFinishedNum());
rehearsalYearVO.setSum(sum + data.getFinishedNum());
break;
case "08":
rehearsalYearVO.setAugustNum(data.getFinishedNum());
rehearsalYearVO.setSum(sum + data.getFinishedNum());
break;
case "09":
rehearsalYearVO.setSeptemberNum(data.getFinishedNum());
rehearsalYearVO.setSum(sum + data.getFinishedNum());
break;
case "10":
rehearsalYearVO.setOctoberNum(data.getFinishedNum());
rehearsalYearVO.setSum(sum + data.getFinishedNum());
break;
case "11":
rehearsalYearVO.setNovemberNum(data.getFinishedNum());
rehearsalYearVO.setSum(sum + data.getFinishedNum());
break;
case "12":
rehearsalYearVO.setDecemberNum(data.getFinishedNum());
rehearsalYearVO.setSum(sum + data.getFinishedNum());
}
if (rehearsalYearVO.getSum() != 0) {
res.add(rehearsalYearVO);
}
});
unitPage.setRecords(records);
unitPage.setRecords(res);
return unitPage;
}

42
hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/service/impl/TrainPlanServiceImpl.java

@ -34,6 +34,7 @@ import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@ -58,10 +59,10 @@ public class TrainPlanServiceImpl extends ServiceImpl<TrainPlanMapper, TrainPlan
* 月度培训数据
*/
@Override
public IPage<TrainMonthVO> dataByMonth(String month, Query query) {
public IPage<TrainMonthVO> dataByMonth(String month, String unit, Query query) {
// 查询当月各单位的培训计划总数
IPage<TrainMonthVO> page = new Page<>(query.getCurrent(), query.getSize());
IPage<TrainMonthVO> unitPage = baseMapper.selectByMonth(page, month);
IPage<TrainMonthVO> unitPage = baseMapper.selectByMonth(page, unit, month);
List<TrainMonthVO> unitList = unitPage.getRecords();
// 若无数据,返回空页面
if (CollectionUtils.isEmpty(unitList)) {
@ -69,18 +70,18 @@ public class TrainPlanServiceImpl extends ServiceImpl<TrainPlanMapper, TrainPlan
}
// 查询当月各单位已完成的培训数据
IPage<TrainMonthVO> page1 = new Page<>(query.getCurrent(), query.getSize());
IPage<TrainMonthVO> finishedPage = baseMapper.selectFinishedDataByMonth(page1, month);
IPage<TrainMonthVO> finishedPage = baseMapper.selectFinishedDataByMonth(page1, unit, month);
List<TrainMonthVO> finishedList = finishedPage.getRecords();
// 处理统计数据
for (TrainMonthVO unit : unitList) {
Long taskNum = unit.getScheduledTrainNum();
Optional<TrainMonthVO> finishedRehearsal = finishedList.stream().filter(x -> x.getUnit().equals(unit.getUnit())).findFirst();
for (TrainMonthVO u : unitList) {
Long taskNum = u.getScheduledTrainNum();
Optional<TrainMonthVO> finishedRehearsal = finishedList.stream().filter(x -> x.getUnit().equals(u.getUnit())).findFirst();
Long finishedTaskNum = finishedRehearsal.isPresent() ? finishedRehearsal.get().getFinishedTrainNum() : 0L;
unit.setFinishedTrainNum(finishedTaskNum);
unit.setUnfinishedTrainNum(taskNum - finishedTaskNum);
u.setFinishedTrainNum(finishedTaskNum);
u.setUnfinishedTrainNum(taskNum - finishedTaskNum);
BigDecimal taskDecimal = new BigDecimal(taskNum);
BigDecimal finishedDecimal = new BigDecimal(finishedTaskNum);
unit.setCompletionRate(finishedDecimal.divide(taskDecimal, 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100"))
u.setCompletionRate(finishedDecimal.divide(taskDecimal, 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100"))
.setScale(2, RoundingMode.HALF_UP));
}
unitPage.setRecords(unitList);
@ -91,10 +92,10 @@ public class TrainPlanServiceImpl extends ServiceImpl<TrainPlanMapper, TrainPlan
* 年度培训数据
*/
@Override
public IPage<TrainYearVO> dataByYear(String year, Query query) {
public IPage<TrainYearVO> dataByYear(String year, String unit, Query query) {
IPage<TrainYearVO> page = new Page<>(query.getCurrent(), query.getSize());
// 查询当年的所有单位
IPage<TrainYearVO> unitPage = baseMapper.selectUnitByYear(page, year);
IPage<TrainYearVO> unitPage = baseMapper.selectUnitByYear(page, unit, year);
List<TrainYearVO> records = unitPage.getRecords();
// 若无数据,返回空页面
if (CollectionUtils.isEmpty(records)) {
@ -104,49 +105,66 @@ public class TrainPlanServiceImpl extends ServiceImpl<TrainPlanMapper, TrainPlan
// 查询各单位全年已完成的培训计划数
List<AnalysisYearDTO> unitMonthDataList = baseMapper.selectFinishedDataByUnit(unitList, year);
// 将各单位每个月的培训计划数据写入统计列表
List<TrainYearVO> res = new ArrayList<>();
unitMonthDataList.forEach(data -> {
TrainYearVO trainYearVO = records.stream().filter(x -> x.getUnit().equals(data.getUnit()))
.collect(Collectors.toList()).get(0);
long sum = trainYearVO.getSum() == null ? 0 : trainYearVO.getSum();
// 根据月份匹配写入对应字段
switch (data.getDateTime()) {
case "01":
trainYearVO.setJanuaryNum(data.getFinishedNum());
trainYearVO.setSum(sum + data.getFinishedNum());
break;
case "02":
trainYearVO.setFebruaryNum(data.getFinishedNum());
trainYearVO.setSum(sum + data.getFinishedNum());
break;
case "03":
trainYearVO.setMarchNum(data.getFinishedNum());
trainYearVO.setSum(sum + data.getFinishedNum());
break;
case "04":
trainYearVO.setAprilNum(data.getFinishedNum());
trainYearVO.setSum(sum + data.getFinishedNum());
break;
case "05":
trainYearVO.setMayNum(data.getFinishedNum());
trainYearVO.setSum(sum + data.getFinishedNum());
break;
case "06":
trainYearVO.setJuneNum(data.getFinishedNum());
trainYearVO.setSum(sum + data.getFinishedNum());
break;
case "07":
trainYearVO.setJulyNum(data.getFinishedNum());
trainYearVO.setSum(sum + data.getFinishedNum());
break;
case "08":
trainYearVO.setAugustNum(data.getFinishedNum());
trainYearVO.setSum(sum + data.getFinishedNum());
break;
case "09":
trainYearVO.setSeptemberNum(data.getFinishedNum());
trainYearVO.setSum(sum + data.getFinishedNum());
break;
case "10":
trainYearVO.setOctoberNum(data.getFinishedNum());
trainYearVO.setSum(sum + data.getFinishedNum());
break;
case "11":
trainYearVO.setNovemberNum(data.getFinishedNum());
trainYearVO.setSum(sum + data.getFinishedNum());
break;
case "12":
trainYearVO.setDecemberNum(data.getFinishedNum());
trainYearVO.setSum(sum + data.getFinishedNum());
}
if (trainYearVO.getSum() != 0) {
res.add(trainYearVO);
}
});
unitPage.setRecords(records);
unitPage.setRecords(res);
return unitPage;
}

Loading…
Cancel
Save