This commit is contained in:
LiJianZhao 2025-04-27 15:38:10 +08:00
parent 253190d255
commit 6b375c519b
10 changed files with 236 additions and 73 deletions

View File

@ -1,15 +1,20 @@
package com.syjiaer.clinic.server.controller.charge;
import com.syjiaer.clinic.server.common.util.DateUtil;
import com.syjiaer.clinic.server.common.vo.Result;
import com.syjiaer.clinic.server.controller.BaseController;
import com.syjiaer.clinic.server.entity.charge.ChargeOrder;
import com.syjiaer.clinic.server.entity.charge.dto.ChargeQuery;
import com.syjiaer.clinic.server.entity.charge.dto.ChargeSaveDto;
import com.syjiaer.clinic.server.service.charge.ChargeService;
import com.syjiaer.clinic.server.service.charge.vo.RetailOrderDailyChargingReportVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
import java.util.Map;
@RestController
@RequestMapping("/charge")
public class ChargeController extends BaseController {
@ -57,4 +62,18 @@ public class ChargeController extends BaseController {
return success();
}
/**
* 每日收费报表
*/
@RequestMapping("/dailyChargingReport")
public Result<Map<String, RetailOrderDailyChargingReportVo>> dailyChargingReport() {
String startDateStr = parmsUtil.getString("startDate", "请选择开始时间");
String endDateStr = parmsUtil.getString("endDate", "请选择结束时间");
LocalDateTime startDateTime = DateUtil.getDateTime(startDateStr);
LocalDateTime endDateTime = DateUtil.getDateTime(endDateStr);
endDateTime = endDateTime.plusDays(1);
return success(chargeService.dailyChargingReport(startDateTime, endDateTime));
}
}

View File

@ -61,45 +61,13 @@ public class StatisticsController extends BaseController {
@RequestMapping("getPersonPayOverview")
public Result<PersonPayOverviewVo> getPersonPayOverview() {
// String begin = parmsUtil.getString("beginTime", "开始时间为空");
// String end = parmsUtil.getString("endTime", "结束时间为空");
// LocalDateTime beginTime = DateUtil.getDateTime(begin);
// LocalDateTime endTime = DateUtil.getDateTime(end);
// QueryWrapper<RetailOrder> vipQuery = new QueryWrapper<>();
// vipQuery.select("create_date,sum(total_price)");
// vipQuery.ge("pay_time", beginTime);
// vipQuery.le("pay_time", endTime);
//
// vipQuery.groupBy("create_date");
// vipQuery.orderByAsc("create_date");
// vipQuery.isNotNull("vip_id");
// List<Map<String, Object>> vipMaps = retailOrderService.listMaps(vipQuery);
// QueryWrapper<RetailOrder> commonQuery = new QueryWrapper<>();
// commonQuery.select("create_date,sum(total_price)");
// commonQuery.ge("pay_time", beginTime);
// commonQuery.le("pay_time", endTime);
//
// commonQuery.groupBy("create_date");
// commonQuery.orderByAsc("create_date");
// commonQuery.isNull("vip_id");
// List<Map<String, Object>> commonMaps = retailOrderService.listMaps(commonQuery);
// List<LocalDate> dateList = DateUtil.getDatesBetween(beginTime, endTime);
// Map<Object, BigDecimal> tempMap = new HashMap<>();
// for (LocalDate date : dateList) {
// tempMap.put(date.toString(), BigDecimal.ZERO);
// }
// for (Map<String, Object> map : vipMaps) {
// tempMap.put(map.get("create_date").toString(), (BigDecimal) map.get("sum"));
// }
// PersonPayOverviewVo personPayOverview = new PersonPayOverviewVo();
// personPayOverview.setDateList(dateList.stream().map(LocalDate::toString).toList());
// personPayOverview.setVipPrice(new ArrayList<>(tempMap.values()));
// for (Map<String, Object> map : commonMaps) {
// tempMap.put(map.get("create_date").toString(), (BigDecimal) map.get("sum"));
// }
// personPayOverview.setCommonPrice(new ArrayList<>(tempMap.values()));
String begin = parmsUtil.getString("beginTime", "开始时间为空");
String end = parmsUtil.getString("endTime", "结束时间为空");
LocalDateTime beginTime = DateUtil.getDateTime(begin);
LocalDateTime endTime = DateUtil.getDateTime(end);
PersonPayOverviewVo personPayOverviewVo = statisticsService.getPersonPayOverview(beginTime, endTime);
return success(personPayOverviewVo);
return success();
}

View File

@ -7,6 +7,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
@ -18,7 +19,7 @@ import lombok.experimental.Accessors;
* </p>
*
* @author NiuZiYuan
* @since 2025-04-24
* @since 2025-04-27
*/
@Getter
@Setter
@ -66,4 +67,10 @@ public class ChargeOrder implements Serializable {
@ApiModelProperty("诊断code")
private String diagnosisCode;
@ApiModelProperty("创建日期")
private LocalDate createDate;
@ApiModelProperty("总成本")
private BigDecimal totalCost;
}

View File

@ -16,7 +16,7 @@ import lombok.experimental.Accessors;
* </p>
*
* @author NiuZiYuan
* @since 2025-04-24
* @since 2025-04-27
*/
@Getter
@Setter
@ -42,4 +42,7 @@ public class Diagnosis implements Serializable {
@ApiModelProperty("创建时间")
private LocalDateTime createTime;
@ApiModelProperty("0待收费 1已收费")
private Integer status;
}

View File

@ -46,6 +46,8 @@ import com.syjiaer.clinic.server.mapper.patient.PatientRegistrationMapper;
import com.syjiaer.clinic.server.mapper.social.SocialDirectoryMapper;
import com.syjiaer.clinic.server.mapper.social.SocialItemMapper;
import com.syjiaer.clinic.server.service.BaseService;
import com.syjiaer.clinic.server.service.charge.vo.PaymentMethodVo;
import com.syjiaer.clinic.server.service.charge.vo.RetailOrderDailyChargingReportVo;
import com.syjiaer.clinic.server.service.inventory.InventoryService;
import com.syjiaer.clinic.server.service.patient.PatientRegistrationService;
import org.springframework.beans.BeanUtils;
@ -55,10 +57,13 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class ChargeService extends BaseService {
@ -159,6 +164,7 @@ public class ChargeService extends BaseService {
itemList.setFeedetlSn(fsn);
itemList.setCreateDate(nowLocalDate);
itemList.setCreateTime(nowLocalDateTime);
itemList.setType(dbGoods.getType());
chargeGoodsLists.add(itemList);
preTotalPrice = preTotalPrice.add(subTotalPrice);
totalPrice = totalPrice.add(subTotalPrice);
@ -170,6 +176,7 @@ public class ChargeService extends BaseService {
chargeOrder.setPreTotalPrice(preTotalPrice);
chargeOrder.setTotalPrice(totalPrice);
chargeOrder.setCreateDatetime(nowLocalDateTime);
chargeOrder.setCreateDate(nowLocalDate);
chargeOrder.setStatus(RetailOrderStatusEnum.UNFINISHED.getCode());
chargeOrder.setPatientId(dto.getPatientInfo().getId());
chargeOrder.setDiagnosisCode(dto.getCode());
@ -236,9 +243,18 @@ public class ChargeService extends BaseService {
if (order == null) {
throw new MessageException("订单不存在");
}
Diagnosis diagnosis = diagnosisMapper.selectById(order.getDiagnosisCode());
if (diagnosis == null) {
throw new MessageException("诊断信息不存在");
}
if (!order.getStatus().equals(RetailOrderStatusEnum.UNFINISHED.getCode())) {
throw new MessageException("订单状态错误");
}
//更新诊断状态
Diagnosis updateDiagnosis = new Diagnosis();
updateDiagnosis.setId(diagnosis.getId());
updateDiagnosis.setStatus(1);
//完成订单
ChargeOrder updateOrder = new ChargeOrder();
updateOrder.setId(id);
updateOrder.setStatus(RetailOrderStatusEnum.FINISHED.getCode());
@ -265,6 +281,7 @@ public class ChargeService extends BaseService {
}
}
public void uploadCostDetails(String changeOrderCode) {
ChargeOrder order = chargeOrderMapper.selectByCode(changeOrderCode);
Diagnosis diagnosis = diagnosisMapper.selectByCode(order.getDiagnosisCode());
@ -385,4 +402,66 @@ public class ChargeService extends BaseService {
}
/**
* 收费日报
*
* @param startDateTime
* @param endDateTime
* @return
*/
public Map<String, RetailOrderDailyChargingReportVo> dailyChargingReport(LocalDateTime startDateTime, LocalDateTime endDateTime) {
Map<String, RetailOrderDailyChargingReportVo> result = new HashMap<>();
QueryWrapper<ChargeOrder> queryWrapper = new QueryWrapper<>();
queryWrapper.between("create_datetime", startDateTime, endDateTime)
.eq("status", RetailOrderStatusEnum.FINISHED.getCode())
.orderByDesc("create_datetime");
List<ChargeOrder> chargeOrders = chargeOrderMapper.selectList(queryWrapper);
for (ChargeOrder order : chargeOrders) {
String dateKey = order.getCreateDatetime().toLocalDate().toString();// 格式为 yyyy-MM-dd
RetailOrderDailyChargingReportVo retailOrderDailyChargingReportVo = result.get(dateKey);
if (retailOrderDailyChargingReportVo == null) {
retailOrderDailyChargingReportVo = new RetailOrderDailyChargingReportVo();
retailOrderDailyChargingReportVo.setTotalMoney(order.getTotalPrice() == null ? new BigDecimal(0) : order.getTotalPrice());
retailOrderDailyChargingReportVo.setTotalCost(order.getTotalCost() == null ? new BigDecimal(0) : order.getTotalCost());
retailOrderDailyChargingReportVo.setOrderVolume(1);
retailOrderDailyChargingReportVo.setPaymentMethodVo(getPaymentMethod(order.getPayType(), new PaymentMethodVo(), order.getTotalPrice()));
} else {
retailOrderDailyChargingReportVo.setTotalMoney(retailOrderDailyChargingReportVo.getTotalMoney().add(order.getTotalPrice()));
retailOrderDailyChargingReportVo.setTotalCost(retailOrderDailyChargingReportVo.getTotalCost().add(order.getTotalCost()));
retailOrderDailyChargingReportVo.setOrderVolume(retailOrderDailyChargingReportVo.getOrderVolume() + 1);
retailOrderDailyChargingReportVo.setPaymentMethodVo(getPaymentMethod(order.getPayType(), retailOrderDailyChargingReportVo.getPaymentMethodVo(), order.getTotalPrice()));
}
result.put(dateKey, retailOrderDailyChargingReportVo);
}
result.forEach((key, value) -> {
BigDecimal grossMargin = value.getTotalMoney().subtract(value.getTotalCost());
value.setGrossMargin(grossMargin);
value.setGrossProfitRate(String.format("%.2f%%", grossMargin.divide(value.getTotalMoney(), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100"))));
});
return result;
}
//获取各支付方式支付的金额
private PaymentMethodVo getPaymentMethod(Integer payType, PaymentMethodVo paymentMethodVo, BigDecimal totalPrice) {
//1医保 2微信支付 3支付宝支付 4现金支付 5其他
switch (payType) {
case 1:
paymentMethodVo.setMedicalInsurancePayment(paymentMethodVo.getMedicalInsurancePayment().add(totalPrice));
break;
case 2:
paymentMethodVo.setWechatPayment(paymentMethodVo.getWechatPayment().add(totalPrice));
break;
case 3:
paymentMethodVo.setAliPayment(paymentMethodVo.getAliPayment().add(totalPrice));
break;
case 4:
paymentMethodVo.setCashPayment(paymentMethodVo.getCashPayment().add(totalPrice));
break;
case 5:
paymentMethodVo.setOtherPayment(paymentMethodVo.getOtherPayment().add(totalPrice));
break;
}
return paymentMethodVo;
}
}

View File

@ -0,0 +1,27 @@
package com.syjiaer.clinic.server.service.charge.vo;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class PaymentMethodVo {
//微信支付
private BigDecimal wechatPayment;
//支付宝支付
private BigDecimal aliPayment;
//现金支付
private BigDecimal cashPayment;
//其他支付
private BigDecimal otherPayment;
//医保支付
private BigDecimal medicalInsurancePayment;
public PaymentMethodVo() {
wechatPayment = new BigDecimal(0);
aliPayment = new BigDecimal(0);
cashPayment = new BigDecimal(0);
otherPayment = new BigDecimal(0);
medicalInsurancePayment = new BigDecimal(0);
}
}

View File

@ -0,0 +1,23 @@
package com.syjiaer.clinic.server.service.charge.vo;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
@Data
public class RetailOrderDailyChargingReportVo {
//总金额
private BigDecimal totalMoney;
//总成本
private BigDecimal totalCost;
//毛利
private BigDecimal grossMargin;
//毛利率
private String grossProfitRate;
//订单量
private Integer orderVolume;
//支付方式
private PaymentMethodVo paymentMethodVo;
}

View File

@ -97,12 +97,14 @@ public class MedicalRecordService extends BaseService {
String code = StringUtil.getCode("ZD");
LocalDateTime now = LocalDateTime.now();
BeanUtils.copyProperties(saveDto, diagnosis);
diagnosis.setStatus(0);
if (diagnosis.getId() == null){
diagnosis.setCode(code);
diagnosis.setCreateTime(now);
}else {
code = diagnosis.getCode();
}
diagnosisMapper.insertOrUpdate(diagnosis);
//病例表
@ -147,14 +149,6 @@ public class MedicalRecordService extends BaseService {
diagnosisMedicalGoodsListMapper.insert(goodsLists);
//添加收费单
// saveDto.setId(medicalRecordId);
// chargeService.save(saveDto);
}
/**

View File

@ -143,12 +143,15 @@ public class SocialDirectoryService extends BaseService {
}
}
if (next_version_name.isEmpty()){
return next_version_name;
}
socialDirectoryVersionService.saveVersion(type, version_name, list.get(0).getVersionName(), list.size());
if(list.isEmpty()){
return null;
}
socialDirectoryMapper.insert(list, 100);
socialDirectoryVersionService.saveVersion(type, version_name, list.get(0).getVersionName(), list.size());
return next_version_name;
}

View File

@ -4,11 +4,13 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.syjiaer.clinic.server.common.enums.GoodsTypeEnum;
import com.syjiaer.clinic.server.common.enums.RetailOrderPayTypeEnum;
import com.syjiaer.clinic.server.common.enums.RetailOrderStatusEnum;
import com.syjiaer.clinic.server.common.util.DateUtil;
import com.syjiaer.clinic.server.entity.charge.ChargeGoodsList;
import com.syjiaer.clinic.server.entity.charge.ChargeItemList;
import com.syjiaer.clinic.server.entity.charge.ChargeOrder;
import com.syjiaer.clinic.server.entity.statistics.GoodsTypeRevenue;
import com.syjiaer.clinic.server.entity.statistics.PayTypeRevenue;
import com.syjiaer.clinic.server.entity.statistics.PersonPayOverviewVo;
import com.syjiaer.clinic.server.entity.statistics.RevenueOverviewVo;
import com.syjiaer.clinic.server.mapper.charge.ChargeGoodsListMapper;
import com.syjiaer.clinic.server.mapper.charge.ChargeOrderMapper;
@ -17,10 +19,9 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.*;
@Service
public class StatisticsService extends BaseService {
@ -90,4 +91,43 @@ public class StatisticsService extends BaseService {
}
public PersonPayOverviewVo getPersonPayOverview(LocalDateTime beginTime, LocalDateTime endTime) {
// QueryWrapper<ChargeOrder> vipQuery = new QueryWrapper<>();
// vipQuery.select("create_date,sum(total_price)");
// vipQuery.ge("pay_time", beginTime);
// vipQuery.le("pay_time", endTime);
//
// vipQuery.groupBy("create_date");
// vipQuery.orderByAsc("create_date");
// vipQuery.isNotNull("vip_id");
// List<Map<String, Object>> vipMaps = chargeOrderMapper.selectMaps(vipQuery);
QueryWrapper<ChargeOrder> commonQuery = new QueryWrapper<>();
commonQuery.select("create_date,sum(total_price)");
commonQuery.ge("pay_time", beginTime);
commonQuery.le("pay_time", endTime);
commonQuery.groupBy("create_date");
commonQuery.orderByAsc("create_date");
// commonQuery.isNull("vip_id");
List<Map<String, Object>> commonMaps = chargeOrderMapper.selectMaps(commonQuery);
List<LocalDate> dateList = DateUtil.getDatesBetween(beginTime, endTime);
Map<Object, BigDecimal> tempMap = new TreeMap<>();
for (LocalDate date : dateList) {
tempMap.put(date.toString(), BigDecimal.ZERO);
}
// for (Map<String, Object> map : vipMaps) {
// tempMap.put(map.get("create_date").toString(), (BigDecimal) map.get("sum"));
// }
PersonPayOverviewVo personPayOverview = new PersonPayOverviewVo();
personPayOverview.setDateList(dateList.stream().map(LocalDate::toString).toList());
// personPayOverview.setVipPrice(new ArrayList<>(tempMap.values()));
for (Map<String, Object> map : commonMaps) {
tempMap.put(map.get("create_date").toString(), (BigDecimal) map.get("sum"));
}
personPayOverview.setCommonPrice(new ArrayList<>(tempMap.values()));
return personPayOverview;
}
}