|
|
@@ -12,24 +12,30 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
|
|
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
|
|
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
|
|
|
+import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
|
|
|
import cn.iocoder.yudao.module.system.controller.admin.biz.vo.*;
|
|
|
import cn.iocoder.yudao.module.system.dal.dataobject.biz.*;
|
|
|
-import cn.iocoder.yudao.module.system.dal.mysql.biz.ElderlyChangeRecordMapper;
|
|
|
-import cn.iocoder.yudao.module.system.dal.mysql.biz.BuildBedMapper;
|
|
|
-import cn.iocoder.yudao.module.system.dal.mysql.biz.ElderlyInfoMapper;
|
|
|
+import cn.iocoder.yudao.module.system.dal.mysql.biz.*;
|
|
|
import cn.iocoder.yudao.module.system.enums.common.BooleanEnum;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.validation.annotation.Validated;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.time.LocalDate;
|
|
|
+import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
|
+import java.util.Objects;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
|
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exceptionCustomMsg;
|
|
|
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.BED_CHANGE_RECORD_NOT_EXISTS;
|
|
|
+import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.COMMON_ERROR;
|
|
|
|
|
|
/**
|
|
|
* 床位变更记录 Service 实现类
|
|
|
@@ -52,6 +58,14 @@ public class NurseChangeRecordServiceImpl implements ElderlyChangeRecordService
|
|
|
@Autowired
|
|
|
private ElderlyInfoMapper elderlyInfoMapper;
|
|
|
|
|
|
+ @Resource
|
|
|
+ private ExpenseItemMapper expenseItemMapper;
|
|
|
+
|
|
|
+ private ExpenseMapper expenseMapper;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private SysOverheadChargeMapper sysOverheadChargeMapper;
|
|
|
+
|
|
|
@Override
|
|
|
public Long createBedChangeRecord(BedChangeRecordSaveReqVO createReqVO) {
|
|
|
// 插入
|
|
|
@@ -96,8 +110,8 @@ public class NurseChangeRecordServiceImpl implements ElderlyChangeRecordService
|
|
|
|
|
|
@Override
|
|
|
@TenantIgnore
|
|
|
- public BedChangeRecordRespVO detail(Long id, Integer status,Boolean isDetail) {
|
|
|
- Integer currentFlag = 0;
|
|
|
+ public BedChangeRecordRespVO detail(Long id, Integer status, Boolean isDetail) {
|
|
|
+ Integer currentFlag = 0;
|
|
|
if (null != status && status == 4) {
|
|
|
Integer count = bedChangeRecordMapper.checkBpmBusinessFormById(id);
|
|
|
if (null == count || count == 0) {
|
|
|
@@ -191,7 +205,7 @@ public class NurseChangeRecordServiceImpl implements ElderlyChangeRecordService
|
|
|
|
|
|
@Override
|
|
|
@TenantIgnore
|
|
|
- public NurseChangeDetailRespVO getNurseDetail(Long id,Boolean isDetail) {
|
|
|
+ public NurseChangeDetailRespVO getNurseDetail(Long id, Boolean isDetail) {
|
|
|
NurseChangeDetailRespVO detail = isDetail ? bedChangeRecordMapper.getNurseDetail(id) : bedChangeRecordMapper.createNurseChangeGetDetail(id);
|
|
|
detail.setBedName(buildService.getFullBedName(detail.getElderlyId()));
|
|
|
return detail;
|
|
|
@@ -199,9 +213,153 @@ public class NurseChangeRecordServiceImpl implements ElderlyChangeRecordService
|
|
|
|
|
|
@Override
|
|
|
@TenantIgnore
|
|
|
- public CateringChangeDetailRespVO getCateringDetail(Long id,Boolean isDetail) {
|
|
|
+ public CateringChangeDetailRespVO getCateringDetail(Long id, Boolean isDetail) {
|
|
|
CateringChangeDetailRespVO detail = isDetail ? bedChangeRecordMapper.getCateringDetail(id) : bedChangeRecordMapper.createCateringChangeGetDetail(id);
|
|
|
detail.setBedName(buildService.getFullBedName(detail.getElderlyId()));
|
|
|
return detail;
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void swapBed(BedSwapReqVO reqVO) {
|
|
|
+ if (reqVO.getElderIdA() == null || reqVO.getElderIdB() == null) {
|
|
|
+ throw exceptionCustomMsg(COMMON_ERROR, "长者ID不能为空");
|
|
|
+ }
|
|
|
+ if (reqVO.getElderIdA().equals(reqVO.getElderIdB())) {
|
|
|
+ throw exceptionCustomMsg(COMMON_ERROR, "两位长者不能相同");
|
|
|
+ }
|
|
|
+ LocalDate startDate = reqVO.getStartDate();
|
|
|
+ if (startDate == null) {
|
|
|
+ throw exceptionCustomMsg(COMMON_ERROR, "开始日期不能为空");
|
|
|
+ }
|
|
|
+
|
|
|
+ ElderlyInfoDO elderA = elderlyInfoMapper.selectById(reqVO.getElderIdA());
|
|
|
+ ElderlyInfoDO elderB = elderlyInfoMapper.selectById(reqVO.getElderIdB());
|
|
|
+ if (elderA == null || elderB == null) {
|
|
|
+ throw exceptionCustomMsg(COMMON_ERROR, "长者信息不存在");
|
|
|
+ }
|
|
|
+ if (reqVO.getBedIdA() != null && !reqVO.getBedIdA().equals(elderA.getBedId())) {
|
|
|
+ throw exceptionCustomMsg(COMMON_ERROR, "长者A床位ID与当前床位不匹配");
|
|
|
+ }
|
|
|
+ if (reqVO.getBedIdB() != null && !reqVO.getBedIdB().equals(elderB.getBedId())) {
|
|
|
+ throw exceptionCustomMsg(COMMON_ERROR, "长者B床位ID与当前床位不匹配");
|
|
|
+ }
|
|
|
+
|
|
|
+ validateExpenseParams(reqVO);
|
|
|
+
|
|
|
+ BuildBedDO bedA = buildBedMapper.selectById(elderA.getBedId());
|
|
|
+ BuildBedDO bedB = buildBedMapper.selectById(elderB.getBedId());
|
|
|
+ if (bedA == null || bedB == null) {
|
|
|
+ throw exceptionCustomMsg(COMMON_ERROR, "床位信息不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ elderA.setBedId(bedB.getId());
|
|
|
+ elderA.setBedName(bedB.getBedName());
|
|
|
+ elderA.setRoomId(bedB.getRoomId());
|
|
|
+ elderA.setFloorId(bedB.getFloorId());
|
|
|
+ elderA.setBuildId(bedB.getBuildId());
|
|
|
+
|
|
|
+ elderB.setBedId(bedA.getId());
|
|
|
+ elderB.setBedName(bedA.getBedName());
|
|
|
+ elderB.setRoomId(bedA.getRoomId());
|
|
|
+ elderB.setFloorId(bedA.getFloorId());
|
|
|
+ elderB.setBuildId(bedA.getBuildId());
|
|
|
+
|
|
|
+ elderlyInfoMapper.updateById(elderA);
|
|
|
+ elderlyInfoMapper.updateById(elderB);
|
|
|
+
|
|
|
+ if (reqVO.getNewExpenseItemIdA() != null) {
|
|
|
+ handleExpenseItemSwap(reqVO, true);
|
|
|
+ }
|
|
|
+ if (reqVO.getNewExpenseItemIdB() != null) {
|
|
|
+ handleExpenseItemSwap(reqVO, false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void validateExpenseParams(BedSwapReqVO reqVO) {
|
|
|
+ boolean changeA = reqVO.getNewExpenseItemIdA() != null;
|
|
|
+ boolean changeB = reqVO.getNewExpenseItemIdB() != null;
|
|
|
+ if (changeA != changeB) {
|
|
|
+ throw exceptionCustomMsg(COMMON_ERROR, "费用变更需同时提交A/B两位长者的信息");
|
|
|
+ }
|
|
|
+ if (!changeA) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ validateExpenseParamsForElder(reqVO, true);
|
|
|
+ validateExpenseParamsForElder(reqVO, false);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void validateExpenseParamsForElder(BedSwapReqVO reqVO, boolean isElderA) {
|
|
|
+ String label = isElderA ? "长者A" : "长者B";
|
|
|
+ Long originalExpenseItemId = isElderA ? reqVO.getOriginalExpenseItemIdA() : reqVO.getOriginalExpenseItemIdB();
|
|
|
+ if (originalExpenseItemId == null) {
|
|
|
+ throw exceptionCustomMsg(COMMON_ERROR, label + "原费用项目ID不能为空");
|
|
|
+ }
|
|
|
+ Integer isDiscount = isElderA ? reqVO.getIsDiscountA() : reqVO.getIsDiscountB();
|
|
|
+ BigDecimal discountAmount = isElderA ? reqVO.getDiscountAmountA() : reqVO.getDiscountAmountB();
|
|
|
+ BigDecimal actualAmount = isElderA ? reqVO.getActualAmountA() : reqVO.getActualAmountB();
|
|
|
+ if (actualAmount != null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (isDiscount != null && isDiscount == 1 && discountAmount == null) {
|
|
|
+ throw exceptionCustomMsg(COMMON_ERROR, label + "打折时折扣金额不能为空");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void handleExpenseItemSwap(BedSwapReqVO reqVO, boolean isElderA) {
|
|
|
+ Long originalExpenseItemId = isElderA ? reqVO.getOriginalExpenseItemIdA() : reqVO.getOriginalExpenseItemIdB();
|
|
|
+ Long elderId = isElderA ? reqVO.getElderIdA() : reqVO.getElderIdB();
|
|
|
+ if (originalExpenseItemId == null) {
|
|
|
+ throw exceptionCustomMsg(COMMON_ERROR, (isElderA ? "长者A" : "长者B") + "原费用项目ID不能为空");
|
|
|
+ }
|
|
|
+ ExpenseItemDO originalItem = expenseItemMapper.selectById(originalExpenseItemId);
|
|
|
+ if (originalItem == null) {
|
|
|
+ throw exceptionCustomMsg(COMMON_ERROR, (isElderA ? "长者A" : "长者B") + "原费用项目不存在");
|
|
|
+ }
|
|
|
+ List<ExpenseItemDO> expenseItemDOS = expenseItemMapper.selectList(new LambdaQueryWrapperX<ExpenseItemDO>()
|
|
|
+ .eq(ExpenseItemDO::getExpenseId, originalItem.getExpenseId()));
|
|
|
+ List<ExpenseItemDO> newExpenseItemList = new ArrayList<>();
|
|
|
+ for (ExpenseItemDO expenseItemDO : expenseItemDOS) {
|
|
|
+ expenseItemDO.setChangeEndDate(reqVO.getStartDate().plusDays(-1));
|
|
|
+ if(!Objects.equals(expenseItemDO.getId(), originalItem.getId())){
|
|
|
+ newExpenseItemList.add(expenseItemDO);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ expenseItemMapper.updateBatch(expenseItemDOS);
|
|
|
+
|
|
|
+ Long newExpenseItemId = isElderA ? reqVO.getNewExpenseItemIdA() : reqVO.getNewExpenseItemIdB();
|
|
|
+ OverheadChargeDO newCharge = sysOverheadChargeMapper.selectById(newExpenseItemId);
|
|
|
+ if (newCharge == null) {
|
|
|
+ throw exceptionCustomMsg(COMMON_ERROR, (isElderA ? "长者A" : "长者B") + "新费用项目不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ BigDecimal amount = BigDecimal.valueOf(newCharge.getPrice());
|
|
|
+ Integer isDiscount = isElderA ? reqVO.getIsDiscountA() : reqVO.getIsDiscountB();
|
|
|
+ BigDecimal discountAmount = isElderA ? reqVO.getDiscountAmountA() : reqVO.getDiscountAmountB();
|
|
|
+ BigDecimal actualAmount = isElderA ? reqVO.getActualAmountA() : reqVO.getActualAmountB();
|
|
|
+ int count = originalItem.getCount() == null ? 1 : originalItem.getCount();
|
|
|
+ BigDecimal totalAmount = actualAmount.multiply(BigDecimal.valueOf(count));
|
|
|
+
|
|
|
+ ExpenseItemDO newItem = new ExpenseItemDO();
|
|
|
+ BeanUtils.copyProperties(originalItem, newItem);
|
|
|
+ newItem.setId(null);
|
|
|
+ newItem.setItemId(newCharge.getId());
|
|
|
+ newItem.setItemName(newCharge.getChargeName());
|
|
|
+ newItem.setAmount(amount);
|
|
|
+ newItem.setActualAmount(actualAmount);
|
|
|
+ newItem.setTotalAmount(totalAmount);
|
|
|
+ newItem.setIsDiscount(isDiscount);
|
|
|
+ newItem.setDiscountAmount(discountAmount);
|
|
|
+ newItem.setChangeStartDate(reqVO.getStartDate());
|
|
|
+ newItem.setChangeEndDate(null);
|
|
|
+ newItem.setTenantId(originalItem.getTenantId() == null ? TenantContextHolder.getTenantId() : originalItem.getTenantId());
|
|
|
+ newExpenseItemList.add(newItem);
|
|
|
+ BigDecimal total = newExpenseItemList.stream().map(ExpenseItemDO::getActualAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ ExpenseDO expenseDO = new ExpenseDO();
|
|
|
+ expenseDO.setElderId(elderId);
|
|
|
+ expenseDO.setTotalAmount(total);
|
|
|
+ expenseMapper.insert(expenseDO);
|
|
|
+ newExpenseItemList = newExpenseItemList.stream().map(e->e.setExpenseId(expenseDO.getId())).collect(Collectors.toList());
|
|
|
+ expenseItemMapper.insertBatch(newExpenseItemList);
|
|
|
+ }
|
|
|
}
|