@@ -16,7 +16,8 @@ import com.iformall.domain.po.WxBillPayWay;
import com.iformall.domain.po.WxEnergyFees;
import com.iformall.domain.po.WxEnergyFeesSetoff;
import com.iformall.domain.po.WxFinanceReceive;
import com.iformall.domain.po.WxFinanceSetoffBill;
import com.iformall.domain.po.WxFinanceReceiveBill;
import com.iformall.domain.po.WxFinanceReceiveSetoff;
import com.iformall.domain.po.WxMerchant;
import com.iformall.domain.po.WxShop;
import com.iformall.domain.po.base.BaseEntity.SortField;
@@ -32,8 +33,9 @@ import com.iformall.enums.EnumYesOrNo;
import com.iformall.exception.MallinkException;
import com.iformall.mapper.WxBillPayWayMapper;
import com.iformall.mapper.WxEnergyFeesSetoffMapper;
import com.iformall.mapper.WxFinanceSetoff BillMapper;
import com.iformall.mapper.WxFinanceReceive BillMapper;
import com.iformall.mapper.WxFinanceReceiveMapper;
import com.iformall.mapper.WxFinanceReceiveSetoffMapper;
import com.iformall.service.WxBillAdvanceService;
import com.iformall.service.WxEnergyService;
import com.iformall.service.WxFinanceService;
@@ -71,7 +73,9 @@ public class WxFinanceServiceImpl implements WxFinanceService {
@Autowired
WxFinanceReceiveMapper wxFinanceReceiveMapper;
@Autowired
WxFinanceSetoffBillMapper wxFinanceReceiveBillMapper;
WxFinanceReceiveBillMapper wxFinanceReceiveBillMapper;
@Autowired
WxFinanceReceiveSetoffMapper wxFinanceReceiveSetoffMapper;
@Lazy
@Autowired
@@ -411,68 +415,6 @@ public class WxFinanceServiceImpl implements WxFinanceService {
return page;
}
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
@Override
public void saveOrUpdateReceive(WxFinanceReceive record, MallUserInfo user) {
Date date = new Date();
if (record.getId() == null) {
final IdWorker idWorker = IdWorker.get();
record.setId(idWorker.nextId());
record.setCreateTime(date);
record.setUpdateTime(date);
record.setCreateBy(user.getId());
record.setCreateByName(user.getName());
record.setUpdateBy(user.getId());
record.setUpdateByName(user.getName());
record.setStatus(EnumFinanceReceiveStatus.NORMAL.getCode());
try {
wxFinanceReceiveMapper.insert(record);
} catch (Exception e) {
logger.error("保存失败,e:" + e.getMessage());
throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + e.getMessage());
}
// //增加预收账单
// WxBillAdvance billAdvance = new WxBillAdvance();
// billAdvance.updateTenantInfo(user);
// billAdvance.setMerchantId(record.getMerchantId());
// WxMerchant merchant = wxMerchantService.selectById(record.getMerchantId());
// billAdvance.setRentShopType(merchant.getRentShopType());
// billAdvance.setReceivePay(record.getTotalMoney());
// billAdvance.setPay("0");
// billAdvance.setStarttime(new Date());
// billAdvance.setEndtime(new Date());
// billAdvance.setStatus(EnumBillStatus.SET_OFF.getCode());
// billAdvance.setEnergyFeesId(record.getFeesId());
// wxBillAdvanceService.saveOrUpdate(billAdvance, user);
} else {
record.setUpdateBy(user.getId());
record.setUpdateByName(user.getName());
record.setUpdateTime(date);
wxFinanceReceiveMapper.updateById(record);
}
}
@Override
public void saveOrUpdateReceiveBill(WxFinanceSetoffBill record) {
Date date = new Date();
if (record.getId() == null) {
final IdWorker idWorker = IdWorker.get();
record.setId(idWorker.nextId());
record.setCreateTime(date);
record.setUpdateTime(date);
try {
wxFinanceReceiveBillMapper.insert(record);
} catch (Exception e) {
logger.error("保存失败,e:" + e.getMessage());
throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + e.getMessage());
}
} else {
record.setUpdateTime(date);
wxFinanceReceiveBillMapper.updateById(record);
}
}
private void sortBills(List<WxBillBaseEntity> billList) {
Collections.sort(billList, new Comparator<WxBillBaseEntity>() {
@Override
@@ -500,9 +442,8 @@ public class WxFinanceServiceImpl implements WxFinanceService {
//冲抵信息根据页面返回的账单抵扣信息直接保存入库
//费用计算自动优先匹配时间最早的那个
BigDecimal b0 = new BigDecimal(0);
//单保存冲抵的时候,实收金额为0
BigDecimal receiveTotal = b0 ;
BigDecimal receiveTotal = new BigDecimal(0) ;
WxBillPayWay payWay0 = null;
if (null != record.getPayWays()) {
for (int i = 0 ; i < record.getPayWays().size() ; i ++) {
@@ -516,82 +457,166 @@ public class WxFinanceServiceImpl implements WxFinanceService {
}
}
//冲抵总金额
BigDecimal setOffTotal = b0 ;
BigDecimal setOffTotal = new BigDecimal(0) ;
List<WxBillBaseEntity> bills = record.getBills();
sortBills(bills);
//创建一个收款单,关联账单
WxFinanceReceive addreceive = new WxFinanceReceive();
addreceive.updateTenantInfo(record);
addreceive.setStatus(EnumFinanceReceiveStatus.NORMAL.getCode());
addreceive.setType(EnumFinanceReceiveType.RECEIVE.getCode());
addreceive.setReceiveMoney(receiveTotal.toPlainString());
if (receiveTotal.compareTo(b0) > 0) {
//创建一个收款单
WxFinanceReceive addreceive = generateReceive(user, EnumFinanceReceiveType.RECEIVE, receiveTotal.toPlainString(), record.getMerchantId(), null, record.getRemark());
if (receiveTotal.compareTo(new BigDecimal(0)) > 0) {
addreceive.setMoneyDetail(JSON.toJSONString(record.getPayWays()));
}
WxMerchant merchant = new WxMerchant();
merchant.updateTenantInfo(record);
boolean isAllEmpity = true;
for (int i = 0 ; i < record.getBills().size(); i++) {
WxBillBaseEntity be = record.getBills().get(i);
//计算账单收款费用,更新账单收款
if (receiveTotal.compareTo(b0) > 0) {
WxBillBaseEntity bill = wxBillAllHelper.getBillDetail(EnumBillAllType.getEnum(be.getBillType()), merchant, be.getId());
//有收款,就要更新账单的收款
//更新账单收款信息
String money = "";
BigDecimal oweDecimal = new BigDecimal(bill.getOwe());
if (oweDecimal.compareTo(receiveTotal) < 0 ) {
money = bill.getOwe();
receiveTotal = receiveTotal.subtract(oweDecimal);
}else {
money = receiveTotal.toPlainString();
receiveTotal = b0;
}
WxBillPayDTO payDto = new WxBillPayDTO();
payDto.setId(be.getId());
payDto.setBillTypeValue(be.getBillType());
payDto.setAddpay(money);
payDto.setPayWay(payWay0.getId());
payDto.setPayWayObject(payWay0);
payDto.setRemark("系统收款:收款单["+addreceive.getId()+"]"+record.getRemark());
be.setCurrentReceive(money);
//并且有抵扣
if(StringUtils.isNotBlank(be.getCurrentSetOff())) {
payDto.setSetOff(be.getCurrentSetOff());
for (int j = 0 ; j < be.getSetOffDetailList().size(); j ++ ) {
FinanceSetOffDetailVo setoffdetail = be.getSetOffDetailList().get(j);
//关联冲抵
WxFinanceSetoffBill rb = new WxFinanceSetoffBill();
rb.updateTenantInfo(record);
rb.setReceiveId(addreceive.getId());
rb.setBillId(bill.getId());
rb.setBillType(bill.getBillType());
rb.setFeesId(bill.getEnergyFeesId());
rb.setPayWay(payWay0.getId());
saveOrUpdateReceiveBill(rb);
}
}
wxBillAllHelper.updatePay(payDto, user);
}else if (StringUtils.isNotBlank(be.getCurrentSetOff())) {
setOffTotal = setOffTotal.add(new BigDecimal(be.getCurrentSetOff()));
//没收款,有冲抵,就要更新账单的冲抵,然后把对应的预充值使用金额更新,并进行关联
//每个账单要创建一个收款关联单,如果有冲抵,要额外创建
boolean noNeedCreate = createBillReceive(receiveTotal,setOffTotal,user,addreceive,be,merchant,payWay0);
if (!noNeedCreate) {
isAllEmpity = false;
}
}
if (isAllEmpity) {
throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(),"请收款或者冲抵");
}
addreceive.setSetOffMoney(setOffTotal.toPlainString());
addreceive.setMerchantId(record.getMerchantId());
addreceive.setRemark(record.getRemark());
this.saveOrUpdateReceive(record,user );
wxFinanceReceiveMapper.insert(record);
return bills;
}
public boolean createBillReceive(BigDecimal receiveTotal,BigDecimal setOffTotal,MallUserInfo user,WxFinanceReceive addreceive,WxBillBaseEntity be,WxMerchant merchant,WxBillPayWay payWay0) {
//如果既没有收款,也没有冲抵,则不更新
boolean noNeedCreate = true;
//计算账单收款费用,更新账单收款
BigDecimal b0 = new BigDecimal(0);
WxBillBaseEntity bill = wxBillAllHelper.getBillDetail(EnumBillAllType.getEnum(be.getBillType()), merchant, be.getId());
if (receiveTotal.compareTo(b0) > 0) {
noNeedCreate = false;
//有收款,就要更新账单的收款
//更新账单收款信息
String money = "";
BigDecimal oweDecimal = new BigDecimal(bill.getOwe());
if (oweDecimal.compareTo(receiveTotal) < 0 ) {
money = bill.getOwe();
receiveTotal = receiveTotal.subtract(oweDecimal);
}else {
money = receiveTotal.toPlainString();
receiveTotal = b0;
}
WxBillPayDTO payDto = new WxBillPayDTO();
payDto.updateTenantInfo(addreceive);
payDto.setId(be.getId());
payDto.setBillTypeValue(be.getBillType());
payDto.setAddpay(money);
payDto.setPayWay(payWay0.getId());
payDto.setPayWayObject(payWay0);
payDto.setRemark("收款单收款["+addreceive.getId()+"]"+addreceive.getRemark());
be.setCurrentReceive(money);
//创建一个实收款单关联
createFinanceReceiveBill(addreceive,bill,money,payWay0.getId());
//并且有抵扣
if(StringUtils.isNotBlank(be.getCurrentSetOff())) {
payDto.setSetOff(be.getCurrentSetOff());
//创建一个冲抵收款单
createFinanceReceiveBill(addreceive,bill,be.getCurrentSetOff(),Constant.bill_pay_way_setoff);
//处理关联抵扣的预收单
createFinanceReceiveSetoff(addreceive,be,bill);
}
wxBillAllHelper.updatePay(payDto, user);
}else if (StringUtils.isNotBlank(be.getCurrentSetOff())) {
noNeedCreate = false;
setOffTotal = setOffTotal.add(new BigDecimal(be.getCurrentSetOff()));
//没收款,有冲抵,就要更新账单的冲抵,然后把对应的预充值使用金额更新,并进行关联
//创建一个冲抵收款单
createFinanceReceiveBill(addreceive,bill,be.getCurrentSetOff(),Constant.bill_pay_way_setoff);
//处理预充关联
createFinanceReceiveSetoff(addreceive,be,bill);
}
return noNeedCreate;
}
public WxFinanceReceive generateReceive(MallUserInfo user,EnumFinanceReceiveType type,String receiveMoney,Long merchantId,Long feesId,String remark) {
WxFinanceReceive addreceive = new WxFinanceReceive();
final IdWorker idWorker = IdWorker.get();
addreceive.setId(idWorker.nextId());
addreceive.updateTenantInfo(user);
addreceive.setStatus(EnumFinanceReceiveStatus.NORMAL.getCode());
addreceive.setType(type.getCode());
addreceive.setReceiveMoney(receiveMoney);
addreceive.setMerchantId(merchantId);
addreceive.setCreateTime(new Date());
addreceive.setCreateBy(user.getId());
addreceive.setCreateByName(user.getName());
addreceive.setUpdateTime(new Date());
addreceive.setUpdateBy(user.getId());
addreceive.setUpdateByName(user.getName());
addreceive.setRemark(remark);
addreceive.setFeesId(feesId);
return addreceive;
}
public void createFinanceReceiveBill(WxFinanceReceive addreceive,WxBillBaseEntity bill,String billMoney,Long payway) {
WxFinanceReceiveBill frbs = new WxFinanceReceiveBill();
frbs.updateTenantInfo(addreceive);
final IdWorker idWorker = IdWorker.get();
frbs.setId(idWorker.nextId());
frbs.setReceiveId(addreceive.getId());
frbs.setBillId(bill.getId());
frbs.setBillType(bill.getBillType());
frbs.setFeesId(bill.getEnergyFeesId());
frbs.setPayWay(payway);
frbs.setReceive(billMoney);
frbs.setCreateTime(new Date());
frbs.setUpdateTime(new Date());
frbs.setMerchantId(bill.getMerchantId());
wxFinanceReceiveBillMapper.insert(frbs);
}
public void createFinanceReceiveSetoff(WxFinanceReceive addreceive,WxBillBaseEntity be,WxBillBaseEntity bill) {
for (int j = 0 ; j < be.getSetOffDetailList().size(); j ++ ) {
FinanceSetOffDetailVo setoffdetail = be.getSetOffDetailList().get(j);
WxFinanceReceive advance = this.getReceiveById(addreceive, setoffdetail.getAdvanceId());
advance.setUseMoney(setoffdetail.getSetoff());
advance.setUpdateTime(new Date());
wxFinanceReceiveMapper.updateById(advance);
//创建一个冲抵收款关联
WxFinanceReceiveSetoff rb = new WxFinanceReceiveSetoff();
rb.updateTenantInfo(addreceive);
rb.setAdvanceId(advance.getId());
rb.setBillId(bill.getId());
rb.setBillType(bill.getBillType());
rb.setFeesId(bill.getEnergyFeesId());
rb.setSetoff(setoffdetail.getSetoff());
rb.setStarttime(bill.getStarttime());
rb.setEndtime(bill.getEndtime());
rb.setMerchantId(bill.getMerchantId());
rb.setCreateTime(new Date());
rb.setUpdateTime(new Date());
wxFinanceReceiveSetoffMapper.insert(rb);
}
}
@Override
public WxFinanceReceive getReceiveById(TenantEntity tenantEntity, Long id) {
return wxFinanceReceiveMapper.selectById(id, tenantEntity.getTenantId());
}
@Override
public void createAdvance(WxFinanceReceive record,MallUserInfo user) {
//创建预收主单
WxFinanceReceive addreceive = generateReceive(user, EnumFinanceReceiveType.ADVANCE, record.getReceiveMoney(),
record.getMerchantId(), record.getFeesId(), record.getRemark());
wxFinanceReceiveMapper.insert(addreceive);
//创建预收账单? WxBillAdvance
}
@Override
public void invalidReceive(WxFinanceReceive record, MallUserInfo user) {
@@ -601,4 +626,6 @@ public class WxFinanceServiceImpl implements WxFinanceService {
}