diff --git a/src/main/java/com/syjiaer/clinic/server/controller/charge/ChargeController.java b/src/main/java/com/syjiaer/clinic/server/controller/charge/ChargeController.java
index 390d529..9850cb6 100644
--- a/src/main/java/com/syjiaer/clinic/server/controller/charge/ChargeController.java
+++ b/src/main/java/com/syjiaer/clinic/server/controller/charge/ChargeController.java
@@ -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
*
* @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;
}
diff --git a/src/main/java/com/syjiaer/clinic/server/entity/diagnosis/Diagnosis.java b/src/main/java/com/syjiaer/clinic/server/entity/diagnosis/Diagnosis.java
index af687f5..81be0ea 100644
--- a/src/main/java/com/syjiaer/clinic/server/entity/diagnosis/Diagnosis.java
+++ b/src/main/java/com/syjiaer/clinic/server/entity/diagnosis/Diagnosis.java
@@ -16,7 +16,7 @@ import lombok.experimental.Accessors;
*
*
* @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;
}
diff --git a/src/main/java/com/syjiaer/clinic/server/service/charge/ChargeService.java b/src/main/java/com/syjiaer/clinic/server/service/charge/ChargeService.java
index 7f30730..8377b35 100644
--- a/src/main/java/com/syjiaer/clinic/server/service/charge/ChargeService.java
+++ b/src/main/java/com/syjiaer/clinic/server/service/charge/ChargeService.java
@@ -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 {
@@ -97,9 +102,9 @@ public class ChargeService extends BaseService {
@Transactional(rollbackFor = Exception.class)
- public ChargeOrder save(ChargeSaveDto dto){
+ public ChargeOrder save(ChargeSaveDto dto) {
ChargeOrder dbOrder = chargeOrderMapper.selectById(dto.getId());
- if (dbOrder != null){
+ if (dbOrder != null) {
//清除已有的订单
chargeItemListMapper.delete(new QueryWrapper().eq("charge_order_code", dbOrder.getCode()));
chargeGoodsListMapper.delete(new QueryWrapper().eq("charge_order_code", dbOrder.getCode()));
@@ -113,7 +118,7 @@ public class ChargeService extends BaseService {
BigDecimal preTotalPrice = BigDecimal.ZERO;
BigDecimal totalPrice = BigDecimal.ZERO;
List chargeServiceLists = new ArrayList<>();
- for (DiagnosisMedicalItemList service : dto.getItemDetail()){
+ for (DiagnosisMedicalItemList service : dto.getItemDetail()) {
ChargeItemList itemList = new ChargeItemList();
String fsn = StringUtil.getCode("FSN");
itemList.setChargeOrderCode(code);
@@ -136,10 +141,10 @@ public class ChargeService extends BaseService {
chargeItemListMapper.insert(chargeServiceLists);
List chargeGoodsLists = new ArrayList<>();
- for (ChargeGoodsListVo goods : dto.getGoodsDetail()){
+ for (ChargeGoodsListVo goods : dto.getGoodsDetail()) {
ChargeGoodsList itemList = new ChargeGoodsList();
Goods dbGoods = goodsMapper.selectById(goods.getId());
- if (dbGoods == null){
+ if (dbGoods == null) {
throw new RuntimeException("商品不存在");
}
String fsn = StringUtil.getCode("FSN");
@@ -151,7 +156,7 @@ public class ChargeService extends BaseService {
BigDecimal subTotalPrice = goods.getSelectedPrice().multiply(BigDecimal.valueOf(goods.getSelectedNum()));
itemList.setSubTotalPrice(subTotalPrice);
itemList.setTrdnFlag(true);
- if (dbGoods.getPackagingUnit().equals(goods.getSelectedUnit()) || dbGoods.getPackagingUnit().equals(dbGoods.getMinPackagingUnit())){
+ if (dbGoods.getPackagingUnit().equals(goods.getSelectedUnit()) || dbGoods.getPackagingUnit().equals(dbGoods.getMinPackagingUnit())) {
itemList.setTrdnFlag(false);
}
itemList.setUnit(goods.getSelectedUnit());
@@ -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());
@@ -181,18 +188,18 @@ public class ChargeService extends BaseService {
public Page pageList(ChargeQuery query) {
QueryWrapper queryWrapper = new QueryWrapper<>();
- if (query.getPageSize() == null || query.getPageSize() == 0){
+ if (query.getPageSize() == null || query.getPageSize() == 0) {
query.setPageSize(Constants.DetailPageSize);
}
- if (query.getPageNum() == null || query.getPageNum() == 0){
+ if (query.getPageNum() == null || query.getPageNum() == 0) {
query.setPageNum(1);
}
- if (query.getPatientName() != null){
- queryWrapper.like("patient_name",query.getPatientName());
+ if (query.getPatientName() != null) {
+ queryWrapper.like("patient_name", query.getPatientName());
}
Page orderPage = pageHelper(query.getPageNum(), query.getPageSize(), queryWrapper, chargeOrderMapper, "create_datetime", false);
List voList = new ArrayList<>();
- for (ChargeOrder chargeOrder : orderPage.getList()){
+ for (ChargeOrder chargeOrder : orderPage.getList()) {
ChargeDetailVo detailVo = new ChargeDetailVo();
BeanUtils.copyProperties(chargeOrder, detailVo);
detailVo.setPatientInfo(patientInfoMapper.selectById(chargeOrder.getPatientId()));
@@ -231,14 +238,23 @@ public class ChargeService extends BaseService {
//
// }
- public void completeOrder (Integer id,Integer payType){
+ public void completeOrder(Integer id, Integer payType) {
ChargeOrder order = chargeOrderMapper.selectById(id);
- if (order == null){
+ if (order == null) {
throw new MessageException("订单不存在");
}
- if (!order.getStatus().equals(RetailOrderStatusEnum.UNFINISHED.getCode())){
+ 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());
@@ -250,9 +266,9 @@ public class ChargeService extends BaseService {
for (ChargeGoodsListVo goodsList : goodsLists) {
Integer wholeNumber = 0;
Integer fragmentNumber = 0;
- if (goodsList.getPackagingUnit().equals(goodsList.getSelectedUnit())){
+ if (goodsList.getPackagingUnit().equals(goodsList.getSelectedUnit())) {
wholeNumber = goodsList.getSelectedNum();
- }else {
+ } else {
fragmentNumber = goodsList.getSelectedNum();
}
List logs = inventoryService.adjustNumberByGoodsId(goodsList.getId(), wholeNumber, fragmentNumber, "订单完成");
@@ -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());
@@ -280,7 +297,7 @@ public class ChargeService extends BaseService {
IM2204 im2204 = new IM2204();
List feedetails = new ArrayList<>();
- for (ChargeGoodsList goodsList : goodsLists){
+ for (ChargeGoodsList goodsList : goodsLists) {
IM2204.Feedetail feedetail = new IM2204.Feedetail();
feedetail.setFeedetl_sn(goodsList.getFeedetlSn());
feedetail.setMdtrt_id(registration.getMdtrtId());
@@ -303,7 +320,7 @@ public class ChargeService extends BaseService {
feedetail.setHosp_appr_flag("1");
feedetails.add(feedetail);
}
- for (ChargeItemList itemList : itemLists){
+ for (ChargeItemList itemList : itemLists) {
IM2204.Feedetail feedetail = new IM2204.Feedetail();
feedetail.setFeedetl_sn(itemList.getFeedetlSn());
feedetail.setMdtrt_id(registration.getMdtrtId());
@@ -335,7 +352,7 @@ public class ChargeService extends BaseService {
/**
* 医保预支付
*/
- public void socialPrePay(String changeOrderCode,String mdtrtCertType,String mdtrtCertNO,String insutype){
+ public void socialPrePay(String changeOrderCode, String mdtrtCertType, String mdtrtCertNO, String insutype) {
ChargeOrder order = chargeOrderMapper.selectByCode(changeOrderCode);
Diagnosis diagnosis = diagnosisMapper.selectByCode(order.getDiagnosisCode());
@@ -360,7 +377,7 @@ public class ChargeService extends BaseService {
}
- public void socialRealPay(String changeOrderCode,String mdtrtCertType,String mdtrtCertNO,String insutype){
+ public void socialRealPay(String changeOrderCode, String mdtrtCertType, String mdtrtCertNO, String insutype) {
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 dailyChargingReport(LocalDateTime startDateTime, LocalDateTime endDateTime) {
+ Map result = new HashMap<>();
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.between("create_datetime", startDateTime, endDateTime)
+ .eq("status", RetailOrderStatusEnum.FINISHED.getCode())
+ .orderByDesc("create_datetime");
+ List 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;
+ }
}
diff --git a/src/main/java/com/syjiaer/clinic/server/service/charge/vo/PaymentMethodVo.java b/src/main/java/com/syjiaer/clinic/server/service/charge/vo/PaymentMethodVo.java
new file mode 100644
index 0000000..028d5d4
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/service/charge/vo/PaymentMethodVo.java
@@ -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);
+ }
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/service/charge/vo/RetailOrderDailyChargingReportVo.java b/src/main/java/com/syjiaer/clinic/server/service/charge/vo/RetailOrderDailyChargingReportVo.java
new file mode 100644
index 0000000..9efee1c
--- /dev/null
+++ b/src/main/java/com/syjiaer/clinic/server/service/charge/vo/RetailOrderDailyChargingReportVo.java
@@ -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;
+
+}
diff --git a/src/main/java/com/syjiaer/clinic/server/service/diagnosis/MedicalRecordService.java b/src/main/java/com/syjiaer/clinic/server/service/diagnosis/MedicalRecordService.java
index 3f19030..c21c058 100644
--- a/src/main/java/com/syjiaer/clinic/server/service/diagnosis/MedicalRecordService.java
+++ b/src/main/java/com/syjiaer/clinic/server/service/diagnosis/MedicalRecordService.java
@@ -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);
-
-
-
-
-
}
/**
diff --git a/src/main/java/com/syjiaer/clinic/server/service/social/SocialDirectoryService.java b/src/main/java/com/syjiaer/clinic/server/service/social/SocialDirectoryService.java
index 95b7ddd..c3cc181 100644
--- a/src/main/java/com/syjiaer/clinic/server/service/social/SocialDirectoryService.java
+++ b/src/main/java/com/syjiaer/clinic/server/service/social/SocialDirectoryService.java
@@ -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;
}
diff --git a/src/main/java/com/syjiaer/clinic/server/service/statistics/StatisticsService.java b/src/main/java/com/syjiaer/clinic/server/service/statistics/StatisticsService.java
index abb47f9..f3a848d 100644
--- a/src/main/java/com/syjiaer/clinic/server/service/statistics/StatisticsService.java
+++ b/src/main/java/com/syjiaer/clinic/server/service/statistics/StatisticsService.java
@@ -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 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> vipMaps = chargeOrderMapper.selectMaps(vipQuery);
+ QueryWrapper 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> commonMaps = chargeOrderMapper.selectMaps(commonQuery);
+ List dateList = DateUtil.getDatesBetween(beginTime, endTime);
+ Map