This commit is contained in:
LiJianZhao 2025-04-29 16:45:56 +08:00
parent e6d05506d8
commit 8447c5c0c0
11 changed files with 180 additions and 51 deletions

View File

@ -3,8 +3,10 @@ package com.syjiaer.clinic.server.controller.charge;
import com.syjiaer.clinic.server.common.api.output.OM2206A;
import com.syjiaer.clinic.server.common.api.output.OM2207A;
import com.syjiaer.clinic.server.common.util.DateUtil;
import com.syjiaer.clinic.server.common.vo.Page;
import com.syjiaer.clinic.server.common.vo.Result;
import com.syjiaer.clinic.server.controller.BaseController;
import com.syjiaer.clinic.server.entity.charge.ChargeLog;
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;
@ -91,6 +93,7 @@ public class ChargeController extends BaseController {
}
@RequestMapping("/getListByPatientId")
public Result<List<ChargeOrder>> getListByPatientId() {
Integer patientId = parmsUtil.getInteger("patientId");
@ -98,4 +101,11 @@ public class ChargeController extends BaseController {
}
@RequestMapping("/getChargeRecord")
public Result<Page<ChargeLog>> getChargeRecord() {
return success(chargeService.getChargeRecordPageList());
}
}

View File

@ -7,6 +7,7 @@ import com.syjiaer.clinic.server.controller.BaseController;
import com.syjiaer.clinic.server.entity.goods.Goods;
import com.syjiaer.clinic.server.entity.statistics.PersonPayOverviewVo;
import com.syjiaer.clinic.server.entity.statistics.RevenueOverviewVo;
import com.syjiaer.clinic.server.entity.statistics.SalePersonReportVo;
import com.syjiaer.clinic.server.service.goods.GoodsService;
import com.syjiaer.clinic.server.service.inventory.InventoryService;
import com.syjiaer.clinic.server.service.statistics.StatisticsService;
@ -49,6 +50,7 @@ public class StatisticsController extends BaseController {
public Result<List<Goods>> numberEarlyWarning() {
QueryWrapper<Goods> goodsQuery = new QueryWrapper<>();
goodsQuery.apply("inventory_whole_number <= inventory_warn_number");
goodsQuery.last("limit 20");
List<Goods> list = goodsService.list(goodsQuery);
return success(list);
}
@ -70,5 +72,12 @@ public class StatisticsController extends BaseController {
}
@RequestMapping("/salePerson")
public Result<List<SalePersonReportVo>> salePerson() {
return success( statisticsService.salePersonReport());
}
}

View File

@ -75,5 +75,5 @@ public class ChargeOrder implements Serializable {
private BigDecimal totalCost;
@ApiModelProperty("销售人id")
private Integer salePersionId;
private Integer salePersonId;
}

View File

@ -7,6 +7,7 @@ import java.math.BigDecimal;
@Getter
@Setter
public class PayTypeRevenue {
private Integer payType;
private BigDecimal totalRevenue;
private String name;
}

View File

@ -14,16 +14,18 @@ import java.util.List;
public class RevenueOverviewVo {
//总营业额
private BigDecimal totalRevenue;
//会员销售额
private BigDecimal vipRevenue;
//医保销售额
private BigDecimal socialRevenue;
//总完成单数
private Long totalOrderCount;
//会员单数
private Long vipOrderCount;
//医保单数
private Long socialOrderCount;
private List<GoodsTypeRevenue> goodsTypeRevenue;
private List<PayTypeRevenue> payTypeRevenue;
}

View File

@ -0,0 +1,28 @@
package com.syjiaer.clinic.server.entity.statistics;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class SalePersonReportVo {
private Integer salePersonId;
private String salePersonName;
private BigDecimal totalIncome;
private BigDecimal wechatIncome;
private BigDecimal aliPayIncome;
private BigDecimal cashIncome;
private BigDecimal otherIncome;
private BigDecimal socialIncome;
private Long count;
public SalePersonReportVo() {
this.totalIncome = BigDecimal.ZERO;
this.wechatIncome = BigDecimal.ZERO;
this.aliPayIncome = BigDecimal.ZERO;
this.cashIncome = BigDecimal.ZERO;
this.otherIncome = BigDecimal.ZERO;
this.socialIncome = BigDecimal.ZERO;
this.count = 0L;
}
}

View File

@ -4,6 +4,9 @@ import com.syjiaer.clinic.server.entity.charge.ChargeOrder;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
import java.util.Map;
/**
* <p>
@ -16,6 +19,7 @@ import org.apache.ibatis.annotations.Select;
public interface ChargeOrderMapper extends BaseMapper<ChargeOrder> {
@Select("select * from charge_order where code = #{code}")
ChargeOrder selectByCode(String code);
@Select("SELECT sale_person_id,pay_type,\"sum\"(total_price) ,\"count\"(0) FROM \"public\".\"charge_order\" GROUP BY sale_person_id,pay_type")
List<Map<String, Object>> selectSaleReport();
}

View File

@ -20,7 +20,7 @@ public interface InventoryMapper extends BaseMapper<Inventory> {
@Select("SELECT" +
" inventory.*,goods.expiry_warn_days,goods.unit_price,EXTRACT(EPOCH FROM AGE(expiry_date, CURRENT_DATE)) / 86400 AS remaining_days" +
" FROM inventory LEFT JOIN goods ON inventory.good_id = goods.id" +
" WHERE CURRENT_DATE + INTERVAL '1 day' * goods.expiry_warn_days >= inventory.expiry_date AND inventory.whole_number !=0")
" WHERE CURRENT_DATE + INTERVAL '1 day' * goods.expiry_warn_days >= inventory.expiry_date AND inventory.whole_number !=0 limit 20")
List<Map<String, Object>> selectExpiryWarn();
}

View File

@ -35,10 +35,7 @@ import com.syjiaer.clinic.server.entity.patient.PatientRegistration;
import com.syjiaer.clinic.server.entity.social.SocialDirectory;
import com.syjiaer.clinic.server.entity.social.SocialItem;
import com.syjiaer.clinic.server.entity.social.SocialUser;
import com.syjiaer.clinic.server.mapper.charge.ChargeGoodsListMapper;
import com.syjiaer.clinic.server.mapper.charge.ChargeItemListMapper;
import com.syjiaer.clinic.server.mapper.charge.ChargeLogMapper;
import com.syjiaer.clinic.server.mapper.charge.ChargeOrderMapper;
import com.syjiaer.clinic.server.mapper.charge.*;
import com.syjiaer.clinic.server.mapper.diagnosis.DiagnosisMapper;
import com.syjiaer.clinic.server.mapper.diagnosis.DiagnosisMedicalGoodsListMapper;
import com.syjiaer.clinic.server.mapper.diagnosis.DiagnosisMedicalItemListMapper;
@ -77,6 +74,8 @@ public class ChargeService extends BaseService {
@Autowired
private ChargeLogMapper chargeLogMapper;
@Autowired
private ChargeInventoryLogMapper chargeInventoryLogMapper;
@Autowired
private SocialUserMapper socialUserMapper;
@Autowired
private ChargeItemListMapper chargeItemListMapper;
@ -330,6 +329,8 @@ public class ChargeService extends BaseService {
updateOrder.setPayType(payType);
updateOrder.setPayTime(LocalDateTime.now());
chargeOrderMapper.updateById(updateOrder);
order = chargeOrderMapper.selectById(id);
//扣除商品库存
List<ChargeGoodsListVo> goodsLists = chargeGoodsListMapper.selectDetailByCode(order.getCode());
for (ChargeGoodsListVo goodsList : goodsLists) {
@ -347,10 +348,12 @@ public class ChargeService extends BaseService {
log.setSocialType(InventorySocialTypeEnum.INVENTORY_SURPLUS.getType());
}
inventoryLogMapper.insert(logs);
this.recordChargeInventoryLog(logs,order);
}
//记录收费日志
this.recordChargeLog(order, ChargeSourceEnum.CHARGE, ChargeTypeEnum.CHARGE);
}
public void uploadCostDetails(String changeOrderCode) {
@ -602,10 +605,10 @@ public class ChargeService extends BaseService {
chargeLog.setNetReceipts(chargeOrder.getTotalPrice());
chargeLog.setDiscount(chargeOrder.getTotalPrice().subtract(chargeOrder.getPreTotalPrice()));
chargeLog.setPayType(chargeOrder.getPayType());
if (chargeOrder.getSalePersionId() != null){
OrganizationMember organizationMember = organizationMemberMapper.selectById(chargeOrder.getSalePersionId());
if (chargeOrder.getSalePersonId() != null){
OrganizationMember organizationMember = organizationMemberMapper.selectById(chargeOrder.getSalePersonId());
chargeLog.setSalePersonName(organizationMember.getName());
chargeLog.setSalePersonId(chargeOrder.getSalePersionId());
chargeLog.setSalePersonId(chargeOrder.getSalePersonId());
}
chargeLog.setChargeTime(LocalDateTime.now());
chargeLog.setProjectCode(chargeOrder.getCode());
@ -614,7 +617,9 @@ public class ChargeService extends BaseService {
/**
* 销售库存变更 日志
*/
public void recordChargeInventoryLog(InventoryLog log,ChargeOrder chargeOrder){
public void recordChargeInventoryLog(List<InventoryLog> logs,ChargeOrder chargeOrder){
List<ChargeInventoryLog> chargeInventoryLogs = new ArrayList<>();
for (InventoryLog log : logs){
ChargeInventoryLog chargeInventoryLog = new ChargeInventoryLog();
chargeInventoryLog.setChargeOrderCode(chargeOrder.getCode());
chargeInventoryLog.setGoodsId(log.getGoodsId());
@ -624,7 +629,7 @@ public class ChargeService extends BaseService {
chargeInventoryLog.setTrdnFlag(false);
chargeInventoryLog.setUnit(dbGoods.getPackagingUnit());
chargeInventoryLog.setNumber(log.getChangeWholeNumber());
if (log.getChangeFragmentNumber() > 0 ){
if (log.getChangeFragmentNumber() != 0 ){
chargeInventoryLog.setTrdnFlag(true);
chargeInventoryLog.setUnit(dbGoods.getMinPackagingUnit());
chargeInventoryLog.setNumber(log.getChangeWholeNumber()*dbGoods.getMinPackagingNumber()+log.getChangeFragmentNumber());
@ -633,9 +638,26 @@ public class ChargeService extends BaseService {
listWrapper.eq("charge_order_code",chargeOrder.getCode());
listWrapper.eq("goods_id",log.getGoodsId());
ChargeGoodsList chargeGoodsList = chargeGoodsListMapper.selectOne(listWrapper);
// chargeInventoryLog.setUnitPrice(chargeGoodsList.getUnitPrice());
chargeInventoryLog.setFeedetlSn(chargeGoodsList.getFeedetlSn());
chargeInventoryLog.setCreateTime(LocalDateTime.now());
chargeInventoryLog.setGoodsType(chargeGoodsList.getType());
chargeInventoryLog.setUploadStatus(UploadStatusEnum.NoUpload.getStatus());
chargeInventoryLog.setType(ChargeTypeEnum.CHARGE.getChargeType());
chargeInventoryLogs.add(chargeInventoryLog);
}
chargeInventoryLogMapper.insert(chargeInventoryLogs);
}
/**
* 获取收费记录
* @return
*/
public Page<ChargeLog> getChargeRecordPageList() {
QueryWrapper<ChargeLog> queryWrapper = new QueryWrapper<>();
Page<ChargeLog> page = pageHelper(1, 20, queryWrapper, chargeLogMapper, "charge_time", false);
return page;
}
}

View File

@ -99,6 +99,7 @@ public class MedicalRecordService extends BaseService {
Diagnosis diagnosis = new Diagnosis();
QueryWrapper<Diagnosis> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("registration_id", saveDto.getRegistrationId());
queryWrapper.last("limit 1");
Diagnosis dbDiagnosis = diagnosisMapper.selectOne(queryWrapper);
if (dbDiagnosis!=null){
diagnosis.setId(dbDiagnosis.getId());

View File

@ -8,12 +8,11 @@ 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.entity.organization.OrganizationMember;
import com.syjiaer.clinic.server.entity.statistics.*;
import com.syjiaer.clinic.server.mapper.charge.ChargeGoodsListMapper;
import com.syjiaer.clinic.server.mapper.charge.ChargeOrderMapper;
import com.syjiaer.clinic.server.mapper.organization.OrganizationMemberMapper;
import com.syjiaer.clinic.server.service.BaseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -29,6 +28,9 @@ public class StatisticsService extends BaseService {
private ChargeOrderMapper chargeOrderMapper;
@Autowired
private ChargeGoodsListMapper chargeGoodsListMapper;
@Autowired
private OrganizationMemberMapper organizationMemberMapper;
public RevenueOverviewVo getRevenueOverview(LocalDateTime begin, LocalDateTime end) {
RevenueOverviewVo overviewVo = new RevenueOverviewVo();
QueryWrapper<ChargeOrder> queryWrapper = new QueryWrapper<>();
@ -39,11 +41,19 @@ public class StatisticsService extends BaseService {
Map<String, Object> map = chargeOrderMapper.selectMaps(queryWrapper).get(0);
overviewVo.setTotalRevenue((BigDecimal) map.getOrDefault("total_revenue", new BigDecimal(0)));
overviewVo.setTotalOrderCount((Long) map.getOrDefault("total_order_count", new BigDecimal(0)));
//
// queryWrapper.isNotNull("vip_id");
// Map<String, Object> vipMap = retailOrderService.getMap(queryWrapper);
// overviewVo.setVipRevenue((BigDecimal) vipMap.getOrDefault("total_revenue",new BigDecimal(0)));
// overviewVo.setVipOrderCount((Long) vipMap.getOrDefault("total_order_count",new BigDecimal(0)));
//医保概况数据
QueryWrapper<ChargeOrder> socialQuery = new QueryWrapper<>();
socialQuery.select("sum(total_price) as total_revenue,count(*) as total_order_count");
socialQuery.ge("pay_time", begin);
socialQuery.le("pay_time", end);
socialQuery.eq("pay_type", RetailOrderPayTypeEnum.MEDICARE.getCode());
socialQuery.eq("status", RetailOrderStatusEnum.FINISHED.getCode());
Map<String, Object> socialMap = chargeOrderMapper.selectMaps(socialQuery).get(0);
overviewVo.setSocialRevenue((BigDecimal) socialMap.getOrDefault("total_revenue", new BigDecimal(0)));
overviewVo.setSocialOrderCount((Long) socialMap.getOrDefault("total_order_count", new BigDecimal(0)));
QueryWrapper<ChargeOrder> payTypeQuery = new QueryWrapper<>();
payTypeQuery.ge("pay_time", begin);
@ -58,6 +68,7 @@ public class StatisticsService extends BaseService {
List<PayTypeRevenue> payTypeRevenueList = new ArrayList<>();
for (Map<String, Object> payTypeMap : payTypeMaps) {
PayTypeRevenue revenue = new PayTypeRevenue();
revenue.setPayType((Integer) payTypeMap.get("pay_type"));
revenue.setName(RetailOrderPayTypeEnum.getByCode((Integer) payTypeMap.get("pay_type")).getDesc());
revenue.setTotalRevenue((BigDecimal) payTypeMap.getOrDefault("total_revenue", new BigDecimal(0)));
payTypeRevenueList.add(revenue);
@ -87,6 +98,7 @@ public class StatisticsService extends BaseService {
return overviewVo;
}
@ -130,4 +142,44 @@ public class StatisticsService extends BaseService {
return personPayOverview;
}
public List<SalePersonReportVo> salePersonReport() {
List<Map<String, Object>> maps = chargeOrderMapper.selectSaleReport();
Map<Integer, SalePersonReportVo> voMaps = new HashMap<>();
for (Map<String, Object> map : maps) {
Integer salePersonId = (Integer) map.get("sale_person_id");
SalePersonReportVo vo = voMaps.getOrDefault(salePersonId, new SalePersonReportVo());
vo.setSalePersonId(salePersonId);
OrganizationMember organizationMember = organizationMemberMapper.selectById(salePersonId);
vo.setSalePersonName(organizationMember.getName());
vo.setTotalIncome(vo.getTotalIncome().add((BigDecimal) map.get("sum")));
vo.setCount(vo.getCount()+(Long) map.get("count"));
RetailOrderPayTypeEnum payType = RetailOrderPayTypeEnum.getByCode((Integer) map.get("pay_type"));
if (payType == null){
continue;
}
switch (payType) {
case WXPAY:
vo.setWechatIncome(vo.getWechatIncome().add((BigDecimal) map.get("sum")));
break;
case ALIPAY:
vo.setAliPayIncome(vo.getAliPayIncome().add((BigDecimal) map.get("sum")));
break;
case CASH:
vo.setCashIncome(vo.getCashIncome().add((BigDecimal) map.get("sum")));
break;
case OTHER:
vo.setOtherIncome(vo.getOtherIncome().add((BigDecimal) map.get("sum")));
break;
case MEDICARE:
vo.setSocialIncome(vo.getSocialIncome().add((BigDecimal) map.get("sum")));
break;
default:
break;
}
voMaps.put(salePersonId, vo);
}
List<SalePersonReportVo> result = voMaps.values().stream().toList();
return result;
}
}