Commit b9207235 authored by zhangfeng's avatar zhangfeng

feat(wealth): 优化

parent 1bc2ebd1
......@@ -141,7 +141,7 @@ ALTER TABLE `ecw_receivable` ADD COLUMN `dest_country_rate` decimal(10, 6) NULL
ALTER TABLE `ecw_receivable` ADD COLUMN `dest_country_sub_rate` decimal(10, 6) NULL DEFAULT NULL COMMENT '额外费用副币种汇率(用于报表,跟费用类型相关)' AFTER `dest_country_rate`;
ALTER TABLE `ecw_receivable` ADD INDEX `key_receipt_id`(`deleted` ASC, `receipt_id` ASC) USING BTREE;
ALTER TABLE `ecw_receivable` MODIFY COLUMN `discount_total` decimal(15, 2) NULL DEFAULT 0.00 COMMENT '优惠金额' AFTER `total_amount`;
CREATE TABLE `ecw_receivable_write_off_record` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
......@@ -167,6 +167,6 @@ SET FOREIGN_KEY_CHECKS=0;
ALTER TABLE `ecw_receivable` MODIFY COLUMN `base_amount` decimal(10, 2) NULL DEFAULT NULL COMMENT '基准金额' AFTER `remark`;
ALTER TABLE `ecw_receivable` MODIFY COLUMN `write_off_amount` decimal(15, 2) NOT NULL DEFAULT 0.00 COMMENT '基准核销金额' AFTER `base_currency_id`;
ALTER TABLE `ecw_receivable` MODIFY COLUMN `write_off_amount` decimal(15, 2) NOT NULL DEFAULT 0.00 COMMENT '核销本币金额' AFTER `base_currency_id`;
SET FOREIGN_KEY_CHECKS=1;
\ No newline at end of file
......@@ -28,6 +28,16 @@ UPDATE ecw_receipt_item
SET approval_time = update_time
WHERE approval_time IS NULL AND `status` = 1;
# 刷新银行明细核销币种
UPDATE ecw_receipt_item eri SET eri.write_off_currency_id = (
SELECT er.base_currency_id
FROM ecw_receivable er
WHERE er.receipt_id = eri.receipt_id
AND er.deleted = 0
AND er.base_currency_id IS NOT NULL
LIMIT 1
) WHERE eri.deleted = 0 AND eri.write_off_currency_id IS NULL;
# 刷新银行明细汇率,银行收款明细-币种≠应收所在自编号对应的核算币种,但是跟收款单-应收费用的币种相同
UPDATE ecw_receipt_item eri
SET eri.rate = (
......@@ -37,6 +47,7 @@ SET eri.rate = (
AND era.currency_id = eri.currency_id
AND era.deleted = 0
AND era.write_off_rate IS NOT NULL
LIMIT 1
)
WHERE eri.`status` = 1
AND eri.deleted = 0
......@@ -87,11 +98,11 @@ SET eri.rate = IFNULL((
FROM ecw_exchange_rate eer
WHERE eer.source_currency_id = eri.currency_id
AND eer.target_currency_id = eri.write_off_currency_id
),1);
# 刷新银行明细审核核销币种
UPDATE ecw_receipt_item SET write_off_currency_id = 1 WHERE write_off_currency_id IS NULL;
),1)
WHERE eri.`status` = 1
AND eri.deleted = 0;
# 更新收款单生成路径
UPDATE ecw_receipt SET generate_path = 0 WHERE generate_path IS NULL;
# 刷新应收款优惠金额
......@@ -105,9 +116,23 @@ UPDATE ecw_receivable er
SET er.exchange_rate = 1 WHERE er.exchange_rate IS NULL AND er.receipt_id IS NOT NULL AND er.currency_id = er.base_currency_id AND er.deleted = 0;
# 应收明细基准币种是美元
UPDATE ecw_receivable er
SET er.exchange_rate = ( SELECT era.write_off_rate FROM ecw_receipt_account era WHERE era.receipt_id = er.receipt_id AND era.currency_id = er.currency_id AND era.deleted = 0)
SET er.exchange_rate = (
SELECT
era.write_off_rate
FROM
ecw_receipt_account era
WHERE
era.receipt_id = er.receipt_id
AND era.currency_id = er.currency_id
AND era.deleted = 0
AND era.write_off_rate IS NOT NULL
LIMIT 1
)
WHERE
er.receipt_id IS NOT NULL AND er.base_currency_id = 1 AND er.deleted = 0;
er.receipt_id IS NOT NULL
AND er.base_currency_id = 1
AND er.currency_id != 1
AND er.deleted = 0;
# 应收明细基准币种不是美元
UPDATE ecw_receivable er
SET er.exchange_rate = (SELECT eer.currency_rate FROM ecw_exchange_rate eer WHERE eer.source_currency_id = er.currency_id AND eer.target_currency_id = er.base_currency_id )
......@@ -126,6 +151,7 @@ UPDATE `ecw_receipt` SET `state` = 4 WHERE `state` = 5;
UPDATE ecw_receipt_item eri SET eri.account_id = (SELECT eba.id FROM ecw_bank_account eba WHERE eba.ba_account_name = eri.account_name AND eba.ba_bank_name = eri.account_bank_name AND eba.ba_account_num = eri.account_no AND eba.deleted = 0) WHERE eri.deleted = 0;
# 刷新收款明细-应收明细-收入归属
UPDATE ecw_receivable_write_off_record erwor SET erwor.income_belong =
(SELECT eba.ba_income_belong FROM ecw_receipt_item eri LEFT JOIN ecw_bank_account eba ON eri.account_id = eba.id WHERE erwor.receipt_item_id = eri.id);
\ No newline at end of file
# 刷新收款明细-应收明细-收入归属(银行帐号设置收入归属之后执行)
UPDATE ecw_receivable_write_off_record erwor
SET erwor.income_belong = (SELECT eba.ba_income_belong FROM ecw_receipt_item eri LEFT JOIN ecw_bank_account eba ON eri.account_id = eba.id WHERE erwor.receipt_item_id = eri.id)
WHERE erwor.income_belong IS NULL;
\ No newline at end of file
......@@ -22,6 +22,8 @@ public interface AdminUserApi {
*/
AdminUserRespDTO getUser(Long id);
AdminUserRespDTO getUser(String name);
/**
* 获得指定部门的用户数组
*
......
......@@ -34,6 +34,15 @@ public class AdminUserApiImpl implements AdminUserApi {
return UserConvert.INSTANCE.convert4(user);
}
@Override
public AdminUserRespDTO getUser(String name) {
List<AdminUserDO> usersByUsername = userService.getUsersByUsername(name);
if (usersByUsername != null && !usersByUsername.isEmpty()){
return UserConvert.INSTANCE.convert4(usersByUsername.get(0));
}
return null;
}
@Override
public List<AdminUserRespDTO> getUsersByDeptIds(Collection<Long> deptIds) {
List<AdminUserDO> users = userService.getUsersByDeptIds(deptIds);
......
......@@ -94,4 +94,6 @@ public interface ReceiptMapper extends AbstractMapper<ReceiptDO> {
void updateReceiptNewFieldBatch(List<ReceiptDO> receiptDOS);
Date getReceiptItemPayat(Long id);
List<Long> selectWriteOffIdList();
}
package cn.iocoder.yudao.module.wealth.job;
import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
import cn.iocoder.yudao.module.ecw.api.bank.BankApi;
import cn.iocoder.yudao.module.ecw.api.bank.dto.BankAccountDTO;
import cn.iocoder.yudao.module.wealth.dal.dataobject.receiptItem.ReceiptItemDO;
import cn.iocoder.yudao.module.wealth.dal.dataobject.receivable.ReceivableDO;
import cn.iocoder.yudao.module.wealth.dal.dataobject.receivable.ReceivableWriteOffRecordDO;
import cn.iocoder.yudao.module.wealth.dal.mysql.receipt.ReceiptMapper;
import cn.iocoder.yudao.module.wealth.dal.mysql.receiptItem.ReceiptItemMapper;
import cn.iocoder.yudao.module.wealth.dal.mysql.receivable.ReceivableMapper;
import cn.iocoder.yudao.module.wealth.dal.mysql.receivable.ReceivableWriteOffRecordMapper;
import cn.iocoder.yudao.module.wealth.enums.ReceiptItemStatusEnum;
import cn.iocoder.yudao.module.wealth.vo.receivable.ReceivableWriteOffReqVO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.stream.Collectors;
@Component
@Slf4j
public class UpdateReceiptItemRelationTask implements JobHandler {
@Resource
private ReceiptItemMapper receiptItemMapper;
@Resource
private ReceivableMapper receivableMapper;
@Resource
private BankApi bankApi;
@Resource
private ReceiptMapper receiptMapper;
@Resource
private ReceivableWriteOffRecordMapper receivableWriteOffRecordMapper;
/**
* 更新应收明细关联应收款
*
* @param param 参数
*/
@Override
public String execute(String param) throws Exception {
log.info("更新应收明细关联应收款");
long l = System.currentTimeMillis();
List<Long> idList = receiptMapper.selectWriteOffIdList();
LambdaQueryWrapper<ReceiptItemDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(StringUtils.isNotBlank(param), ReceiptItemDO::getReceiptId, Long.parseLong(param));
lambdaQueryWrapper.in(StringUtils.isBlank(param), ReceiptItemDO::getId, idList);
lambdaQueryWrapper.select(ReceiptItemDO::getReceiptId, ReceiptItemDO::getStatus, ReceiptItemDO::getId, ReceiptItemDO::getAccountId, ReceiptItemDO::getWriteOffAmount, ReceiptItemDO::getWriteOffCurrencyId, ReceiptItemDO::getCurrencyId);
List<ReceiptItemDO> listItem = receiptItemMapper.selectList(lambdaQueryWrapper);
// 按收款单分组
Map<Long, List<ReceiptItemDO>> collectByReceiptId = listItem.stream().collect(Collectors.groupingBy(ReceiptItemDO::getReceiptId));
List<ReceivableDO> receivableDOS = receivableMapper.selectList(Wrappers.lambdaQuery(ReceivableDO.class)
.in(ReceivableDO::getReceiptId, collectByReceiptId.keySet())
.select(ReceivableDO::getId, ReceivableDO::getReceiptId, ReceivableDO::getTaxAmount, ReceivableDO::getBaseAmount, ReceivableDO::getCurrencyId, ReceivableDO::getExchangeRate, ReceivableDO::getOrderId));
for (Long receiptId : collectByReceiptId.keySet()) {
List<ReceivableDO> receivableDOList = receivableDOS.stream().filter(r -> r.getReceiptId().equals(receiptId)).sorted(Comparator.comparing(ReceivableDO::getTaxAmount)).collect(Collectors.toList());
List<ReceiptItemDO> receiptItemDOS = collectByReceiptId.get(receiptId);
for (ReceiptItemDO receiptItemDO : receiptItemDOS) {
boolean isWriteOff = Objects.equals(receiptItemDO.getStatus(), ReceiptItemStatusEnum.WRITE_OFF.getValue()) || Objects.equals(receiptItemDO.getStatus(), ReceiptItemStatusEnum.WRITE_OFF_NO_APPROVE_ING.getValue());
List<ReceivableWriteOffReqVO> receiptItemReceivableWriteOff = this.getReceiptItemReceivableWriteOff(receivableDOList, receiptItemDO.getWriteOffAmount(), isWriteOff);
for (ReceivableWriteOffReqVO receivableWriteOffReqVO : receiptItemReceivableWriteOff) {
this.createWriteOffRecord(receivableWriteOffReqVO, receiptItemDO);
}
}
receivableMapper.updateBatch(receivableDOList);
}
log.info("更新应收明细关联应收款,耗时:{}", System.currentTimeMillis() - l);
return "success";
}
private List<ReceivableWriteOffReqVO> getReceiptItemReceivableWriteOff(List<ReceivableDO> receivableDOList, BigDecimal writeOffAmount, boolean isWriteOff) {
ArrayList<ReceivableWriteOffReqVO> receivableWriteOffReqVOS = new ArrayList<>();
ReceivableDO receivableInItemVO;
boolean isLast = false;
for (int i = 0; i < receivableDOList.size(); i++) {
if (i == receivableDOList.size() - 1) {
isLast = true;
}
receivableInItemVO = receivableDOList.get(i);
BigDecimal writeOffBaseAmount = Optional.ofNullable(receivableInItemVO.getWriteOffBaseAmount()).orElse(BigDecimal.ZERO);
BigDecimal notWriteOffAmount = receivableInItemVO.getBaseAmount().subtract(writeOffBaseAmount);
if (notWriteOffAmount.compareTo(BigDecimal.ZERO) <= 0) {
continue;
}
BigDecimal currentWriteOffAmount;
if (isLast) {
currentWriteOffAmount = writeOffAmount;
} else {
currentWriteOffAmount = writeOffAmount.min(notWriteOffAmount);
}
writeOffAmount = writeOffAmount.subtract(currentWriteOffAmount);
ReceivableWriteOffReqVO writeOffReqVO = buildWriteOffReqVO(receivableInItemVO, currentWriteOffAmount);
receivableWriteOffReqVOS.add(writeOffReqVO);
if (isWriteOff) {
updateReceivableWriteOffAmount(receivableInItemVO, currentWriteOffAmount);
}
if (writeOffAmount.compareTo(BigDecimal.ZERO) <= 0) {
break;
}
}
return receivableWriteOffReqVOS;
}
private ReceivableWriteOffReqVO buildWriteOffReqVO(ReceivableDO receivableInItemVO, BigDecimal writeOffAmount) {
BigDecimal exchangeRate = receivableInItemVO.getExchangeRate();
BigDecimal receivableWriteOffAmount = writeOffAmount.divide(exchangeRate, 6, RoundingMode.HALF_UP);
return ReceivableWriteOffReqVO.builder()
.receivableId(receivableInItemVO.getId())
.writeOffAmount(writeOffAmount)
.orderId(receivableInItemVO.getOrderId())
.receivableWriteOffAmount(receivableWriteOffAmount)
.build();
}
private void updateReceivableWriteOffAmount(ReceivableDO receivableInItemVO, BigDecimal currentWriteOffAmount) {
if (receivableInItemVO.getWriteOffBaseAmount() == null) {
receivableInItemVO.setWriteOffBaseAmount(BigDecimal.ZERO);
}
BigDecimal writeOffBaseAmount = receivableInItemVO.getWriteOffBaseAmount().add(currentWriteOffAmount);
BigDecimal writeOffAmountActual = Optional.ofNullable(receivableInItemVO.getWriteOffAmount()).orElse(BigDecimal.ZERO);
BigDecimal newWriteOffAmount = writeOffAmountActual.add(currentWriteOffAmount.divide(receivableInItemVO.getExchangeRate(), 6, RoundingMode.HALF_UP));
receivableInItemVO.setWriteOffBaseAmount(writeOffBaseAmount);
receivableInItemVO.setWriteOffAmount(newWriteOffAmount);
}
private void createWriteOffRecord(ReceivableWriteOffReqVO receivableWriteOffReqVO, ReceiptItemDO receiptItem) {
BankAccountDTO account = bankApi.getBankAccountByAccountId(receiptItem.getAccountId());
Integer incomeBelong = account.getBaIncomeBelong();
ReceivableWriteOffRecordDO writeOffRecord = ReceivableWriteOffRecordDO.builder()
.receivableId(receivableWriteOffReqVO.getReceivableId())
.writeOffAmount(receivableWriteOffReqVO.getWriteOffAmount())
.receiptItemId(receiptItem.getId())
.incomeBelong(incomeBelong)
.receivableWriteOffAmount(receivableWriteOffReqVO.getReceivableWriteOffAmount())
.orderId(receivableWriteOffReqVO.getOrderId())
.build();
receivableWriteOffRecordMapper.insert(writeOffRecord);
}
}
......@@ -2,13 +2,14 @@ package cn.iocoder.yudao.module.wealth.service.receiptItem;
import cn.iocoder.yudao.framework.mybatis.core.service.IService;
import cn.iocoder.yudao.framework.mybatis.core.vo.PageVO;
import cn.iocoder.yudao.module.wealth.dal.dataobject.receiptApproval.ReceiptApprovalDO;
import cn.iocoder.yudao.module.wealth.dal.dataobject.receiptItem.ReceiptItemDO;
import cn.iocoder.yudao.module.wealth.vo.receipt.FinanceReceiptItemCancelVo;
import cn.iocoder.yudao.module.wealth.vo.receipt.FinanceReceiptItemVo;
import cn.iocoder.yudao.module.wealth.vo.receiptAccount.ReceiptItemBatchCreateReqVO;
import cn.iocoder.yudao.module.wealth.vo.receiptAccount.ReceiptItemBatchRespVO;
import cn.iocoder.yudao.module.wealth.vo.receiptItem.*;
import cn.iocoder.yudao.module.wealth.vo.receivable.ReceivableInItemVO;
import cn.iocoder.yudao.module.wealth.vo.receivable.ReceivableWriteOffReqVO;
import javax.validation.Valid;
import java.math.BigDecimal;
......
......@@ -72,4 +72,7 @@ public class ReceiptItemBaseVO {
@ApiModelProperty(value = "备注")
private String remark;
@ApiModelProperty(value = "创建人")
private String creator;
}
......@@ -28,4 +28,6 @@ public class ReceivableWriteOffReqVO {
@NotNull(message = "核销金额不能为空")
private BigDecimal writeOffAmount;
private BigDecimal receivableWriteOffAmount;
private Long orderId;
}
......@@ -22,6 +22,7 @@ import cn.iocoder.yudao.module.wealth.convert.receiptApproval.ReceiptApprovalCon
import cn.iocoder.yudao.module.wealth.dal.dataobject.receipt.ReceiptDO;
import cn.iocoder.yudao.module.wealth.dal.dataobject.receiptAccount.ReceiptAccountDO;
import cn.iocoder.yudao.module.wealth.dal.dataobject.receiptApproval.ReceiptApprovalDO;
import cn.iocoder.yudao.module.wealth.job.UpdateReceiptItemRelationTask;
import cn.iocoder.yudao.module.wealth.job.UpdateReceiptNewFieldTask;
import cn.iocoder.yudao.module.wealth.service.receipt.ReceiptService;
import cn.iocoder.yudao.module.wealth.service.receiptAccount.ReceiptAccountService;
......@@ -80,6 +81,8 @@ public class ReceiptController {
private ReceiptApprovalService receiptApprovalService;
@Resource
private UpdateReceiptNewFieldTask updateReceiptNewFieldTask;
@Resource
private UpdateReceiptItemRelationTask updateReceiptItemRelationTask;
@PostMapping("/page")
......@@ -711,4 +714,10 @@ public class ReceiptController {
public CommonResult<String> updateReceiptNewField() throws Exception {
return success(updateReceiptNewFieldTask.execute(""));
}
@GetMapping("/updateReceiptItemRelation")
@ApiOperation("更新应收明细和收款明细关联")
public CommonResult<String> UpdateReceiptItemRelation(String param) throws Exception {
return success(updateReceiptItemRelationTask.execute(param));
}
}
......@@ -154,4 +154,10 @@
AND (o.order_no = #{query.numberNo} OR o.tidan_no = #{query.numberNo} OR o.container_number = #{query.numberNo})
</if>
</sql>
<select id="selectWriteOffIdList" resultType="java.lang.Long">
SELECT id
FROM ecw_receipt
WHERE state = 4 AND deleted = 0
</select>
</mapper>
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