Commit f9d3c0eb authored by chenjiuping's avatar chenjiuping

Merge branch 'master_jiuping' into dev

parents 4cb5480a 3d68dd86
...@@ -139,5 +139,21 @@ public interface ReceiptService extends IService<ReceiptDO> { ...@@ -139,5 +139,21 @@ public interface ReceiptService extends IService<ReceiptDO> {
ReceiptExportDto getReceiptExportByOrderId(Long orderId); ReceiptExportDto getReceiptExportByOrderId(Long orderId);
/**
* 判断当前收款单有没有达到比例
*
* @param receiptDO
* @param proportion
* @return
*/
Boolean judgingProportion(ReceiptDO receiptDO, String proportion);
/**
* 自动更新收款单的核销状态
*
* @param receiptDO
*/
void autoWriteOffReceipt(ReceiptDO receiptDO, String userId, String userName);
} }
package cn.iocoder.yudao.module.wealth.service.receipt; package cn.iocoder.yudao.module.wealth.service.receipt;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.apollo.core.event.OrderNumberLogEvent; import cn.iocoder.yudao.framework.apollo.core.event.OrderNumberLogEvent;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
...@@ -101,8 +102,7 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO ...@@ -101,8 +102,7 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Long createReceipt(ReceiptCreateReqVO createReqVO) { public Long createReceipt(ReceiptCreateReqVO createReqVO) {
List<ReceivableUpdateReqVO> receivableUpdateReqVOList = List<ReceivableUpdateReqVO> receivableUpdateReqVOList = createReqVO.getReceivableVOList();
createReqVO.getReceivableVOList();
if (CollectionUtil.isEmpty(receivableUpdateReqVOList)) { if (CollectionUtil.isEmpty(receivableUpdateReqVOList)) {
throw exception(RECEIVABLE_NOT_NULL); throw exception(RECEIVABLE_NOT_NULL);
...@@ -118,8 +118,7 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO ...@@ -118,8 +118,7 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
//当自编号为空(某些预付款未装柜的订单),则校验为同一客户同意目的国,忽略自编号规则,视为同一自编号 //当自编号为空(某些预付款未装柜的订单),则校验为同一客户同意目的国,忽略自编号规则,视为同一自编号
validateSameCustomerReceivable(createReqVO.getReceivableVOList()); validateSameCustomerReceivable(createReqVO.getReceivableVOList());
List<ReceiptAccountCreateReqVO> receiptAccountCreateReqVOList = List<ReceiptAccountCreateReqVO> receiptAccountCreateReqVOList = createReqVO.getReceiptAccountList();
createReqVO.getReceiptAccountList();
if (CollectionUtil.isEmpty(receiptAccountCreateReqVOList)) { if (CollectionUtil.isEmpty(receiptAccountCreateReqVOList)) {
throw exception(RECEIPT_ACCOUNT_NOT_EXISTS); throw exception(RECEIPT_ACCOUNT_NOT_EXISTS);
...@@ -178,29 +177,25 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO ...@@ -178,29 +177,25 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
receiptMapper.updateById(update); receiptMapper.updateById(update);
} }
List<ReceivableDO> receivableDOList = List<ReceivableDO> receivableDOList = receivableUpdateReqVOList.stream().filter(re -> null != re.getId()).map(re -> {
receivableUpdateReqVOList.stream(). ReceivableDO receivableDO = ReceivableConvert.INSTANCE.convert(re);
filter(re -> null != re.getId()).map(re -> { receivableDO.setReceiptNo(receipt.getReceiptNo());
ReceivableDO receivableDO = receivableDO.setReceiptId(receipt.getId());
ReceivableConvert.INSTANCE.convert(re); receivableDO.setState(1);
receivableDO.setReceiptNo(receipt.getReceiptNo()); receivableDO.setUpdater(creator);
receivableDO.setReceiptId(receipt.getId()); receivableDO.setUpdateTime(new Date());
receivableDO.setState(1); return receivableDO;
receivableDO.setUpdater(creator); }).collect(Collectors.toList());
receivableDO.setUpdateTime(new Date());
return receivableDO;
}).collect(Collectors.toList());
receivableService.updateBatchById(receivableDOList); receivableService.updateBatchById(receivableDOList);
List<ReceiptAccountDO> receiptAccountDOList = List<ReceiptAccountDO> receiptAccountDOList = receiptAccountCreateReqVOList.stream().map(re -> {
receiptAccountCreateReqVOList.stream().map(re -> { ReceiptAccountDO receivableDO = ReceiptAccountConvert.INSTANCE.convert(re);
ReceiptAccountDO receivableDO = ReceiptAccountConvert.INSTANCE.convert(re); receivableDO.setReceiptId(receipt.getId());
receivableDO.setReceiptId(receipt.getId()); receivableDO.setUpdater(creator);
receivableDO.setUpdater(creator); receivableDO.setUpdateTime(new Date());
receivableDO.setUpdateTime(new Date()); return receivableDO;
return receivableDO; }).collect(Collectors.toList());
}).collect(Collectors.toList());
receiptAccountService.saveBatch(receiptAccountDOList); receiptAccountService.saveBatch(receiptAccountDOList);
// 返回 // 返回
...@@ -438,37 +433,29 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO ...@@ -438,37 +433,29 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
} }
@Override @Override
public PageResult<ReceiptBackVO> getReceiptPage(ReceiptQueryVO query, public PageResult<ReceiptBackVO> getReceiptPage(ReceiptQueryVO query, PageVO page) {
PageVO page) {
page.setField("er.id"); page.setField("er.id");
IPage<ReceiptBackVO> mpPage = MyBatisUtils.buildPage(page); IPage<ReceiptBackVO> mpPage = MyBatisUtils.buildPage(page);
receiptMapper.getReceiptBackPage(mpPage, query); receiptMapper.getReceiptBackPage(mpPage, query);
//添加明细状态计算列表 //添加明细状态计算列表
//MxStatus //MxStatus
//获取List指定字段的List //获取List指定字段的List
List<Long> idList = mpPage.getRecords().stream() List<Long> idList = mpPage.getRecords().stream().map(ReceiptBackVO::getId).collect(Collectors.toList());
.map(ReceiptBackVO::getId)
.collect(Collectors.toList());
//一定要判空,不然会报错 //一定要判空,不然会报错
if(CollectionUtil.isNotEmpty(idList)) { if (CollectionUtil.isNotEmpty(idList)) {
//根据List获取本页中所有的明细信息 //根据List获取本页中所有的明细信息
LambdaQueryWrapper<ReceiptItemDO> lambdaQueryWrapper = LambdaQueryWrapper<ReceiptItemDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
new LambdaQueryWrapper<>();
lambdaQueryWrapper.in(ReceiptItemDO::getReceiptId, idList); lambdaQueryWrapper.in(ReceiptItemDO::getReceiptId, idList);
//所有收款单的明细 //所有收款单的明细
List<ReceiptItemDO> listItem = List<ReceiptItemDO> listItem = receiptItemMapper.selectList(lambdaQueryWrapper);
receiptItemMapper.selectList(lambdaQueryWrapper);
LambdaQueryWrapper<ReceiptAccountDO> lambdaQueryWrapper2 = LambdaQueryWrapper<ReceiptAccountDO> lambdaQueryWrapper2 = new LambdaQueryWrapper<>();
new LambdaQueryWrapper<>();
lambdaQueryWrapper2.in(ReceiptAccountDO::getReceiptId, idList); lambdaQueryWrapper2.in(ReceiptAccountDO::getReceiptId, idList);
List<ReceiptAccountDO> ReceiptAccountList = List<ReceiptAccountDO> ReceiptAccountList = receiptAccountMapper.selectList(lambdaQueryWrapper2);
receiptAccountMapper.selectList(lambdaQueryWrapper2);
Map<Integer, CurrencyRespDTO> currencyMap = currencyApi.getAllCurrency(); Map<Integer, CurrencyRespDTO> currencyMap = currencyApi.getAllCurrency();
for (ReceiptBackVO r : mpPage.getRecords() for (ReceiptBackVO r : mpPage.getRecords()) {
) {
String sR = getReceiptMxStatus(listItem, r.getId()); String sR = getReceiptMxStatus(listItem, r.getId());
r.setMxStatus(sR); r.setMxStatus(sR);
...@@ -480,16 +467,14 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO ...@@ -480,16 +467,14 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
r.setSsShow(s2); r.setSsShow(s2);
//核销比例 //核销比例
r.setHxBiLi(getHxBili(ReceiptAccountList, r.setHxBiLi(getHxBili(ReceiptAccountList, listItem, r.getId()));
listItem, r.getId()));
} }
} }
return PageResult.of(mpPage); return PageResult.of(mpPage);
} }
private String getPercentage(BigDecimal part, BigDecimal total) { private String getPercentage(BigDecimal part, BigDecimal total) {
BigDecimal percentage = part.divide(total, 5, BigDecimal percentage = part.divide(total, 5, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"));
BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"));
// 输出百分比 // 输出百分比
String sR = format(percentage) + "%"; String sR = format(percentage) + "%";
return sR; return sR;
...@@ -505,24 +490,18 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO ...@@ -505,24 +490,18 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
/* /*
获取核销比例 获取核销比例
*/ */
private String getHxBili(List<ReceiptAccountDO> ReceiptAccountList, private String getHxBili(List<ReceiptAccountDO> ReceiptAccountList, List<ReceiptItemDO> listItemList, long ReceiptId) {
List<ReceiptItemDO> listItemList,
long ReceiptId) {
String sR = "0"; String sR = "0";
if (CollectionUtil.isEmpty(ReceiptAccountList)) if (CollectionUtil.isEmpty(ReceiptAccountList)) return sR;
return sR;
if (CollectionUtil.isEmpty(listItemList)) { if (CollectionUtil.isEmpty(listItemList)) {
return sR; return sR;
} }
List<ReceiptAccountDO> ReceiptAccountList1 = List<ReceiptAccountDO> ReceiptAccountList1 = ReceiptAccountList.stream().filter(i -> i.getReceiptId() == ReceiptId).collect(Collectors.toList());
ReceiptAccountList.stream().filter(i -> i.getReceiptId() == ReceiptId).
collect(Collectors.toList());
if (CollectionUtil.isEmpty(ReceiptAccountList1)) return sR; if (CollectionUtil.isEmpty(ReceiptAccountList1)) return sR;
BigDecimal bTotal = new BigDecimal(0); BigDecimal bTotal = new BigDecimal(0);
BigDecimal bPart = new BigDecimal(0); BigDecimal bPart = new BigDecimal(0);
for (ReceiptAccountDO do1 : ReceiptAccountList1 for (ReceiptAccountDO do1 : ReceiptAccountList1) {
) {
bTotal = bTotal.add(do1.getWriteOffAmount()); bTotal = bTotal.add(do1.getWriteOffAmount());
} }
...@@ -532,16 +511,13 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO ...@@ -532,16 +511,13 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
} }
//已核销状态记录 //已核销状态记录
List<ReceiptItemDO> list = List<ReceiptItemDO> list = listItemList.stream().filter(i -> i.getReceiptId() == ReceiptId && i.getStatus() != 0).collect(Collectors.toList());
listItemList.stream().filter(i -> i.getReceiptId() == ReceiptId
&& i.getStatus() != 0).collect(Collectors.toList());
if (CollectionUtil.isEmpty(list)) { if (CollectionUtil.isEmpty(list)) {
//核销金额为0 核销比例为空 //核销金额为0 核销比例为空
return sR; return sR;
} }
for (ReceiptItemDO do2 : list for (ReceiptItemDO do2 : list) {
) {
bPart = bPart.add(do2.getWriteOffAmount()); bPart = bPart.add(do2.getWriteOffAmount());
} }
//计算百分比 //计算百分比
...@@ -552,22 +528,16 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO ...@@ -552,22 +528,16 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
/* /*
应收款 应收款
*/ */
private String getYSShow(List<ReceiptAccountDO> ReceiptAccountList, private String getYSShow(List<ReceiptAccountDO> ReceiptAccountList, long ReceiptId, Map<Integer, CurrencyRespDTO> currencyMap) {
long ReceiptId,
Map<Integer, CurrencyRespDTO> currencyMap) {
String sR = ""; String sR = "";
if (CollectionUtil.isEmpty(ReceiptAccountList)) { if (CollectionUtil.isEmpty(ReceiptAccountList)) {
return sR; return sR;
} }
List<ReceiptAccountDO> ReceiptAccountList1 = List<ReceiptAccountDO> ReceiptAccountList1 = ReceiptAccountList.stream().filter(i -> i.getReceiptId() == ReceiptId).collect(Collectors.toList());
ReceiptAccountList.stream().filter(i -> i.getReceiptId() == ReceiptId). if (CollectionUtil.isEmpty(ReceiptAccountList1)) return sR;
collect(Collectors.toList());
if (CollectionUtil.isEmpty(ReceiptAccountList1))
return sR;
for (ReceiptAccountDO do1 : ReceiptAccountList1 for (ReceiptAccountDO do1 : ReceiptAccountList1) {
) {
BigDecimal b1 = do1.getReceivableAmount(); BigDecimal b1 = do1.getReceivableAmount();
String s1 = b1.toString(); String s1 = b1.toString();
String s2 = ""; String s2 = "";
...@@ -585,24 +555,17 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO ...@@ -585,24 +555,17 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
实收金额 实收金额
*/ */
private String getSSShow(List<ReceiptItemDO> listItemList, private String getSSShow(List<ReceiptItemDO> listItemList, long ReceiptId, Map<Integer, CurrencyRespDTO> currencyMap) {
long ReceiptId,
Map<Integer, CurrencyRespDTO> currencyMap) {
String sR = ""; String sR = "";
if (CollectionUtil.isEmpty(listItemList)) { if (CollectionUtil.isEmpty(listItemList)) {
return sR; return sR;
} }
List<ReceiptItemDO> list = List<ReceiptItemDO> list = listItemList.stream().filter(i -> i.getReceiptId() == ReceiptId).collect(Collectors.toList());
listItemList.stream().filter(i -> i.getReceiptId() == ReceiptId).
collect(Collectors.toList());
if (CollectionUtil.isEmpty(list)) return sR; if (CollectionUtil.isEmpty(list)) return sR;
//根据币种分组求和 //根据币种分组求和
Map<Long, BigDecimal> dataMap = Map<Long, BigDecimal> dataMap = list.stream().filter(t -> t.getCurrencyId() != null).collect(Collectors.groupingBy(ReceiptItemDO::getCurrencyId, CollectorsUtil.summingBigDecimal(ReceiptItemDO::getAmount)));
list.stream().filter(t -> t.getCurrencyId() != null)
.collect(Collectors.groupingBy(ReceiptItemDO::getCurrencyId,
CollectorsUtil.summingBigDecimal(ReceiptItemDO::getAmount)));
//遍历币种信息 //遍历币种信息
for (Map.Entry<Long, BigDecimal> entry : dataMap.entrySet()) { for (Map.Entry<Long, BigDecimal> entry : dataMap.entrySet()) {
String key = entry.getKey().toString(); String key = entry.getKey().toString();
...@@ -633,8 +596,7 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO ...@@ -633,8 +596,7 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
//全部审核 收款明细全部已审批 OK //全部审核 收款明细全部已审批 OK
String sMxStatus = ""; String sMxStatus = "";
//计算明细总数 //计算明细总数
Long iCount = listItem.stream().filter(i -> i.getReceiptId() == ReceiptId). Long iCount = listItem.stream().filter(i -> i.getReceiptId() == ReceiptId).collect(Collectors.counting());
collect(Collectors.counting());
if (iCount == 0) { if (iCount == 0) {
sMxStatus = "未录入"; sMxStatus = "未录入";
return sMxStatus; return sMxStatus;
...@@ -645,18 +607,10 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO ...@@ -645,18 +607,10 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
//bmpStatus //bmpStatus
//PROCESS(1, "处理中"),APPROVE(2, "通过"), //PROCESS(1, "处理中"),APPROVE(2, "通过"),
//REJECT(3, "不通过"),CANCEL(4, "已取消"); //REJECT(3, "不通过"),CANCEL(4, "已取消");
long Item0 = listItem.stream().filter(i -> i.getStatus() == 0). long Item0 = listItem.stream().filter(i -> i.getStatus() == 0).filter(i -> i.getReceiptId() == ReceiptId).collect(Collectors.counting());
filter(i -> i.getReceiptId() == ReceiptId). long Item1 = listItem.stream().filter(i -> i.getStatus() == 1).filter(i -> i.getReceiptId() == ReceiptId).collect(Collectors.counting());
collect(Collectors.counting()); long Item2 = listItem.stream().filter(i -> i.getStatus() == 2).filter(i -> i.getReceiptId() == ReceiptId).collect(Collectors.counting());
long Item1 = listItem.stream().filter(i -> i.getStatus() == 1). long Item3 = listItem.stream().filter(i -> i.getStatus() == 3).filter(i -> i.getReceiptId() == ReceiptId).collect(Collectors.counting());
filter(i -> i.getReceiptId() == ReceiptId).
collect(Collectors.counting());
long Item2 = listItem.stream().filter(i -> i.getStatus() == 2).
filter(i -> i.getReceiptId() == ReceiptId).
collect(Collectors.counting());
long Item3 = listItem.stream().filter(i -> i.getStatus() == 3).
filter(i -> i.getReceiptId() == ReceiptId).
collect(Collectors.counting());
if (Item0 == iCount) { if (Item0 == iCount) {
//0待核销 //0待核销
...@@ -684,9 +638,7 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO ...@@ -684,9 +638,7 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
return sMxStatus; return sMxStatus;
} }
if ((Item2 + Item3) == iCount || if ((Item2 + Item3) == iCount || (Item1 + Item3) == iCount || (Item2 + Item1) == iCount) {
(Item1 + Item3) == iCount ||
(Item2 + Item1) == iCount) {
sMxStatus = "部分审核"; sMxStatus = "部分审核";
return sMxStatus; return sMxStatus;
} }
...@@ -764,8 +716,7 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO ...@@ -764,8 +716,7 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
@Override @Override
public void createFinanceReceiptWriteOff(FinanceReceiptVo financeReceiptVo) { public void createFinanceReceiptWriteOff(FinanceReceiptVo financeReceiptVo) {
ReceiptDO receiptDO = ReceiptDO receiptDO = validateReceiptBmpStatus(financeReceiptVo.getReceiptId());
validateReceiptBmpStatus(financeReceiptVo.getReceiptId());
//判断收款单下的收款明细是不是全部核销完成 //判断收款单下的收款明细是不是全部核销完成
LambdaQueryWrapper<ReceiptItemDO> lambdaQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<ReceiptItemDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(ReceiptItemDO::getReceiptId, financeReceiptVo.getReceiptId()); lambdaQueryWrapper.eq(ReceiptItemDO::getReceiptId, financeReceiptVo.getReceiptId());
...@@ -775,19 +726,15 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO ...@@ -775,19 +726,15 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
throw exception(RECEIPT_ITEM_WRITE_OFF_ING); throw exception(RECEIPT_ITEM_WRITE_OFF_ING);
} }
LambdaQueryWrapper<ReceiptItemDO> lambdaQueryWrapper1 = LambdaQueryWrapper<ReceiptItemDO> lambdaQueryWrapper1 = new LambdaQueryWrapper<>();
new LambdaQueryWrapper<>(); lambdaQueryWrapper1.eq(ReceiptItemDO::getReceiptId, financeReceiptVo.getReceiptId());
lambdaQueryWrapper1.eq(ReceiptItemDO::getReceiptId,
financeReceiptVo.getReceiptId());
lambdaQueryWrapper1.eq(ReceiptItemDO::getStatus, 1); lambdaQueryWrapper1.eq(ReceiptItemDO::getStatus, 1);
List<ReceiptItemDO> receiptItemDOList = List<ReceiptItemDO> receiptItemDOList = receiptItemMapper.selectList(lambdaQueryWrapper1);
receiptItemMapper.selectList(lambdaQueryWrapper1);
if (null == receiptItemDOList || receiptItemDOList.size() == 0) { if (null == receiptItemDOList || receiptItemDOList.size() == 0) {
throw exception(RECEIPT_NOT_WRITE_OFF_ITEM_NOT_EXISTS); throw exception(RECEIPT_NOT_WRITE_OFF_ITEM_NOT_EXISTS);
} }
BigDecimal totalAmount = BigDecimal totalAmount = receiptItemDOList.stream().map(ReceiptItemDO::getWriteOffAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
receiptItemDOList.stream().map(ReceiptItemDO::getWriteOffAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
/* if (receiptDO.getState() != 2 && receiptDO.getState() != 3) { /* if (receiptDO.getState() != 2 && receiptDO.getState() != 3) {
...@@ -826,11 +773,7 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO ...@@ -826,11 +773,7 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
approvalDO.setReason(financeReceiptVo.getRemark()); approvalDO.setReason(financeReceiptVo.getRemark());
receiptApprovalService.save(approvalDO); receiptApprovalService.save(approvalDO);
Long userId = SecurityFrameworkUtils.getLoginUserId(); Long userId = SecurityFrameworkUtils.getLoginUserId();
String bpmId = bpmCreateServiceFactory.createBmp(userId, String bpmId = bpmCreateServiceFactory.createBmp(userId, approvalDO.getId(), WorkFlowEmus.FINANCE_RECEIPT_WRITE_OFF.getKey(), financeReceiptVo.getReceiptNo(), financeReceiptVo.getCopyUserList());
approvalDO.getId(),
WorkFlowEmus.FINANCE_RECEIPT_WRITE_OFF.getKey(),
financeReceiptVo.getReceiptNo(),
financeReceiptVo.getCopyUserList());
approvalDO.setBmpId(bpmId); approvalDO.setBmpId(bpmId);
receiptApprovalService.updateById(approvalDO); receiptApprovalService.updateById(approvalDO);
...@@ -839,9 +782,7 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO ...@@ -839,9 +782,7 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
update.setId(financeReceiptVo.getReceiptId()); update.setId(financeReceiptVo.getReceiptId());
update.setBmpStatus(BpmProcessInstanceResultEnum.PROCESS.getResult()); update.setBmpStatus(BpmProcessInstanceResultEnum.PROCESS.getResult());
//计算出核销比例 //计算出核销比例
BigDecimal proportion = BigDecimal proportion = totalAmount.divide(receiptDO.getReceivableTotalAmount(), 8, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(6, BigDecimal.ROUND_HALF_UP);
totalAmount.divide(receiptDO.getReceivableTotalAmount(),
8, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(6, BigDecimal.ROUND_HALF_UP);
update.setWriteOffProportion(proportion); update.setWriteOffProportion(proportion);
update.setState(ReceiptStatusEnum.WRITE_OFF_ALL_ING.getValue()); update.setState(ReceiptStatusEnum.WRITE_OFF_ALL_ING.getValue());
update.setBmpId(bpmId); update.setBmpId(bpmId);
...@@ -926,8 +867,7 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO ...@@ -926,8 +867,7 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
throw exception(BMP_NOT); throw exception(BMP_NOT);
} }
if (receiptDO.getBmpStatus() != if (receiptDO.getBmpStatus() != BpmProcessInstanceResultEnum.PROCESS.getResult()) {
BpmProcessInstanceResultEnum.PROCESS.getResult()) {
throw exception(BMP_CANCEL); throw exception(BMP_CANCEL);
} }
...@@ -938,4 +878,80 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO ...@@ -938,4 +878,80 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
public ReceiptExportDto getReceiptExportByOrderId(Long orderId) { public ReceiptExportDto getReceiptExportByOrderId(Long orderId) {
return receiptMapper.getReceiptExportByOrderId(orderId); return receiptMapper.getReceiptExportByOrderId(orderId);
} }
@Override
public Boolean judgingProportion(ReceiptDO receiptDO, String proportion) {
//判断收款单下的收款明细是不是全部核销
LambdaQueryWrapper<ReceiptItemDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(ReceiptItemDO::getReceiptId, receiptDO.getId());
lambdaQueryWrapper.in(ReceiptItemDO::getStatus, 0, 2, 3);
Long count = receiptItemMapper.selectCount(lambdaQueryWrapper);
if (count != 0) {
return Boolean.FALSE;
}
LambdaQueryWrapper<ReceiptItemDO> lambdaQueryWrapper1 = new LambdaQueryWrapper<>();
lambdaQueryWrapper1.eq(ReceiptItemDO::getReceiptId, receiptDO.getId());
lambdaQueryWrapper1.eq(ReceiptItemDO::getStatus, 1);
List<ReceiptItemDO> receiptItemDOList = receiptItemMapper.selectList(lambdaQueryWrapper1);
if (null == receiptItemDOList || receiptItemDOList.size() == 0) {
return Boolean.FALSE;
}
BigDecimal totalAmount = receiptItemDOList.stream().map(ReceiptItemDO::getWriteOffAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
Long currencyId = receiptDO.getCurrencyId();
if (null == currencyId) {
log.error("自动核销判断核销币种为空");
return Boolean.FALSE;
}
//计算出实际收款比例
BigDecimal sjbl = NumberUtil.div(totalAmount, receiptDO.getReceivableTotalAmount()).multiply(new BigDecimal("100"));
//实际收款比例大于规定阀值时,反回可以自己动核销
if (sjbl.compareTo(new BigDecimal(proportion)) >= 0) {
return Boolean.TRUE;
}
return Boolean.FALSE;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void autoWriteOffReceipt(ReceiptDO receiptDO, String userId, String userName) {
ReceiptDO updateReceipt = new ReceiptDO();
// 添加订单ID的修改,不然订单ID就丢失了
updateReceipt.setOrderId(receiptDO.getOrderId());
updateReceipt.setId(receiptDO.getId());
//需要根据是否要开票变成已核销,还是已核销待开票
if (receiptDO.getOpenInvoice() == 0) {
updateReceipt.setState(ReceiptStatusEnum.WRITE_OFF_ALL_SUCCESS.getValue());
}
if (receiptDO.getOpenInvoice() == 1) {
updateReceipt.setState(ReceiptStatusEnum.WRITE_OFF_ALL_OPENING.getValue());
}
updateReceipt.setWriteOffAt(new Date());
updateReceipt.setWriteOffProportion(new BigDecimal("100"));//设置核销比例
updateReceipt.setRemark("自动核销,核销比例>=100%");
updateReceipt.setWriteOffId(Long.parseLong(userId));
updateReceipt.setWriteOffName(userName);
receiptMapper.updateById(updateReceipt);
//更新收该收款单下的应收为收款完成状态
LambdaUpdateWrapper<ReceivableDO> lambdaUpdateWrapper = new LambdaUpdateWrapper();
lambdaUpdateWrapper.eq(ReceivableDO::getReceiptId, receiptDO.getId());
lambdaUpdateWrapper.set(ReceivableDO::getState, 2);
receivableService.update(lambdaUpdateWrapper);
//添加订单核销日志
LambdaQueryWrapper<ReceivableDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(ReceivableDO::getReceiptId, receiptDO.getId());
List<ReceivableDO> orderList = receivableService.list(lambdaQueryWrapper);
List orderIds = orderList.stream().map(ReceivableDO::getOrderId).distinct().collect(Collectors.toList());
receivableService.orderReceivableWriteOffLogAdd(orderIds, receiptDO.getReceiptNo());
}
} }
package cn.iocoder.yudao.module.wealth.controller.admin.job;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
import cn.iocoder.yudao.framework.tenant.core.job.TenantJob;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import cn.iocoder.yudao.module.wealth.dal.dataobject.receipt.ReceiptDO;
import cn.iocoder.yudao.module.wealth.enums.ReceiptStatusEnum;
import cn.iocoder.yudao.module.wealth.service.receipt.ReceiptService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
/**
* 收款单自动核销任务
*/
@Component
@TenantJob
@Slf4j
public class ReceiptAutoWriteOff implements JobHandler {
@Resource
ReceiptService receiptService;
@Resource
AdminUserApi adminUserApi;
@Override
public String execute(String param) throws Exception {
if (StrUtil.isBlank(param)) {
log.error("自动核销比例未配置,自动退出");
return "";
}
String[] paramArray = param.split(",");
if (paramArray.length != 2 || StrUtil.isBlank(paramArray[0]) || StrUtil.isBlank(paramArray[1])) {
log.error("自动核销比例JOB参数错误,自动退出");
return "";
}
AdminUserRespDTO adminUserRespDTO = adminUserApi.getUser(Long.parseLong(paramArray[1]));
if (null == adminUserRespDTO) {
log.error("自动核销比例JOB参数错误,核销人配置错误,自动退出");
return "";
}
//查询所有收款单状态为待核销的
LambdaQueryWrapper<ReceiptDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.and(i -> i.eq(ReceiptDO::getState, ReceiptStatusEnum.WRITE_OFF_WAITING.getValue()).or().eq(ReceiptDO::getState, ReceiptStatusEnum.WRITE_OFF_PART_ING.getValue()));
List<ReceiptDO> receiptDOList = receiptService.selectList(lambdaQueryWrapper);
for (ReceiptDO receiptDO : receiptDOList) {
try {
//判断当前收款单下的收款明细是不是全部是已核销并且核销比例要大于配置(params)
Boolean result = receiptService.judgingProportion(receiptDO, paramArray[0]);
if (result) {
receiptService.autoWriteOffReceipt(receiptDO, paramArray[1], adminUserRespDTO.getNickname());
}
} catch (Exception e) {
log.error("收款单{}自动核销出错原因:{}", receiptDO.getReceiptNo(), e.getMessage());
}
}
return "";
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment