diff --git a/mallinkAdmin/src/main/java/com/iformall/controller/market/WxFinanceController.java b/mallinkAdmin/src/main/java/com/iformall/controller/market/WxFinanceController.java index 3cffd0aca..f3af558aa 100644 --- a/mallinkAdmin/src/main/java/com/iformall/controller/market/WxFinanceController.java +++ b/mallinkAdmin/src/main/java/com/iformall/controller/market/WxFinanceController.java @@ -180,41 +180,21 @@ public class WxFinanceController extends BaseController { if (null == record.getMerchantId()) { return new ResultData(Result.ERROR,"请选择商户"); } - List advanceList = wxFinanceService.getMerchantAdvanceGroupSumList(record); - BigDecimal total = new BigDecimal(0); - Map retMap = new HashMap(); - if (null != advanceList && advanceList.size() > 0 ) { - WxEnergyFees fat = new WxEnergyFees(); - fat.updateTenantInfo(record); - Map advanceTypMap = wxEnergyService.getFeesMap(fat); - for (int i = 0 ; i < advanceList.size() ; i++) { - WxFinanceReceive at = advanceList.get(i); - if (null != at.getFeesId() && null != advanceTypMap) { - WxEnergyFees wfat = advanceTypMap.get(at.getFeesId()); - if (null != wfat) { - at.setFeesName(wfat.getName()); - } - total.add(new BigDecimal(at.getTotalMoney())); - } - } - } - retMap.put("total", total); - retMap.put("details", advanceList); - return new ResultData(retMap); + return new ResultData(wxFinanceService.getBillSetoffSum(record)); } @ApiOperation("查询冲抵列表") - @GetMapping("setoffList") + @PostMapping("setoffList") public ResultData setoffList(@ModelAttribute FinanceSetOffDTO dto) { dto.updateTenantInfo(getTenantInfo()); return new ResultData(wxFinanceService.getSetOffList(dto)); } - @ApiOperation("冲抵") - @PostMapping("setoff") - public ResultData setoff(@RequestBody FinanceSetOffDTO dto) { + @ApiOperation("计算冲抵") + @PostMapping("calcueteSetoff") + public ResultData calcueteSetoff(@RequestBody FinanceSetOffDTO dto) { dto.updateTenantInfo(getTenantInfo()); - WxBillBaseEntity bill = wxFinanceService.setOff(dto,this.getUser()); + WxBillBaseEntity bill = wxFinanceService.calcuetSetOff(dto,this.getUser()); if (null == bill) { return new ResultData(Result.ERROR,"未冲抵"); } diff --git a/mallinkService/src/main/java/com/iformall/domain/dto/FinanceSetOffDTO.java b/mallinkService/src/main/java/com/iformall/domain/dto/FinanceSetOffDTO.java index ddf55b86c..827163ad0 100644 --- a/mallinkService/src/main/java/com/iformall/domain/dto/FinanceSetOffDTO.java +++ b/mallinkService/src/main/java/com/iformall/domain/dto/FinanceSetOffDTO.java @@ -1,6 +1,9 @@ package com.iformall.domain.dto; +import java.util.List; + import com.iformall.domain.po.base.TenantEntity; +import com.iformall.domain.po.base.WxBillBaseEntity; import lombok.Data; @@ -9,7 +12,6 @@ import lombok.Data; @Data public class FinanceSetOffDTO extends TenantEntity{ private static final long serialVersionUID = 3024690696283760441L; - private Long billId; - private Integer billType; - private Long financeAdvanceId; + private List bills; + private List feesIdList; } diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxFinanceReceive.java b/mallinkService/src/main/java/com/iformall/domain/po/WxFinanceReceive.java index eaa2042e0..4c708a999 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxFinanceReceive.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxFinanceReceive.java @@ -1,5 +1,6 @@ package com.iformall.domain.po; +import com.aliyun.openservices.shade.org.apache.commons.lang3.StringUtils; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.iformall.domain.po.base.TenantEntity; @@ -10,6 +11,8 @@ import com.iformall.enums.EnumFinanceReceiveType; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; + +import java.math.BigDecimal; import java.util.Date; import java.util.List; /** @@ -45,6 +48,16 @@ public class WxFinanceReceive extends TenantEntity { @io.swagger.annotations.ApiModelProperty(value = "收款总金额", name = "totalMoney") private String totalMoney; + @io.swagger.annotations.ApiModelProperty(value = "已使用金额(预充值用)", name = "useMoney") + private String useMoney; + + public String getRemain() { + if (StringUtils.isBlank(useMoney)) { + useMoney = "0"; + } + return new BigDecimal(totalMoney).subtract(new BigDecimal(useMoney)).toPlainString(); + } + @io.swagger.annotations.ApiModelProperty(value = "状态EnumFinanceReceiveStatus", name = "status") private Integer status; @TableField(exist = false) @@ -97,5 +110,7 @@ public class WxFinanceReceive extends TenantEntity { private Long floor; @TableField(exist = false) private String shopIds; + @TableField(exist = false) + private String rate; } diff --git a/mallinkService/src/main/java/com/iformall/domain/vo/FinanceBillSetoffSum.java b/mallinkService/src/main/java/com/iformall/domain/vo/FinanceBillSetoffSum.java new file mode 100644 index 000000000..c7c77d77f --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/vo/FinanceBillSetoffSum.java @@ -0,0 +1,16 @@ +package com.iformall.domain.vo; + +import com.iformall.domain.po.WxFinanceReceive; +import lombok.Data; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +@Data +public class FinanceBillSetoffSum implements Serializable { + + private static final long serialVersionUID = 1L; + + private BigDecimal total; + private List advanceList; //feesId,totalMoney,userMoney +} diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumFinanceReceiveStatus.java b/mallinkService/src/main/java/com/iformall/enums/EnumFinanceReceiveStatus.java index 458a6b2cd..6afc988da 100644 --- a/mallinkService/src/main/java/com/iformall/enums/EnumFinanceReceiveStatus.java +++ b/mallinkService/src/main/java/com/iformall/enums/EnumFinanceReceiveStatus.java @@ -8,7 +8,7 @@ public enum EnumFinanceReceiveStatus { NORMAL(1,"正常"), INVALID(2,"作废"), - SETOFF(3, "红冲"), + RED_SETOFF(3, "红冲"), FINISH(4,"已审核过账") ; diff --git a/mallinkService/src/main/java/com/iformall/service/WxFinanceService.java b/mallinkService/src/main/java/com/iformall/service/WxFinanceService.java index 62f4ff1d6..cc34c1f00 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxFinanceService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxFinanceService.java @@ -10,6 +10,7 @@ import com.iformall.domain.po.WxFinanceReceive; import com.iformall.domain.po.WxFinanceReceiveBill; import com.iformall.domain.po.base.TenantEntity; import com.iformall.domain.po.base.WxBillBaseEntity; +import com.iformall.domain.vo.FinanceBillSetoffSum; /** */ public interface WxFinanceService { @@ -22,9 +23,6 @@ public interface WxFinanceService { Map getPayWayMap(WxBillPayWay record); void payWayInit(TenantEntity tenantInfo); - //预收款 - List getSetOffList(FinanceSetOffDTO dto); - //收款 PageInfo receiveListAsPage(WxFinanceReceive record, Integer pageIndex, Integer pageSize); List createReceive(WxFinanceReceive record,MallUserInfo user); @@ -33,8 +31,9 @@ public interface WxFinanceService { WxFinanceReceive getReceiveById(TenantEntity tenantEntity,Long id); void invalidReceive(WxFinanceReceive record,MallUserInfo user); List getBills(TenantEntity tenantEntity,List bills); - List getMerchantAdvanceGroupSumList(WxFinanceReceive record); - //冲抵 - WxBillBaseEntity setOff(FinanceSetOffDTO dto,MallUserInfo user); + //预收款 + WxBillBaseEntity calcuetSetOff(FinanceSetOffDTO dto,MallUserInfo user); + FinanceBillSetoffSum getBillSetoffSum(WxFinanceReceive record); + List getSetOffList(FinanceSetOffDTO dto); } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxFinanceServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxFinanceServiceImpl.java index f5db38e19..6287a035b 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxFinanceServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxFinanceServiceImpl.java @@ -6,6 +6,8 @@ import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.iformall.common.ErrorCode; import com.iformall.common.IdWorker; +import com.iformall.common.Result; +import com.iformall.common.ResultData; import com.iformall.domain.dto.FinanceSetOffDTO; import com.iformall.domain.dto.WxBillPayDTO; import com.iformall.domain.po.MallUserInfo; @@ -19,6 +21,7 @@ import com.iformall.domain.po.WxMerchant; import com.iformall.domain.po.WxShop; import com.iformall.domain.po.base.TenantEntity; import com.iformall.domain.po.base.WxBillBaseEntity; +import com.iformall.domain.vo.FinanceBillSetoffSum; import com.iformall.enums.EnumBillAllType; import com.iformall.enums.EnumBillStatus; import com.iformall.enums.EnumFinanceReceiveStatus; @@ -172,11 +175,34 @@ public class WxFinanceServiceImpl implements WxFinanceService { } @Override - public List getMerchantAdvanceGroupSumList(WxFinanceReceive record){ - return wxFinanceReceiveMapper.getMerchantAdvanceGroupSumList(record); + public FinanceBillSetoffSum getBillSetoffSum(WxFinanceReceive record) { + record.setType(EnumFinanceReceiveType.ADVANCE.getCode()); + record.setStatus(EnumFinanceReceiveStatus.NORMAL.getCode()); + List advanceList = wxFinanceReceiveMapper.getMerchantAdvanceGroupSumList(record); + BigDecimal total = new BigDecimal(0); + FinanceBillSetoffSum retMap = new FinanceBillSetoffSum(); + if (null != advanceList && advanceList.size() > 0 ) { + WxEnergyFees fat = new WxEnergyFees(); + fat.updateTenantInfo(record); + Map advanceTypMap = wxEnergyService.getFeesMap(fat); + for (int i = 0 ; i < advanceList.size() ; i++) { + WxFinanceReceive at = advanceList.get(i); + if (null != at.getFeesId() && null != advanceTypMap) { + WxEnergyFees wfat = advanceTypMap.get(at.getFeesId()); + if (null != wfat) { + at.setFeesName(wfat.getName()); + at.setRate(wfat.getRate()); + } + total.add(new BigDecimal(at.getRemain())); + } + } + } + retMap.setTotal(total); + retMap.setAdvanceList(advanceList); + return retMap; } - private List getAdvanceListByFeesId(TenantEntity tenantEntity,Long feesId) { + private FinanceBillSetoffSum getAdvanceListByFeesId(TenantEntity tenantEntity,Long feesId) { WxEnergyFeesSetoff tf = new WxEnergyFeesSetoff(); tf.updateTenantInfo(tenantEntity); tf.setFeesId(feesId); @@ -185,48 +211,36 @@ public class WxFinanceServiceImpl implements WxFinanceService { WxFinanceReceive faq = new WxFinanceReceive(); faq.updateTenantInfo(tenantEntity); faq.setFeesIdList(feesIdList); - return wxFinanceReceiveMapper.findList(faq); + return getBillSetoffSum(faq); }else { return null; } } @Override - public List getSetOffList(FinanceSetOffDTO dto) { - //根据账单的科目查询可抵扣的预充值 - WxMerchant merchant = new WxMerchant(); - merchant.updateTenantInfo(dto); - WxBillBaseEntity be = wxBillAllHelper.getBillDetail(EnumBillAllType.getEnum(dto.getBillType()), merchant, dto.getBillId()); - if (null == be) { - return null; + public List getSetOffList(FinanceSetOffDTO dto) { + if (null == dto.getBills() || dto.getBills().size() <= 0 ) { + throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(),"请选择账单"); } - //通过科目去查询可以抵扣的预充费用 - List advanceList = getAdvanceListByFeesId(dto, be.getEnergyFeesId()); - - if (null != advanceList && advanceList.size() > 0 ) { - WxEnergyFees atq = new WxEnergyFees(); - atq.updateTenantInfo(dto); - Map typeMap = wxEnergyService.getFeesMap(atq); - List retList = new ArrayList(); - for (int i = 0 ; i < advanceList.size() ; i ++) { - WxFinanceReceive a = advanceList.get(i); - Map m = new HashMap(); - m.put("id", a.getId()); - if (null != typeMap && null != a.getFeesId()) { - WxEnergyFees fat = typeMap.get(a.getFeesId()); - if (null != fat) { - m.put("name", fat.getName()); - m.put("rate", fat.getRate()); - m.put("money", calcuteSetOffMoney(fat.getRate(),be.getOwe())); - } - } - retList.add(m); + Long billFeesId = null; + for (int i = 0 ; i < dto.getBills().size(); i++) { + WxBillBaseEntity b = dto.getBills().get(i); + if (null == billFeesId) { + billFeesId = b.getEnergyFeesId(); + }else if (billFeesId.equals(b.getEnergyFeesId())) { + }else if (!billFeesId.equals(b.getEnergyFeesId())) { + throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(),"请选择相同科目"); } - return retList; } - return null; + //通过账单科目去查询可以抵扣的预充费用 + FinanceBillSetoffSum sum = getAdvanceListByFeesId(dto, billFeesId); + if (null == sum) { + return null; + } + return sum.getAdvanceList(); } + private String calcuteSetOffMoney(String rate,String money) { if (new BigDecimal(money).compareTo(new BigDecimal(0)) <= 0) { return "0"; @@ -235,10 +249,22 @@ public class WxFinanceServiceImpl implements WxFinanceService { } @Override - public WxBillBaseEntity setOff(FinanceSetOffDTO dto,MallUserInfo user) { + public WxBillBaseEntity calcuetSetOff(FinanceSetOffDTO dto,MallUserInfo user) { + //多个账单类型和科目必须一致 + //优先冲抵时间早的账单,优先用时间早的预充费用来冲抵 + if (null == dto.getBills() || dto.getBills().size() <= 0 || null == dto.getFeesIdList() || dto.getFeesIdList().size() <= 0 ) { + throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(),"请选择账单和抵扣科目"); + } + //查询出账单可以抵扣的科目预收项 + List advanceList = getSetOffList(dto); + WxBillBaseEntity bill = wxBillAllHelper.getBillDetail(EnumBillAllType.getEnum(be.getBillType()), merchant, be.getId()); + if (new BigDecimal(bill.getOwe()).compareTo(b0) <= 0 ) { + }else { + billList.add(bill); + } + //根据预充规则计算冲抵费用 - WxMerchant merchant = new WxMerchant(); - merchant.updateTenantInfo(dto); + WxBillBaseEntity bill = wxBillAllHelper.getBillDetail(EnumBillAllType.getEnum(dto.getBillType()), merchant, dto.getBillId()); if (new BigDecimal(bill.getOwe()).compareTo(new BigDecimal(0)) <= 0) { return null; @@ -370,7 +396,7 @@ 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(); @@ -432,6 +458,27 @@ public class WxFinanceServiceImpl implements WxFinanceService { } } + private void sortBills(List billList) { + Collections.sort(billList, new Comparator() { + @Override + public int compare(WxBillBaseEntity o1, WxBillBaseEntity o2) { + if (o1.getStarttime().before(o2.getStarttime())) { + return -1; + }else if (o1.getStarttime().equals(o2.getStarttime())) { + if (o1.getEndtime().before(o2.getEndtime())) { + return -1; + }else if (o1.getEndtime().equals(o2.getEndtime())) { + return 0; + }else { + return 1; + } + }else { + return 1; + } + } + }); + } + @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) @Override public List createReceive(WxFinanceReceive record,MallUserInfo user) { @@ -451,24 +498,7 @@ public class WxFinanceServiceImpl implements WxFinanceService { if (billList.size() <= 0 ) { return null; } - Collections.sort(billList, new Comparator() { - @Override - public int compare(WxBillBaseEntity o1, WxBillBaseEntity o2) { - if (o1.getStarttime().before(o2.getStarttime())) { - return -1; - }else if (o1.getStarttime().equals(o2.getStarttime())) { - if (o1.getEndtime().before(o2.getEndtime())) { - return -1; - }else if (o1.getEndtime().equals(o2.getEndtime())) { - return 0; - }else { - return 1; - } - }else { - return 1; - } - } - }); + sortBills(billList); //增加一条收款记录。关联账单,账单更新收款信息 BigDecimal total = new BigDecimal(0); for (int i = 0 ; i < record.getPayWays().size() ; i ++) { diff --git a/mallinkService/src/main/resources/mapper/WxFinanceReceiveMapper.xml b/mallinkService/src/main/resources/mapper/WxFinanceReceiveMapper.xml index 5fe2e40e3..a98c8ecc9 100644 --- a/mallinkService/src/main/resources/mapper/WxFinanceReceiveMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxFinanceReceiveMapper.xml @@ -8,6 +8,7 @@ + @@ -21,7 +22,7 @@ - `id`,`tenant_id`,`parent_tenant_id`,`create_time`,`update_time`,`total_money`,`status`,`type`,`money_detail`, + `id`,`tenant_id`,`parent_tenant_id`,`create_time`,`update_time`,`total_money`,`use_money`,`status`,`type`,`money_detail`, `create_by`,`create_by_name`,`update_by`,`update_by_name`,`merchant_id`,`remark`,`feesId` @@ -79,8 +80,11 @@