|
@@ -68,6 +68,7 @@ import java.math.BigDecimal;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
+import java.util.stream.Stream;
|
|
|
|
|
|
@Slf4j
|
|
|
@Service
|
|
@@ -536,7 +537,7 @@ public class MzChargeDetailServiceImpl implements MzChargeDetailService {
|
|
|
//計算第二部位和DR费用
|
|
|
setSecondPartAndDrFeeForCharge(mzChargeDetails, mzYjReqMap, tcNoMap, reqAmountMap, zdChargeItemMap);
|
|
|
//预览的时候获取费用明细,需要打折,不是预览而是入库的时候不打折,因为入库后会有一次重新计算 计算惠民活动
|
|
|
- formatPriceRoundDetail(mzChargeDetail, mzChargeDetails, mzPatientMi, mzChargeDetailList, maxOrderNo, itemNo, receiptNo, YesNoEnum.YES.equals(yesNo)?true:false,zgmztczf);
|
|
|
+ formatPriceRoundDetail(mzChargeDetail, mzChargeDetails, mzPatientMi, mzChargeDetailList, maxOrderNo, itemNo, receiptNo, YesNoEnum.YES.equals(yesNo)?true:false,zgmztczf,mzYjReqs);
|
|
|
//yes 预览需要将原数据库中已存在的明细与临时生成的一起返回
|
|
|
if (YesNoEnum.YES.equals(yesNo)) {
|
|
|
for (MzChargeDetail mcd : mzChargeDetailList) {
|
|
@@ -816,7 +817,7 @@ public class MzChargeDetailServiceImpl implements MzChargeDetailService {
|
|
|
//所有应收费用的明细 将所有费用按照类型归类
|
|
|
Map<String, BigDecimal> feeMap = new HashMap<>();
|
|
|
//实际应付金额
|
|
|
- BigDecimal totalPayable = getTotalPayable(mzChargeDetailList, feeMap, true,null);
|
|
|
+ BigDecimal totalPayable = getTotalPayable(mzChargeDetailList, feeMap, true,null,null);
|
|
|
//实际应付金额 四舍五入后的值 收费员收的钱小数点后只有一位有效值
|
|
|
BigDecimal totalPayableRound = totalPayable.setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
//单病种收费不设置金额,所以自动设置金额
|
|
@@ -3894,7 +3895,7 @@ public class MzChargeDetailServiceImpl implements MzChargeDetailService {
|
|
|
//所有应收费用的明细 将所有费用按照类型归类
|
|
|
Map<String, BigDecimal> feeMap = new HashMap<>();
|
|
|
//实际应付金额
|
|
|
- BigDecimal totalPayable = getTotalPayable(mzChargeDetails, feeMap, false,null);
|
|
|
+ BigDecimal totalPayable = getTotalPayable(mzChargeDetails, feeMap, false,null,null);
|
|
|
MzReceiptSerial mzReceiptSerial = new MzReceiptSerial();
|
|
|
ReceiptSerialFee receiptSerialFee = new ReceiptSerialFee();
|
|
|
//退费后新的收款方式
|
|
@@ -4172,7 +4173,7 @@ public class MzChargeDetailServiceImpl implements MzChargeDetailService {
|
|
|
//所有应收费用的明细 将所有费用按照类型归类
|
|
|
Map<String, BigDecimal> feeMap = new HashMap<>();
|
|
|
//实际应付金额
|
|
|
- BigDecimal totalPayable = getTotalPayable(mzChargeDetails, feeMap, false,null);
|
|
|
+ BigDecimal totalPayable = getTotalPayable(mzChargeDetails, feeMap, false,null,null);
|
|
|
MzReceiptSerial mzReceiptSerial = new MzReceiptSerial();
|
|
|
ReceiptSerialFee receiptSerialFee = new ReceiptSerialFee();
|
|
|
//退费后新的收款方式
|
|
@@ -5007,7 +5008,7 @@ public class MzChargeDetailServiceImpl implements MzChargeDetailService {
|
|
|
List<MzChargeDetail> supplyFeeMzChargeDetails = new ArrayList<>();
|
|
|
//重新计算给药方式费用
|
|
|
// itemNo = formatSupplyFee(supplyFeeMzChargeDetails, newMzChargeDetailList, itemNo);
|
|
|
- formatPriceRoundDetail(new MzChargeDetail(mzDepositFileVo.getPatientId(), times), supplyFeeMzChargeDetails, mzPatientMi, newMzChargeDetailList, 127, ++itemNo, receiptNo, false,null);
|
|
|
+ formatPriceRoundDetail(new MzChargeDetail(mzDepositFileVo.getPatientId(), times), supplyFeeMzChargeDetails, mzPatientMi, newMzChargeDetailList, 127, ++itemNo, receiptNo, false,null,null);
|
|
|
// List<String> supplyList = supplyFeeMzChargeDetails.stream().filter(u -> StringUtils.isNotBlank(u.getChargeItemCode())).map-util.js(u -> u.getChargeItemCode()).collect(Collectors.toList());
|
|
|
// List<MzChargeDetail> removeList = new ArrayList<>();
|
|
|
// for (MzChargeDetail md : newMzChargeDetailList) {
|
|
@@ -5801,12 +5802,33 @@ public class MzChargeDetailServiceImpl implements MzChargeDetailService {
|
|
|
* @param needDiscount 是否需要做优惠计算
|
|
|
* @return
|
|
|
*/
|
|
|
- private BigDecimal getTotalPayable(List<MzChargeDetail> mzChargeDetailList, Map<String, BigDecimal> feeMap, boolean needDiscount,Integer mztczf) {
|
|
|
+ private BigDecimal getTotalPayable(List<MzChargeDetail> mzChargeDetailList, Map<String, BigDecimal> feeMap, boolean needDiscount,Integer mztczf,List<MzYjReq> mzYjReqs) {
|
|
|
BigDecimal totalPayable = BigDecimal.ZERO;
|
|
|
- List<String> chargeItemCodes = null;
|
|
|
+ List<String> chargeItemCodes = new ArrayList<>();
|
|
|
Map<String, ZdDiscountDetail> zdDiscountDetailMap = null;
|
|
|
- if(CollUtil.isNotEmpty(mzChargeDetailList)){
|
|
|
- chargeItemCodes = mzChargeDetailList.stream().filter(obj -> StrUtil.isNotBlank(obj.getChargeItemCode())).map(MzChargeDetail::getChargeItemCode).collect(Collectors.toList());
|
|
|
+ List<MzYjReq> tempMzYjReq = null;
|
|
|
+ Map<Integer, List<MzYjReq>> ReqNoGroup = new HashMap<>();
|
|
|
+ if(needDiscount && CollUtil.isNotEmpty(mzChargeDetailList)){
|
|
|
+ //医技项目拼接 医技申请号对应的检验检查号逗号
|
|
|
+ if(CollUtil.isEmpty(mzYjReqs)){
|
|
|
+ if(StrUtil.isNotBlank(mzChargeDetailList.get(0).getPatientId()) && mzChargeDetailList.get(0).getTimes() !=null){
|
|
|
+ tempMzYjReq = mzYjReqService.queryPatientIdAndTimes(mzChargeDetailList.get(0).getPatientId(), mzChargeDetailList.get(0).getTimes());
|
|
|
+ }
|
|
|
+ if(CollUtil.isEmpty(tempMzYjReq)){
|
|
|
+ chargeItemCodes = mzChargeDetailList.stream().filter(obj -> StrUtil.isNotBlank(obj.getChargeItemCode())).map(MzChargeDetail::getChargeItemCode).collect(Collectors.toList());
|
|
|
+ }else {
|
|
|
+ ReqNoGroup = tempMzYjReq.stream().collect(Collectors.groupingBy(item -> item.getReqNo()));
|
|
|
+ setChargeCodes(mzChargeDetailList, chargeItemCodes, tempMzYjReq);
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ List<MzYjReq> collect = mzYjReqs.stream().filter(item -> item.getReqNo() != null).collect(Collectors.toList());
|
|
|
+ if(CollUtil.isNotEmpty(collect)){
|
|
|
+ ReqNoGroup = collect.stream().collect(Collectors.groupingBy(item -> item.getReqNo()));
|
|
|
+ setChargeCodes(mzChargeDetailList, chargeItemCodes, collect);
|
|
|
+ }else {
|
|
|
+ chargeItemCodes = mzChargeDetailList.stream().filter(obj -> StrUtil.isNotBlank(obj.getChargeItemCode())).map(MzChargeDetail::getChargeItemCode).collect(Collectors.toList());
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
if (mzChargeDetailList != null && mzChargeDetailList.size() > 0) {
|
|
|
if(needDiscount){
|
|
@@ -5836,17 +5858,23 @@ public class MzChargeDetailServiceImpl implements MzChargeDetailService {
|
|
|
mzChargeDetail.setOrigPrice(unitPrice);
|
|
|
}
|
|
|
if(CollUtil.isNotEmpty(zdDiscountDetailMap)){
|
|
|
- if(zdDiscountDetailMap.get(mzChargeDetail.getChargeItemCode()) != null){
|
|
|
- ZdDiscountDetail zdDiscountDetail = zdDiscountDetailMap.get(mzChargeDetail.getChargeItemCode());
|
|
|
- if(NumberEnum.TWO.getCode().equals(zdDiscountDetail.getDiscountType()) && zdDiscountDetail.getDiscount() !=null && NumberUtil.isNumber(zdDiscountDetail.getDiscount())){
|
|
|
- unitPrice = Convert.toBigDecimal(zdDiscountDetail.getDiscount()).setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
- mzChargeDetail.setUnitPrice(unitPrice);
|
|
|
+ ZdDiscountDetail zdDiscountDetail = null;
|
|
|
+ if("1".equals(Convert.toStr(mzChargeDetail.getReqYj(),"0"))){
|
|
|
+ zdDiscountDetail = zdDiscountDetailMap.get(mzChargeDetail.getChargeItemCode()+","+ReqNoGroup.get(mzChargeDetail.getReqNo()).get(0).getOrderCode());
|
|
|
+ }else {
|
|
|
+ zdDiscountDetail = zdDiscountDetailMap.get(mzChargeDetail.getChargeItemCode());
|
|
|
}
|
|
|
- else if(NumberEnum.ONE.getCode().equals(zdDiscountDetail.getDiscountType()) && zdDiscountDetail.getDiscount() !=null && NumberUtil.isNumber(zdDiscountDetail.getDiscount())){
|
|
|
- unitPrice = Convert.toBigDecimal(zdDiscountDetail.getDiscount()).multiply(mzChargeDetail.getUnitPrice()).setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
- mzChargeDetail.setUnitPrice(unitPrice);
|
|
|
+ if(zdDiscountDetail !=null){
|
|
|
+ if(NumberEnum.TWO.getCode().equals(zdDiscountDetail.getDiscountType()) && zdDiscountDetail.getDiscount() !=null && NumberUtil.isNumber(zdDiscountDetail.getDiscount())){
|
|
|
+ unitPrice = Convert.toBigDecimal(zdDiscountDetail.getDiscount()).setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ mzChargeDetail.setUnitPrice(unitPrice);
|
|
|
+ }
|
|
|
+ else if(NumberEnum.ONE.getCode().equals(zdDiscountDetail.getDiscountType()) && zdDiscountDetail.getDiscount() !=null && NumberUtil.isNumber(zdDiscountDetail.getDiscount())){
|
|
|
+ unitPrice = Convert.toBigDecimal(zdDiscountDetail.getDiscount()).multiply(mzChargeDetail.getUnitPrice()).setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ mzChargeDetail.setUnitPrice(unitPrice);
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
+
|
|
|
}
|
|
|
else {
|
|
|
if(!shareholderCardService.checMzTckByPatientAndTimes(mzChargeDetail.getPatientId(),mzChargeDetail.getTimes(),mztczf)){
|
|
@@ -5855,9 +5883,17 @@ public class MzChargeDetailServiceImpl implements MzChargeDetailService {
|
|
|
discountMap = discountService.getTcDiscountRate(0, mzChargeDetail.getWarnDept(), chargeItemCodes);
|
|
|
}
|
|
|
if(CollUtil.isNotEmpty(discountMap)){
|
|
|
- if(discountMap.get(mzChargeDetail.getChargeItemCode()) !=null){
|
|
|
- unitPrice = discountMap.get(mzChargeDetail.getChargeItemCode()).multiply(mzChargeDetail.getUnitPrice()).setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
- mzChargeDetail.setUnitPrice(unitPrice);
|
|
|
+ if("1".equals(Convert.toStr(mzChargeDetail.getReqYj(),"0"))){
|
|
|
+ String tempStr = mzChargeDetail.getChargeItemCode() + "," + ReqNoGroup.get(mzChargeDetail.getReqNo()).get(0).getOrderCode();
|
|
|
+ if(discountMap.get(tempStr)!=null){
|
|
|
+ unitPrice = discountMap.get(tempStr).multiply(mzChargeDetail.getUnitPrice()).setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ mzChargeDetail.setUnitPrice(unitPrice);
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ if(discountMap.get(mzChargeDetail.getChargeItemCode()) !=null){
|
|
|
+ unitPrice = discountMap.get(mzChargeDetail.getChargeItemCode()).multiply(mzChargeDetail.getUnitPrice()).setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ mzChargeDetail.setUnitPrice(unitPrice);
|
|
|
+ }
|
|
|
}
|
|
|
}else {
|
|
|
Discount discount ;
|
|
@@ -5895,6 +5931,18 @@ public class MzChargeDetailServiceImpl implements MzChargeDetailService {
|
|
|
return totalPayable.setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
}
|
|
|
|
|
|
+ private void setChargeCodes(List<MzChargeDetail> mzChargeDetailList, List<String> chargeItemCodes, List<MzYjReq> tempMzYjReq) {
|
|
|
+ List<Integer> collect = tempMzYjReq.stream().map(item -> item.getReqNo()).collect(Collectors.toList());
|
|
|
+ Map<Integer, List<MzYjReq>> ReqNoGroup = tempMzYjReq.stream().collect(Collectors.groupingBy(item -> item.getReqNo()));
|
|
|
+ for (MzChargeDetail mzChargeDetail : mzChargeDetailList) {
|
|
|
+ if(!Constants.TC.equals(mzChargeDetail.getBillItemCode()) && "1".equals(Convert.toStr(mzChargeDetail.getReqYj(), "0")) && collect.contains(mzChargeDetail.getReqNo())){
|
|
|
+ chargeItemCodes.add(mzChargeDetail.getChargeItemCode()+","+ReqNoGroup.get(mzChargeDetail.getReqNo()).get(0).getOrderCode());
|
|
|
+ }else {
|
|
|
+ chargeItemCodes.add(mzChargeDetail.getChargeItemCode());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 将总金额的零头转做四舍五入的收费明细记录
|
|
|
*
|
|
@@ -5906,7 +5954,7 @@ public class MzChargeDetailServiceImpl implements MzChargeDetailService {
|
|
|
* @param itemNo
|
|
|
* @param needDiscount 是否需要做优惠计算
|
|
|
*/
|
|
|
- private void formatPriceRoundDetail(MzChargeDetail mzChargeDetail, List<MzChargeDetail> mzChargeDetails, MzPatientMi mzPatientMi, List<MzChargeDetail> mzChargeDetailList, Integer maxOrderNo, Integer itemNo, Integer receiptNo, boolean needDiscount,Integer mztczf) {
|
|
|
+ private void formatPriceRoundDetail(MzChargeDetail mzChargeDetail, List<MzChargeDetail> mzChargeDetails, MzPatientMi mzPatientMi, List<MzChargeDetail> mzChargeDetailList, Integer maxOrderNo, Integer itemNo, Integer receiptNo, boolean needDiscount,Integer mztczf,List<MzYjReq> mzYjReqs) {
|
|
|
List<MzChargeDetail> temp = new ArrayList<>();
|
|
|
temp.addAll(mzChargeDetailList);
|
|
|
if (mzChargeDetails != null) {
|
|
@@ -5917,7 +5965,7 @@ public class MzChargeDetailServiceImpl implements MzChargeDetailService {
|
|
|
//所有应收费用的明细 将所有费用按照类型归类
|
|
|
Map<String, BigDecimal> feeMap = new HashMap<>();
|
|
|
//实际应付金额
|
|
|
- getTotalPayable(temp, feeMap, needDiscount,mztczf);
|
|
|
+ getTotalPayable(temp, feeMap, needDiscount,mztczf,mzYjReqs);
|
|
|
// for (String key : feeMap.keySet()) {
|
|
|
// BigDecimal amount = feeMap.get(key).setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
// totalFee = totalFee.add(amount);
|