|
|
|
@@ -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.WxFinanceSetoffBillMapper; |
|
|
|
import com.iformall.mapper.WxFinanceReceiveBillMapper; |
|
|
|
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 { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |