package com.ycsoft.business.service.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ycsoft.beans.config.TBusiFee;
import com.ycsoft.beans.core.acct.CAcctAcctitemChange;
import com.ycsoft.beans.core.acct.CGeneralContractPay;
import com.ycsoft.beans.core.bank.CBankGotodisk;
import com.ycsoft.beans.core.bank.CBankReturn;
import com.ycsoft.beans.core.bank.CBankReturnPayerror;
import com.ycsoft.beans.core.common.CDoneCode;
import com.ycsoft.beans.core.common.CDoneCodeDetail;
import com.ycsoft.beans.core.cust.CCust;
import com.ycsoft.beans.core.fee.CFee;
import com.ycsoft.beans.core.fee.CFeeAcct;
import com.ycsoft.beans.core.fee.CFeeBusi;
import com.ycsoft.beans.core.fee.CFeeDevice;
import com.ycsoft.beans.core.fee.CFeePay;
import com.ycsoft.beans.core.fee.CFeePropChange;
import com.ycsoft.beans.core.fee.CFeeUnitpre;
import com.ycsoft.beans.core.job.JCustWriteoff;
import com.ycsoft.beans.core.prod.CProdMobileBill;
import com.ycsoft.beans.core.prod.CProdOrder;
import com.ycsoft.beans.core.prod.CProdOrderFee;
import com.ycsoft.beans.core.prod.CProdOrderFeeOut;
import com.ycsoft.beans.core.user.CUser;
import com.ycsoft.beans.invoice.RInvoice;
import com.ycsoft.beans.prod.PProd;
import com.ycsoft.beans.system.SOptr;
import com.ycsoft.business.commons.pojo.BusiParameter;
import com.ycsoft.business.component.core.OrderComponent;
import com.ycsoft.business.dao.config.TExchangeDao;
import com.ycsoft.business.dao.core.bank.CBankGotodiskDao;
import com.ycsoft.business.dao.core.bank.CBankReturnDao;
import com.ycsoft.business.dao.core.bank.CBankReturnPayerrorDao;
import com.ycsoft.business.dao.core.fee.CFeeUnprintDao;
import com.ycsoft.business.dao.core.prod.CProdOrderDao;
import com.ycsoft.business.dao.core.prod.CProdOrderFeeDao;
import com.ycsoft.business.dao.core.prod.CProdOrderFeeOutDao;
import com.ycsoft.business.dao.prod.PProdDao;
import com.ycsoft.business.dto.core.acct.PayDto;
import com.ycsoft.business.dto.core.fee.CFeePayDto;
import com.ycsoft.business.dto.core.fee.FeeBusiFormDto;
import com.ycsoft.business.dto.core.fee.FeeDto;
import com.ycsoft.business.dto.core.fee.MergeFeeDto;
import com.ycsoft.business.dto.core.print.CInvoiceDto;
import com.ycsoft.business.service.IPayService;
import com.ycsoft.commons.constants.BusiCmdConstants;
import com.ycsoft.commons.constants.BusiCodeConstants;
import com.ycsoft.commons.constants.DictKey;
import com.ycsoft.commons.constants.StatusConstants;
import com.ycsoft.commons.constants.SystemConstants;
import com.ycsoft.commons.exception.ErrorCode;
import com.ycsoft.commons.exception.ServicesException;
import com.ycsoft.commons.helper.CollectionHelper;
import com.ycsoft.commons.helper.DateHelper;
import com.ycsoft.commons.helper.StringHelper;
import com.ycsoft.commons.store.MemoryDict;
import com.ycsoft.commons.store.MemoryPrintData;
import com.ycsoft.daos.core.JDBCException;
/**
* 业务保存接口的实现类
*
* @author hh
*/
@Service
public class PayService extends BaseBusiService implements IPayService {
private CBankReturnDao cBankReturnDao;
private CBankReturnPayerrorDao cBankReturnPayerrorDao;
private CBankGotodiskDao cBankGotodiskDao;
@Autowired
private CProdOrderDao cProdOrderDao;
@Autowired
private PProdDao pProdDao;
@Autowired
private TExchangeDao tExchangeDao;
@Autowired
private OrderComponent orderComponent;
@Autowired
private CProdOrderFeeDao cProdOrderFeeDao;
@Autowired
private CFeeUnprintDao cFeeUnprintDao;
@Autowired
private CProdOrderFeeOutDao cProdOrderFeeOutDao;
/**
* 查询汇率
* @return
* @throws ServicesException
*/
public Integer queryExchage() throws Exception{
Integer exchange= tExchangeDao.getExchange();
if(exchange==null||exchange<=0){
throw new ServicesException(ErrorCode.ExchangeConfigError);
}
return exchange;
}
/**
* 查询未支付总额
* @param cust_id
* @return
* @throws Exception
*/
public Map<String,Integer> queryUnPaySum(String cust_id) throws Exception{
return feeComponent.queryUnPaySum(cust_id,this.getOptr().getOptr_id());
}
/**
* 查询未支付的费用明细
* 显示 费用编号 fee_sn,业务名称busi_name,费用名称fee_text,数量(当count不为空,显示count否则显示begin_date(yyyymmdd)+“-”+prod_invalid_date),
* 操作员 optr_name,操作时间create_time,金额 real_pay,订单号 prod_sn,X按钮(当prod_sn不为空时显示)
* @param cust_id
* @return
*/
public List<FeeDto> queryUnPayDetail(String cust_id)throws Exception{
return feeComponent.queryUnPay(cust_id,this.getOptr().getOptr_id());
}
/**
* 检查未支付退订数据
* @param fee
* @throws ServicesException
*/
private void checkCanclUpPayFeeParam(CFee fee,String cust_id) throws Exception{
if(fee==null){
throw new ServicesException(ErrorCode.ParamIsNull);
}
if(!fee.getCust_id().equals(cust_id)){
throw new ServicesException(ErrorCode.CustDataException);
}
if(!StatusConstants.UNPAY.equals(fee.getStatus())||
!SystemConstants.PAY_TYPE_UNPAY.equals(fee.getPay_type())){
throw new ServicesException(ErrorCode.UnPayFeeHasPay);
}
if(fee.getFee_type().equals(SystemConstants.FEE_TYPE_ACCT)
&&StringHelper.isEmpty(fee.getAcctitem_id())){
throw new ServicesException(ErrorCode.ParamIsNull);
}
if(!fee.getFee_type().equals(SystemConstants.FEE_TYPE_ACCT)
&&StringHelper.isEmpty(fee.getFee_id())){
throw new ServicesException(ErrorCode.ParamIsNull);
}
}
/**
* 取消未支付的费用项目
* @param feeSn
* @throws Exception
*/
public String saveCancelUnPayFee(String fee_sn,String fee_type,boolean onlyShowInfo) throws Exception{
if(StringHelper.isEmpty(fee_sn)||StringHelper.isEmpty(fee_type)){
throw new ServicesException(ErrorCode.ParamIsNull);
}
String cust_id=this.getBusiParam().getCust().getCust_id();
doneCodeComponent.lockCust(cust_id);
Integer doneCode=doneCodeComponent.gDoneCode();
String info="";//取消费用的业务提示
if(fee_type.equals(SystemConstants.FEE_TYPE_ACCT)){
CFeeAcct fee=feeComponent.queryAcctFeeByFeeSn(fee_sn);
this.checkCanclUpPayFeeParam(fee, cust_id);
if(!fee.getAcctitem_id().equals(SystemConstants.ACCTITEM_PUBLIC_ID)){
if(fee.getBusi_code().equals(BusiCodeConstants.ORDER_EDIT)){
//订单修改,不能取消
throw new ServicesException(ErrorCode.UnPayHasEdit);
}else if(fee.getReal_pay()>0){
//产品订购,业务回退
for(CProdOrderFee orderFee: cProdOrderFeeDao.queryByOrderSn(fee.getProd_sn())){
if(!orderFee.getInput_fee().equals(orderFee.getFee())){
//被修改过费用记录不允许取消
throw new ServicesException(ErrorCode.UnPayHasEdit);
}
}
if(!onlyShowInfo){
this.cancelUnPayProdOrderPay(fee,doneCode);
}
info=SystemConstants.UNPAY_CANCEL_PROMPT_FEEANDBUSI;
}else{
if(StringHelper.isNotEmpty(fee.getProd_sn())){
//产品订单退订,不能取消
throw new ServicesException(ErrorCode.UnPayOrderCancelUnsubscribe);
}else{
//不对应有订单,则可以取消费用
if(!onlyShowInfo){
//作废缴费信息
feeComponent.saveCancelFeeUnPay(fee, doneCode);
//作废业务
doneCodeComponent.cancelDoneCode(fee.getCreate_done_code());
}
info=SystemConstants.UNPAY_CANCEL_PROMPT_ONLYFEE;
}
}
}else{
if(fee.getReal_pay()>0){
//公用现金充值,业务回退
if(!onlyShowInfo){
this.cancelUnPayAcctPay(fee,doneCode);
}
info=SystemConstants.UNPAY_CANCEL_PROMPT_FEEANDBUSI;
}else{
//公用现金退款,业务回退
if(!onlyShowInfo){
this.cancelUnPayAcctRefund(fee,doneCode);
}
info=SystemConstants.UNPAY_CANCEL_PROMPT_FEEANDBUSI;
}
}
}else if(fee_type.equals(SystemConstants.FEE_TYPE_BUSI)){
CFeeBusi fee=feeComponent.queryFeeBusi(fee_sn);
this.checkCanclUpPayFeeParam(fee, cust_id);
if(fee.getBusi_code().equals(BusiCodeConstants.FEE_EDIT)){
if(!onlyShowInfo){
this.cancelUnPayFeeEdit(fee, doneCode);
}
info=SystemConstants.UNPAY_CANCEL_PROMPT_FEEANDBUSI;
}else{
//取消杂费,业务正常
if(!onlyShowInfo){
this.cancelUnPayBusiFee(fee, doneCode);
}
info=SystemConstants.UNPAY_CANCEL_PROMPT_ONLYFEE;
}
}else if(fee_type.equals(SystemConstants.FEE_TYPE_DEVICE)){
CFeeDevice fee=feeComponent.queryFeeDevice(fee_sn);
this.checkCanclUpPayFeeParam(fee, cust_id);
if(fee.getBusi_code().equals(BusiCodeConstants.FEE_EDIT)){
if(!onlyShowInfo){
this.cancelUnPayFeeEdit(fee, doneCode);
}
info=SystemConstants.UNPAY_CANCEL_PROMPT_FEEANDBUSI;
}else if(SystemConstants.DEVICE_TYPE_FITTING.equals(fee.getDevice_type())
&&fee.getCreate_done_code().equals(fee.getBusi_done_code()) //非费用修改
&&fee.getReal_pay()>0){
//配件费取消,业务回退
if(!onlyShowInfo){
this.cancelUnPayFittingFee(fee, doneCode);
}
info=SystemConstants.UNPAY_CANCEL_PROMPT_FEEANDBUSI;
}else{
//取消费用,业务正常
if(!onlyShowInfo){
this.cancelUnPayDeviceFeePay(fee, doneCode);
}
info=SystemConstants.UNPAY_CANCEL_PROMPT_ONLYFEE;
}
}else {
throw new ServicesException(ErrorCode.UnPayFeeTypeCanNotCancel);
}
//取消费用提示描述
String infoDesc=MemoryDict.getDictName(DictKey.UNPAY_CANCEL_PROMPT, info);
if(StringHelper.isEmpty(infoDesc)){
infoDesc=info;
}
if(!onlyShowInfo){
CFee fee = feeComponent.queryBySn(fee_sn);
this.getBusiParam().setOperateObj(fee.getFee_id_text()+fee.getAcctitem_id_text()+" (amount:"+fee.getReal_pay()/100+")");
this.saveAllPublic(doneCode, this.getBusiParam());
}
return infoDesc;
}
/**
* 取消公用充值
* @param fee_sn
* @throws Exception
*/
private void cancelUnPayAcctPay(CFee fee,Integer doneCode) throws Exception{
if(!fee.getAcctitem_id().equals(SystemConstants.ACCTITEM_PUBLIC_ID)){
throw new ServicesException(ErrorCode.UnPayAcctIsNotPublic);
}
//从账户扣回可退部分余额
acctComponent.saveAcctDebitFee(fee.getCust_id(), fee.getAcct_id(), fee.getAcctitem_id(),
SystemConstants.ACCT_CHANGE_UNCFEE, fee.getReal_pay()*-1, this.getBusiParam().getBusiCode(), doneCode, true,null);
//作废缴费信息
feeComponent.saveCancelFeeUnPay(fee, doneCode);
//作废业务
doneCodeComponent.cancelDoneCode(fee.getCreate_done_code());
}
/**
* 取消公用退款
* @param fee_sn
*/
private void cancelUnPayAcctRefund(CFee fee,Integer doneCode)throws Exception{
if(!fee.getAcctitem_id().equals(SystemConstants.ACCTITEM_PUBLIC_ID)){
throw new ServicesException(ErrorCode.UnPayAcctIsNotPublic);
}
//查找上次异动记录,并按异动记录资金明细恢复金额
List<CAcctAcctitemChange> changeList=acctComponent.queryAcctitemChangeByBusiInfo(fee.getAcct_id(), fee.getAcctitem_id(),fee.getBusi_code(),fee.getCreate_done_code());
int totalFee=0;
for(CAcctAcctitemChange change:changeList){
totalFee=totalFee+change.getChange_fee();
if(!fee.getCust_id().equals(change.getCust_id())){
throw new ServicesException(ErrorCode.CustDataException);
}
}
if(totalFee!=fee.getReal_pay()){
throw new ServicesException(ErrorCode.UnPayAcctRefundFeeAndChangeIsDiffer);
}
//恢复账户金额
for(CAcctAcctitemChange change:changeList){
acctComponent.saveAcctAddFee(change.getCust_id(), fee.getAcct_id(), fee.getAcctitem_id(),
SystemConstants.ACCT_CHANGE_UNCFEE,change.getChange_fee()*-1, change.getFee_type(), this.getBusiParam().getBusiCode(), doneCode,null);
}
//作废缴费信息
feeComponent.saveCancelFeeUnPay(fee, doneCode);
//作废业务
doneCodeComponent.cancelDoneCode(fee.getCreate_done_code());
}
/**
* 取消未支付订单,业务回退
* @param fee_sn
* @throws Exception
*/
private void cancelUnPayProdOrderPay(CFeeAcct fee,Integer doneCode) throws Exception{
String order_sn=fee.getProd_sn();
if(StringHelper.isNotEmpty(order_sn)){
CProdOrder order=cProdOrderDao.findByKey(order_sn);
//检查套餐类要按订购顺序取消,同一个用户的宽带类单产品要按订购顺序取消,用户一个用户的非宽带单产品按相同产品订购顺序取消。
//TODO 操作过订单编辑且费用发生变化费用记录不允许取消 目的是保证c_fee_acct中pre_invalid_date和begin_date准确
this.checkUnPayOrderCancel(order,fee);
//恢复被覆盖转移的订单
orderComponent.recoverTransCancelOrder(order.getDone_code(),order.getCust_id(),doneCode);
//删除c_prod_order_fee
cProdOrderFeeDao.deleteOrderFeeByOrderSn(order_sn);
//移除订单到历史表
List<CProdOrder> cancelOrders=orderComponent.saveCancelProdOrder(order, doneCode);
//取消授权
sendProdAtuh(cancelOrders,fee.getCust_id(),doneCode);
}
//作废缴费信息
feeComponent.saveCancelFeeUnPay(fee, doneCode);
//作废业务
doneCodeComponent.cancelDoneCode(fee.getCreate_done_code());
}
/**
* 加减授权都能正确处理
* @param orders
* @param custId
* @param doneCode
* @throws Exception
*/
private void sendProdAtuh(List<CProdOrder> orders,String custId,Integer doneCode) throws Exception{
Map<String,CUser> userMap=userComponent.queryUserMap(custId);
Map<CUser,List<CProdOrder>> atvMap=new HashMap<>();
//查询待支付的订单(含套餐和套餐子产品)
for(CProdOrder order:orders){
if(StringHelper.isEmpty(order.getUser_id()))
continue;
CUser user=userMap.get(order.getUser_id());
if(user==null){
throw new ServicesException(ErrorCode.OrderDateException,order.getOrder_sn());
}
List<CProdOrder> list=atvMap.get(user);
if(list==null){
list=new ArrayList<>();
atvMap.put(user, list);
}
list.add(order);
}
//发授权
for(CUser user:atvMap.keySet()){
authComponent.sendAuth(user, atvMap.get(user), BusiCmdConstants.ACCTIVATE_PROD, doneCode);
}
}
/**
* 检查是否按顺序取消
* 套餐类要按订购顺序取消,同一个用户的宽带类单产品要按订购顺序取消,用户一个用户的非宽带单产品按相同产品订购顺序取消。
* 目的是保证c_fee_acct.pro_invalid_date begin_date准确
* @param order
* @throws Exception
*/
private void checkUnPayOrderCancel(CProdOrder order,CFee cfee) throws Exception{
if(order==null||cfee==null){
throw new ServicesException(ErrorCode.ParamIsNull);
}
String fee_sn=cfee.getFee_sn();
String cust_id=cfee.getCust_id();
if(StringHelper.isEmpty(cust_id)||StringHelper.isEmpty(fee_sn)){
throw new ServicesException(ErrorCode.ParamIsNull);
}
if(!cust_id.equals(order.getCust_id())){
throw new ServicesException(ErrorCode.CustDataException);
}
if(cfee.getReal_pay()<0){
throw new ServicesException(ErrorCode.UnPayOrderCancelUnsubscribe);
}
if(!order.getDone_code().equals(cfee.getCreate_done_code())||!order.getProd_id().equals(cfee.getAcctitem_id())){
throw new ServicesException(ErrorCode.CFeeAndProdOrderIsNotOne);
}
//发生订单费用修改不能取消
if(cfee.getBusi_code().equals(BusiCodeConstants.ORDER_EDIT)
||cfee.getBusi_code().equals(BusiCodeConstants.ORDER_EDIT)){
throw new ServicesException(ErrorCode.UnPayHasEdit);
}
for(CProdOrderFee orderFee: cProdOrderFeeDao.queryByOrderSn(order.getOrder_sn())){
if(!orderFee.getInput_fee().equals(orderFee.getFee())){
//被修改过费用记录不允许取消
throw new ServicesException(ErrorCode.UnPayHasEdit);
}
}
PProd prod=pProdDao.findByKey(order.getProd_id());
//碰撞检测
if(!prod.getProd_type().equals(SystemConstants.PROD_TYPE_BASE)){
//套餐处理
for(CProdOrder checkOrder: cProdOrderDao.queryNotExpPackageOrder(cust_id)){
if(order.getExp_date().before(checkOrder.getExp_date())){
throw new ServicesException(ErrorCode.UnPayOrderCancelBefor,checkOrder.getOrder_sn());
}
}
//跟单产品在套餐后续订碰撞
List<CProdOrder> orderAfterPakList=cProdOrderDao.querySingleProdOrderAfterPak(order.getOrder_sn());
if(orderAfterPakList!=null&&orderAfterPakList.size()>0){
throw new ServicesException(ErrorCode.UnPayOrderCancelBefor,orderAfterPakList.get(0).getOrder_sn());
}
}else{
//单产品直接碰撞处理
for(CProdOrder checkOrder: cProdOrderDao.queryProdOrderDtoByUserId(order.getUser_id())){
if(prod.getServ_id().equals(SystemConstants.PROD_SERV_ID_BAND)||order.getProd_id().equals(checkOrder.getProd_id())){
if(order.getExp_date().before(checkOrder.getExp_date())){
throw new ServicesException(ErrorCode.UnPayOrderCancelBefor,checkOrder.getOrder_sn());
}
}
}
}
}
/**
* 取消订单退订金额: 退款转给账户,业务正常
private void cancelUnPayProdUnsubscribePay(CFeeAcct fee,Integer doneCode) throws Exception{
String order_sn=fee.getProd_sn();
String fee_sn=fee.getFee_sn();
if(StringHelper.isEmpty(order_sn)||StringHelper.isEmpty(fee_sn)){
throw new ServicesException(ErrorCode.ParamIsNull);
}
PProd prod=prodComponent.queryById(fee.getAcctitem_id());
//TODO 提取资金转出到缴费的 订单金额明细
//List<CProdOrderFee> orderFees=cProdOrderFeeDao.queryByOutPutInfo(order_sn, SystemConstants.ORDER_FEE_TYPE_CFEE, fee_sn);
List<CProdOrderFeeOut> outList=cProdOrderFeeOutDao.queryByDoneCodeAndSn(fee.getCreate_done_code(), fee.getFee_sn());
//处理费用转出到缴费记录的回退
orderComponent.saveOrderFeeOutToBack(outList,doneCode);
for(CProdOrderFeeOut out:outList){
out.setOutput_type(SystemConstants.ORDER_FEE_TYPE_ACCT);//更新转出类型为账户
out.setOutput_sn(null);
out.setPre_fee(null);
out.setFee(null);
out.setRemark(prod.getProd_name());
}
//原来转给缴费的金额现在转给公用账目
acctComponent.saveCancelFeeToAcct(outList, fee.getCust_id(), doneCode, this.getBusiParam().getBusiCode());
//更新资金明细
//cProdOrderFeeDao.update(orderFees.toArray(new CProdOrderFee[orderFees.size()]));
orderComponent.saveOrderFeeOut(outList, doneCode);
//作废缴费
feeComponent.saveCancelFeeUnPay(fee, doneCode);
}*/
/**
* 只取消设备费用,业务正常
* @throws Exception
*/
private void cancelUnPayDeviceFeePay(CFeeDevice feeDevice,Integer doneCode) throws Exception{
feeComponent.saveCancelFeeUnPay(feeDevice, doneCode);
}
/**
* 取消配件费,回退业务
* @throws Exception
*/
private void cancelUnPayFittingFee(CFeeDevice feeDevice,Integer doneCode) throws Exception{
//回退配件库存
deviceComponent.updateDeviceNum(feeDevice);
//作废缴费
feeComponent.saveCancelFeeUnPay(feeDevice, doneCode);
//作废业务
doneCodeComponent.cancelDoneCode(feeDevice.getCreate_done_code());
}
/**
* 取消营业费的收费,业务正常
* @param fee_sn
* @throws Exception
*/
private void cancelUnPayBusiFee(CFeeBusi feeBusi,Integer doneCode) throws Exception{
feeComponent.saveCancelFeeUnPay(feeBusi, doneCode);
}
/**
* 取消费用修改
* @param fee
* @param doneCode
* @throws Exception
*/
private void cancelUnPayFeeEdit(CFee fee,Integer doneCode) throws Exception{
//作废费用
feeComponent.saveCancelFeeUnPay(fee, doneCode);
//作废业务
doneCodeComponent.cancelDoneCode(fee.getCreate_done_code());
}
/**
* 查询支付记录的取消信息(发票信息)
* @param paySn
* @throws Exception
*/
public Set<String> queryPayToCancel(String paySn) throws Exception{
CFeePay pay=feeComponent.queryCFeePayByPaySn(paySn);
if(StringHelper.isEmpty(paySn)||pay==null){
throw new ServicesException(ErrorCode.ParamIsNull);
}
String optr_id=this.getOptr().getOptr_id();
if(!optr_id.equals(pay.getOptr_id())){
throw new ServicesException(ErrorCode.PayCancelOnlyPayOptr);
}
if(!SystemConstants.BOOLEAN_TRUE.equals(pay.getIs_valid())){
throw new ServicesException(ErrorCode.PayHasCancel);
}
Set<String> invoices=new HashSet<>();
for(FeeDto fee: feeComponent.queryPayFeeDtoByPaySn(paySn)){
if(StringHelper.isNotEmpty(fee.getInvoice_id())){
invoices.add(fee.getInvoice_id());
}
}
return invoices;
}
/**
* 检查回退支付的业务参数
*/
private List<FeeDto> checkCancelPayParam(String custId,String paySn,String[] invoiceIds) throws Exception{
CFeePay pay=feeComponent.queryCFeePayByPaySn(paySn);
//检查客户
if(StringHelper.isEmpty(custId)||StringHelper.isEmpty(paySn)||pay==null){
throw new ServicesException(ErrorCode.ParamIsNull);
}
if(!custId.equals(pay.getCust_id())){
throw new ServicesException(ErrorCode.CustDataException);
}
//检查操作员,超级退订不限制 支付操作员本人回退
String optr_id=this.getOptr().getOptr_id();
if(!BusiCodeConstants.SUPER_CANCEL_PAY.equals(this.getBusiParam().getBusiCode())
&&!optr_id.equals(pay.getOptr_id())){
throw new ServicesException(ErrorCode.PayCancelOnlyPayOptr);
}
if(!SystemConstants.BOOLEAN_TRUE.equals(pay.getIs_valid())){
throw new ServicesException(ErrorCode.PayHasCancel);
}
List<FeeDto> feeList=feeComponent.queryPayFeeDtoByPaySn(paySn);
int payFee=0;
Map<String,Boolean> invoiceMap=new HashMap<>();
if(invoiceIds!=null){
for(String invoiceId:invoiceIds){
if(StringHelper.isNotEmpty(invoiceId))
invoiceMap.put(invoiceId, false);
}
}
for(FeeDto fee:feeList){
if(!custId.equals(fee.getCust_id())){
throw new ServicesException(ErrorCode.CustDataException);
}
if(!StatusConstants.PAY.equals(fee.getStatus())){//缴费记录状态不正常
throw new ServicesException(ErrorCode.PayFeeStatusError);
}
if(StringHelper.isNotEmpty(fee.getInvoice_id())){
if(invoiceMap.containsKey(fee.getInvoice_id())){
invoiceMap.put(fee.getInvoice_id(), true);//设置缴费记录存在该发票
}else{//缴费记录存在发票,但是前台传入参数不存在该发票
throw new ServicesException(ErrorCode.PayCancelInvoiceParamError);
}
}
//检查费用记录是订购业务的费用记录 或是 修改订单的费用记录 有无被退订,被退订则不能取消支付
if(StringHelper.isNotEmpty(fee.getProd_sn())&&
(fee.getReal_pay()>0
||fee.getBusi_code().equals(BusiCodeConstants.ORDER_EDIT))){
if(cProdOrderDao.findByKey(fee.getProd_sn())==null){
throw new ServicesException(ErrorCode.PayFeeHasCancelOrder);
}
/**这个判断重复了
for(CProdOrderFee orderfee: cProdOrderFeeDao.queryByOrderSn(fee.getProd_sn())){
if(orderfee.getOutput_fee()>0){
throw new ServicesException(ErrorCode.PayFeeHasCancelOrder);
}
}**/
}
payFee=payFee+fee.getReal_pay();
}
if(payFee!=pay.getFee()){//缴费记录金额和支付记录金额不一致
throw new ServicesException(ErrorCode.FeeDateException);
}
//检查发票
for(String invoiceId:invoiceMap.keySet()){
if(invoiceMap.get(invoiceId)==false){//前台传入的发票,但是缴费记录不存在该发票
throw new ServicesException(ErrorCode.PayCancelInvoiceParamError);
}
RInvoice invoice=invoiceComponent.queryById(invoiceId, SystemConstants.BASE_INVOICE_CODE);
if(invoice==null){//发票不存在
throw new ServicesException(ErrorCode.InvoiceNotExists);
}
if(!BusiCodeConstants.SUPER_CANCEL_PAY.equals(this.getBusiParam().getBusiCode())
&&!optr_id.equals(invoice.getOptr_id())){//发票不是支付人的
throw new ServicesException(ErrorCode.InvoiceIsNotYou);
}
if(!StatusConstants.USE.equals(invoice.getStatus())){//发票不是使用状态
throw new ServicesException(ErrorCode.InvoiceNotUse);
}
if(!StatusConstants.IDLE.equals(invoice.getFinance_status())){//发票被结账或缴销
throw new ServicesException(ErrorCode.InvoiceCheckStatusIsNotIdle);
}
}
return feeList;
}
/**
* 回退支付恢复未支付的业务,删除未打印记录
*/
private void canlePayToUnPayDoneCode(List<FeeDto> feeList) throws Exception{
Map<Integer,CFee> feeMap=new HashMap<>();
for(FeeDto fee:feeList){
feeMap.put(fee.getCreate_done_code(), fee);
cFeeUnprintDao.remove(fee.getFee_sn());
}
for(CFee fee: feeMap.values()){
doneCodeComponent.saveDoneCodeUnPay(fee.getCust_id(), fee.getCreate_done_code(), fee.getOptr_id());
}
}
/**
* 回退支付记录(含处理缴费记录、发票、订单支付状态和订单费用明细)
*/
public void saveCanclePay(String paySn,String[] invoiceIds)throws Exception{
//TODO
String custId=this.getBusiParam().getCust().getCust_id();
doneCodeComponent.lockCust(custId);
List<FeeDto> feeList=checkCancelPayParam(custId,paySn,invoiceIds);
Integer doneCode=doneCodeComponent.gDoneCode();
String busiCode=this.getBusiParam().getBusiCode();
String optrId=this.getBusiParam().getOptr().getOptr_id();
//先处理发票,涉及未其他费用的未打印
if(invoiceIds!=null&&invoiceIds.length>0){
for(String invoice_id:invoiceIds){
if(StringHelper.isNotEmpty(invoice_id)){
invalidInvoiceByinvoiceId(invoice_id,SystemConstants.BASE_INVOICE_CODE,doneCode);
}
}
}
//恢复缴费记录未支付状态
feeComponent.updateCFeeToUnPay(paySn);
//恢复未支付的业务和删除未打印信息
canlePayToUnPayDoneCode(feeList);
//更新订单费用记录对应的缴费转入费用费用类型为未支付
orderComponent.updateOrderFeeTypeByPayType(feeList,SystemConstants.PAY_TYPE_UNPAY);
//更新缴费相关的订单状态=未支付
updateOrderIsPay(feeList,custId,SystemConstants.BOOLEAN_FALSE,busiCode);
//作废支付记录
feeComponent.saveCancelPayFee(paySn, doneCode);
this.saveAllPublic(doneCode, this.getBusiParam());
}
/**
* 保存支付信息
* @throws Exception
*/
public void savePay(CFeePayDto pay, String[] feeSn) throws Exception{
String cust_id=pay.getCust_id();
//用户锁
doneCodeComponent.lockCust(cust_id);
//查询未支付业务
//List<CDoneCodeUnpay> upPayDoneCodes=doneCodeComponent.queryUnPayList(cust_id);
//数据验证
List<FeeDto> feeList=this.checkCFeePayParam(pay,feeSn,cust_id);
Integer done_code=doneCodeComponent.gDoneCode();
//保存支付记录
feeComponent.savePayFeeNew(pay,cust_id,done_code);
//更新缴费信息状态、支付方式和发票相关信息(未打印)
feeComponent.updateCFeeToPay(feeList, pay);
//更新订单费用的费用类型(新订购记录才有需要处理)
orderComponent.updateOrderFeeTypeByPayType(feeList, pay.getPay_type());
//更新订单的支付状态
updateOrderIsPay(feeList,cust_id,SystemConstants.BOOLEAN_TRUE,this.getBusiParam().getBusiCode());
//删除未支付业务信息
doneCodeComponent.deleteDoneCodeUnPay(feeList);
//保存业务流水
this.saveAllPublic(done_code, this.getBusiParam());
}
/**
* 检查支付参数
* @param cust_id
* @throws Exception
*/
private List<FeeDto> checkCFeePayParam(CFeePayDto pay,String[] feeSns,String cust_id) throws Exception{
//参数不能为空
if(feeSns==null||feeSns.length==0||StringHelper.isEmpty(cust_id)||pay.getExchange()==null
||pay.getUsd()==null||pay.getKhr()==null||this.getBusiParam().getCust()==null
||StringHelper.isEmpty(pay.getPay_type())
){
throw new ServicesException(ErrorCode.ParamIsNull);
}
//串数据判断
if(!cust_id.equals(this.getBusiParam().getCust().getCust_id())){
throw new ServicesException(ErrorCode.CustDataException);
}
//验证汇率是否一致
//List list=MemoryDict.getDicts(DictKey.EXCHANGE,DictKey.ex);
Integer exchange=tExchangeDao.getExchange();
if(exchange==null||exchange<=0){
throw new ServicesException(ErrorCode.ExchangeConfigError);
}
if(!exchange.equals(pay.getExchange())){
throw new ServicesException(ErrorCode.UnPayIsOld);
}
//验证支付金额和待支付金额是否一致
int payFee=pay.getUsd()+Math.round(pay.getKhr()*1.0f/exchange);
List<FeeDto> feeList=feeComponent.queryUnPayFeeDtoByFeeSn(feeSns);
int needPayFee=0;
for(FeeDto fee:feeList){
if(fee==null){
//费用不存在
throw new ServicesException(ErrorCode.ParamIsNull);
}else if(!fee.getStatus().equals(StatusConstants.UNPAY)){
//费用已支付
throw new ServicesException(ErrorCode.UnPayIsOld);
}
/**不再验证
if(StringHelper.isNotEmpty(fee.getAcctitem_id())&&
!fee.getAcctitem_id().equals(SystemConstants.ACCTITEM_PUBLIC_ID)
&&fee.getReal_pay()!=0
&&StringHelper.isEmpty(fee.getProd_sn())){
//非公用账目的订购产品费,如果没有对应订单记录prod_sn,则报错
throw new ServicesException(ErrorCode.CFeeAndProdOrderIsNotOne);
}**/
needPayFee=needPayFee+fee.getReal_pay();
fee.setBusi_optr_id(pay.getBusi_optr_id());
}
//int needPayFee=feeComponent.queryUnPaySum(cust_id,this.getOptr().getOptr_id()).get("FEE").intValue();
if(payFee!=needPayFee){
throw new ServicesException(ErrorCode.UnPayIsOld);
}
pay.setFee(needPayFee);
//四舍五入部分
pay.setCos((needPayFee-pay.getUsd())*exchange-pay.getKhr());
return feeList;
}
/**
* 保存支付信息
* @param busiParam
* @param doneCode
* @return
* @throws Exception
*/
/**
* 更新产品订单的支付属性
* @param unPayDoneCodes
* @param cust_id
* @param done_code
* @throws Exception
*/
private void updateOrderIsPay(List<FeeDto> feeList,String cust_id,String is_pay,String busiCode) throws Exception{
//被支付的订单SN
Set<String> payOrderSnSet=new HashSet<String>();
for(FeeDto fee:feeList){
if(StringHelper.isNotEmpty(fee.getProd_sn())
&&fee.getReal_pay()>0
&&!BusiCodeConstants.ORDER_EDIT.equals(busiCode)){
payOrderSnSet.add(fee.getProd_sn());
}
}
//查询待支付的订单(含套餐和套餐子产品)
for(CProdOrder order:cProdOrderDao.queryUnPayOrder(cust_id)){
if(!payOrderSnSet.contains(order.getOrder_sn())&&
!payOrderSnSet.contains(order.getPackage_sn())){
continue;
}
//更改订单支付属性
cProdOrderDao.updateOrderToPay(order.getOrder_sn(), cust_id,is_pay);
}
}
/**
* 根据用户类型查询一次性费用信息
* @param feeType 预收费
* @return
* @throws Exception
*/
public List<TBusiFee> queryUnitpreBusiFee() throws Exception {
return feeComponent.queryUnitpreBusiFee();
}
/**
* 预付款
* @param dto
* @param optr
* @throws Exception
*/
public void saveFeeUnitpre(CFeeUnitpre dto,SOptr optr) throws Exception {
//获取业务流水
// Integer doneCode = doneCodeComponent.gDoneCode();
// String busiCode = getBusiParam().getBusiCode();
// CFee fee = feeComponent.saveFeeUnitpre(dto,optr,null,doneCode,busiCode);
// String[] feeSns = {fee.getFee_sn()};
// printComponent.saveDoc(feeComponent.queryAutoMergeFees(feeSns), null,
// doneCode, getBusiParam().getBusiCode());
//
// doneCodeComponent.saveDoneCode(doneCode,getBusiParam());
}
/**
* 查询同一地区类的所有预付款
* @param countyId
* @return
* @throws Exception
*/
public List<CFeeUnitpre> queryFeeUnitpre(String countyId) throws Exception {
return feeComponent.queryFeeUnitpre(countyId);
}
public List<RInvoice> checkInvoice(String invoiceId,String docType,String invoiceMode)
throws Exception {
return invoiceComponent.checkInvoice(invoiceId, docType, invoiceMode);
}
public List<CFee> queryFeeByInvoice(String invoiceCode, String invoiceId,String custId)
throws JDBCException {
return feeComponent.queryFeeByInvoice(invoiceCode, invoiceId,custId);
}
/**
* 保存支付信息
public void savePay(CFeePayDto pay, String[] feeSn) throws Exception {
Integer doneCode = doneCodeComponent.gDoneCode();
feeComponent.savePayFee(pay, feeSn, getBusiParam().getCust()
.getCust_id(), doneCode);
if (pay.getInvoice_mode().equals(SystemConstants.INVOICE_MODE_MANUAL)){
feeComponent.saveManualInvoice(feeSn, pay
.getInvoice_code(), pay.getInvoice_id(), pay
.getInvoice_book_id());
invoiceComponent.useInvoice(pay.getInvoice_code(), pay
.getInvoice_id(), SystemConstants.INVOICE_MODE_MANUAL, 0);
}
//更新账目余额
// payAcctFee(doneCode, feeSn, pay.getPay_type());
saveAllPublic(doneCode,getBusiParam());
}
*/
/**
* 冲正
*/
public void saveCancelFee(String feeSn) throws Exception {
Integer doneCode = doneCodeComponent.gDoneCode();
String busiCode = getBusiParam().getBusiCode();
String custId = getBusiParam().getCust().getCust_id();
// 查找费用信息
CFee fee = feeComponent.queryBySn(feeSn);
//如果是协议缴费,必须等销帐完成才能冲正
if(BusiCodeConstants.ACCT_PAY_ZERO.equals(fee.getBusi_code())){
JCustWriteoff jCustWriteOff = jobComponent.queryWriteOff(fee.getCreate_done_code());
if(null != jCustWriteOff){
throw new ServicesException("销账完成才能冲正");
}
}
CFeePay feePay = feeComponent.queryCFeePaybyFeeSn(fee.getFee_sn());
// if(StringHelper.isNotEmpty(feePay.getReceipt_id())){
// //冲正流水对应的费用
// List<CFee> feeList = feeComponent.queryByDoneCode(fee.getCreate_done_code());
// for (CFee unitpreFee:feeList){
// if (unitpreFee.getStatus().equals(StatusConstants.PAY))
// cancelFee(doneCode, busiCode, unitpreFee);
// else {
// if (unitpreFee.getFee_type().equals(SystemConstants.FEE_TYPE_ACCT)){
// cancelFee(doneCode, busiCode, unitpreFee);
// }
// feeComponent.removeFee(unitpreFee.getFee_sn());
// }
// }
// }else
if(BusiCodeConstants.Unit_ACCT_PAY.equals(fee.getBusi_code())){//如果是单位批量缴费中的某一笔
List<CFee> feeList = feeComponent.queryByDoneCode(fee.getCreate_done_code());
for (CFee cFee : feeList) {
cancelFee(doneCode, busiCode, cFee);
}
}else if(BusiCodeConstants.PROM_ACCT_PAY.equals(fee.getBusi_code())){//如果是套餐缴费中的某一笔
//回退套餐缴费
cancelPromPay(doneCode,fee.getCreate_done_code(),busiCode,custId);
}else{
cancelFee(doneCode, busiCode, fee);
}
//如果是银行批扣,需要把钱退回到客户的银行账户
if (feePay.getPay_type().equals(SystemConstants.PAY_TYPE_BANK_DEDU)){
CBankReturn bankRetrun = cBankReturnDao.findByKey(feePay.getReceipt_id());
bankRetrun.setPay_status(StatusConstants.CANCEL);
bankRetrun.setPay_failure_reason("缴费记录被冲正");
cBankReturnDao.update(bankRetrun);
CBankReturnPayerror bankError = new CBankReturnPayerror();
BeanUtils.copyProperties(bankRetrun, bankError);
bankError.setCreate_time(null);
bankError.setCancel_done_code(""+doneCode);
//查找扣款时的费用名称
CBankGotodisk kf= cBankGotodiskDao.findByKey(bankRetrun.getTrans_sn());
bankError.setBank_fee_name(kf.getBank_fee_name());
cBankReturnPayerrorDao.save(bankError);
}
//创建返销帐任务
jobComponent.createCustWriteOffJob(doneCode, custId, SystemConstants.BOOLEAN_FALSE);
jobComponent.createAcctModeCalJob(doneCode, custId);
saveAllPublic(doneCode,getBusiParam());
}
/**
* 修改费用
*/
public void editFee(int busiDoneCode, List<FeeBusiFormDto> feeList) throws Exception {
Integer doneCode = doneCodeComponent.gDoneCode();
String busiCode = getBusiParam().getBusiCode();
//查找流水详细信息以及用户详细信息
List<CDoneCodeDetail> detailList = doneCodeComponent.queryDetail(busiDoneCode);
CCust cust = getBusiParam().getCust();
List<CUser> userList = userComponent.queryUserByCustId(cust.getCust_id());
for (int i=userList.size()-1;i>=0;i--){
CUser user = userList.get(i);
boolean flag=false;
for (CDoneCodeDetail detail:detailList){
if (user.getUser_id().equals(detail.getUser_id())){
flag = true;
break;
}
}
if (!flag)
userList.remove(i);
}
if(feeList.size()>0){
//出入未支付业务
doneCodeComponent.saveDoneCodeUnPay(cust.getCust_id(), doneCode, this.getOptr().getOptr_id());
}
//检查是否存在未支付 busicode = 1108,1109,可以使用取消支付 功能
CDoneCode cd = doneCodeComponent.queryByKey(busiDoneCode);
boolean isCanDoDevice = false;
if(cd.getBusi_code().equals(BusiCodeConstants.DEVICE_BUY_PJ) || cd.getBusi_code().equals(BusiCodeConstants.DEVICE_BUY_PJ_BACTH)){
List<FeeDto> unPayList = feeComponent.queryUnPay(getBusiParam().getCust().getCust_id(),this.getOptr().getOptr_id());
for(FeeDto dto : unPayList){
if(dto.getBusi_code().equals(BusiCodeConstants.DEVICE_BUY_PJ) || dto.getBusi_code().equals(BusiCodeConstants.DEVICE_BUY_PJ_BACTH)){
throw new ServicesException(ErrorCode.EditFeeUnPayError);
}
}
isCanDoDevice = true;
}
for (FeeBusiFormDto feeDto:feeList){
if (feeDto.getFee_type().equals(SystemConstants.FEE_TYPE_BUSI) || feeDto.getFee_type().equals(SystemConstants.FEE_TYPE_CONTRACT)){
String payType = SystemConstants.PAY_TYPE_UNPAY;
if(null != getBusiParam().getPay()){
payType = getBusiParam().getPay().getPay_type();
}
feeComponent.saveBusiFee(cust.getCust_id(), StringHelper.isEmpty(feeDto.getAddr_id())?getBusiParam().getCust().getAddr_id():feeDto.getAddr_id(),
feeDto.getFee_id(), 1,payType, feeDto.getReal_pay(),
doneCode, busiDoneCode, busiCode, userList,null);
} else {
//根据donecode和fee_id查找设备信息
List<CFeeDevice> devices = feeComponent.queryDeviceByDoneCodeAndFeeStdId(busiDoneCode, feeDto.getFee_id(), feeDto.getFee_std_id());
String payType = SystemConstants.PAY_TYPE_UNPAY;
if (this.getBusiParam().getPay()!= null && this.getBusiParam().getPay().getPay_type() !=null)
payType = this.getBusiParam().getPay().getPay_type();
for(CFeeDevice device : devices){
feeComponent.saveDeviceFee(cust.getCust_id(),cust.getAddr_id(), feeDto.getFee_id(), device.getFee_std_id(),payType,
device.getDevice_type(), device.getDevice_id(),
device.getDevice_code(), device.getPair_card_id(),
device.getPair_card_code(), device.getPair_modem_id(),
device.getPair_modem_code(),device.getDevice_model(), feeDto.getReal_pay(),
doneCode,busiDoneCode, busiCode, feeDto.getBuy_num());
//配件处理数量
if(isCanDoDevice){
//回退配件库存,修改费用的话,buy_num大于0=再次购买配件,总数要-buy_num;小于0= 退回总数
if(feeDto.getBuy_num() != 0){
device.setBuy_num(-1*feeDto.getBuy_num());
deviceComponent.updateDeviceNum(device);
}
}
}
}
}
saveAllPublic(doneCode,getBusiParam());
}
public void changeFeelistInvoice(String custId, String feelistId, String feelistCode,
String feelistBookId, String invoiceId, String invoiceCode, String remark) throws Exception {
Integer doneCode = doneCodeComponent.gDoneCode();
invoiceComponent.changeFeelistInvoice(doneCode, getBusiParam()
.getCust().getCust_id(), feelistId, feelistCode, feelistBookId,
invoiceId, invoiceCode, remark);
saveAllPublic(doneCode,getBusiParam());
}
/**
* 作废发票
* @param invoice_id
* @param invoice_code
* @param doneCode
* @throws Exception
*/
private void invalidInvoiceByinvoiceId(String invoice_id, String invoice_code,Integer doneCode) throws Exception{
List<CFee> list=feeComponent.queryFeeByInvoice(invoice_code, invoice_id);
String optrId=this.getOptr().getOptr_id();
Map<String,CFeePay> payMap=new HashMap<>();
for(CFee cfee:list){
if(payMap.containsKey(cfee.getPay_sn())){
continue;
}
CFeePay pay=feeComponent.queryCFeePayByPaySn(cfee.getPay_sn());
if(!BusiCodeConstants.SUPER_CANCEL_PAY.equals(this.getBusiParam().getBusiCode())
&&!optrId.equals(pay.getOptr_id())){
throw new ServicesException(ErrorCode.InvoiceIsNotYou);
}
payMap.put(cfee.getPay_sn(), pay);
}
//检查发票状态是否缴销
RInvoice invoice= invoiceComponent.queryById(invoice_id, invoice_code);
if(!BusiCodeConstants.SUPER_CANCEL_PAY.equals(this.getBusiParam().getBusiCode())
&&!optrId.equals(invoice.getOptr_id())){
throw new ServicesException(ErrorCode.InvoiceIsNotYou);
}
if(!StatusConstants.IDLE.equals(invoice.getFinance_status())){
throw new ServicesException(ErrorCode.InvoiceCheckStatusIsNotIdle);
}
invoiceComponent.invalidInvoiceAndClearFeeInfo(doneCode, invoice_id, invoice_code);
//插入费用记录未打印
for(CFee cfee:list){
cFeeUnprintDao.insertByUnPayDoneCode(cfee.getFee_sn(), optrId);
}
}
/**
* 作废发票
* 只有开票人可以作废自己的发票,且发票未上交的情况下
*/
public void invalidInvoice(String invoice_id, String invoice_code,
String invoice_book_id)throws Exception{
Integer doneCode = doneCodeComponent.gDoneCode();
invalidInvoiceByinvoiceId(invoice_id,invoice_code,doneCode);
//this.saveAllPublic(doneCode, this.getBusiParam());
}
public void invalidFeeListInvoice(Integer feeDoneCode) throws Exception {
Integer doneCode = doneCodeComponent.gDoneCode();
invoiceComponent.invalidFeeListInvoice(feeDoneCode);
saveAllPublic(doneCode,getBusiParam());
}
/**
* 保存费用并合并打印项
* @throws Exception
*/
public void savePayAndMerge(CFeePayDto pay,String[] feeSn) throws Exception{
savePay(pay, feeSn);
// if (pay.getInvoice_mode().equals(SystemConstants.INVOICE_MODE_AUTO))
// printComponent.saveDoc(feeComponent.queryAutoMergeFees(feeSn),
// getBusiParam().getCust().getCust_id(), getBusiParam()
// .getDoneCode(), getBusiParam().getBusiCode());
}
public CFee queryFeeInfo(String feeSn) throws Exception {
return feeComponent.queryBySn(feeSn);
}
/**
* 查询客户下所有没有支付的费用项
*/
public List<FeeDto> queryUnPayFees(String custId)
throws Exception {
return feeComponent.queryUnPayFees(custId);
}
/**
* 查询指定客户下未合并的费用项
* @param custId 客户编号
*/
public List<MergeFeeDto> queryUnMergeFees(String custId)throws Exception {
return feeComponent.queryUnMergeFees(custId);
}
public Map<String, Object> queryFeeView(String custId)throws Exception{
return feeComponent.queryFeeView(custId);
}
public void saveDepositUnPay(String feeSn) throws Exception {
Integer doneCode = doneCodeComponent.gDoneCode();
String busiCode = getBusiParam().getBusiCode();
//查找费用信息
CFee fee = feeComponent.queryBySn(feeSn);
if (fee.getFee_type().equals(SystemConstants.FEE_TYPE_BUSI)) {
feeComponent.updateFeeDepositStatus(feeSn);
CFeeBusi feeBusi = feeComponent.queryFeeBusiBySn(feeSn);
String newfeesn = feeComponent.saveBusiFee(fee.getCust_id(),getBusiParam().getCust().getAddr_id(), fee.getFee_id(), fee
.getReal_pay()
* -1, doneCode, fee.getBusi_done_code(), busiCode, feeBusi);
feeComponent.updateFeePayStatus(newfeesn);
}
saveAllPublic(doneCode,getBusiParam());
}
/* (non-Javadoc)
* @see com.ycsoft.business.service.IPayService#editInvoiceMode(java.lang.String, java.lang.String)
*/
public void editInvoiceMode(String feeSn, String invoiceMode,
CInvoiceDto oldInvoice,CInvoiceDto newInvoice,Integer realPay)
throws Exception {
Integer doneCode = doneCodeComponent.gDoneCode();
invoiceComponent.editInvoiceMode(feeSn,invoiceMode, oldInvoice, newInvoice,realPay,doneCode);
String optrId = getOptr().getOptr_id();
//重载操作员未打印的费用
List<String> feeSnList = feeComponent.queryUnPrintFeeByOptr(optrId);
MemoryPrintData.reloadOptrFee(optrId, feeSnList);
saveAllPublic(doneCode,getBusiParam());
}
/**
* 定额发票调账
*/
public void editInvoiceFee(String feeSn, int newInvoiceFee, String remark) throws Exception{
Integer doneCode = doneCodeComponent.gDoneCode();
feeComponent.editInvoiceFee(feeSn,newInvoiceFee);
if(StringHelper.isNotEmpty(remark)){
getBusiParam().setRemark(remark);
}
saveAllPublic(doneCode,getBusiParam());
}
/**
* 限制暂时去掉了.
* 当一个合同款是预收款合同时,修改账务日期时,要验证该支付记录对应的金额是否被使用,被使用则不允许修改.
* @param leftAmount
* @param list
* @return
* @throws Exception
*/
private boolean shouldEditAcctDate(Integer leftAmount,List<CGeneralContractPay> list) throws Exception{
Integer allAmount = 0;
for(CGeneralContractPay cp:list){
allAmount += cp.getFee();
}
return allAmount >= leftAmount;
}
/**
* 如果合同收款修改账目日期,查看是否有分期付款信息,然后每个单笔的也要进行修改.
*/
public void editAcctDate(String feeSn, String newAcctDate, String oldAcctDate, String contractId, String leftAmountStr) throws Exception {
if(StringHelper.isNotEmpty(contractId)){//合同款分期付款
CGeneralContractPay contractFeeInfo = new CGeneralContractPay();
contractFeeInfo.setFee_sn(feeSn);
List<CGeneralContractPay> payInfo = acctComponent.queryPayInfo(contractId,null,null).getRecords();//有fee_sn
payInfo.add(contractFeeInfo);
String[] feeSns = CollectionHelper.converValueToArray(payInfo, "fee_sn");
List<CFee> rawFeeList = feeComponent.queryFeeListBySns(feeSns);//原始值,还需要处理
/*
Map<String, CFee> feeMapedBySn = CollectionHelper.converToMapSingle(rawFeeList, "fee_sn");
payInfo.remove(payInfo.size()-1);
List<CFee> feeList = new ArrayList<CFee>();
//预收款合同时
Integer leftAmount = Integer.parseInt(leftAmountStr);
if(rawFeeList.get(rawFeeList.size()-1).getFee_type().equals("UNITPRE")){
int length = payInfo.size();
for(int index = 0;index<length;index++){
CGeneralContractPay cf = payInfo.get(index);
if(shouldEditAcctDate(leftAmount,payInfo.subList(index, length))){
feeList.add(feeMapedBySn.get(cf.getFee_sn()));
}
}
feeList.add(feeMapedBySn.get(feeSn));
}else{
feeList = rawFeeList;
}
*/
batchEditAcctDate(rawFeeList, newAcctDate);
}else{
Integer doneCode = doneCodeComponent.gDoneCode();
invoiceComponent.editAcctDate(feeSn,newAcctDate);
List<CFeePropChange> propList = new ArrayList<CFeePropChange>();
CFeePropChange prop = new CFeePropChange();
prop.setFee_sn(feeSn);
prop.setColumn_name("acct_date");
prop.setOld_value(oldAcctDate);
prop.setNew_value(newAcctDate);
prop.setDone_code(doneCode);
propList.add(prop);
feeComponent.saveFeePropChange(propList);
saveAllPublic(doneCode,getBusiParam());
}
}
/**
* 批量修改账目日期
* @param feeSns
* @param acctDate
* @throws Exception
*/
public void batchEditAcctDate(List<CFee> feeList, String acctDate) throws Exception {
List<CFeePropChange> propList = new ArrayList<CFeePropChange>();
for(CFee fee : feeList){
Integer doneCode = doneCodeComponent.gDoneCode();
doneCodeComponent.saveDoneCode(doneCode,BusiCodeConstants.EDIT_ACCT_DATE, "", fee.getDept_id(),
fee.getCounty_id(), fee.getArea_id(),fee.getCust_id(), null);
CFeePropChange prop = new CFeePropChange();
prop.setFee_sn(fee.getFee_sn());
prop.setColumn_name("acct_date");
prop.setOld_value(DateHelper.dateToStr(fee.getAcct_date()));
prop.setNew_value(acctDate);
prop.setDone_code(doneCode);
propList.add(prop);
fee.setAcct_date(DateHelper.strToDate(acctDate));
}
feeComponent.updateFees(feeList);
feeComponent.saveFeePropChange(propList);
}
/* (non-Javadoc)
* @see com.ycsoft.business.service.IPayService#queryValidFeeList(java.util.List)
*/
public void queryValidFeeList(List<PayDto> feeList) throws Exception {
if(null != feeList && feeList.size() > 0){
feeList.remove(0);
if(feeList.size() > 1000){
throw new ServicesException("表格数据请不要超过1000行");
}else if(feeList.size() == 0 ){
throw new ServicesException("表格数据是空的");
}
}else{
throw new ServicesException("表格数据是空的");
}
invoiceComponent.queryValidFeeList(feeList);
}
/**
* 移动结帐
* @param payList
*/
public int saveCheckMobileBill(List<PayDto> payList) throws Exception{
List<CFee> mobileFee = new ArrayList<CFee>();
List<CProdMobileBill> mobileBillList = new ArrayList<CProdMobileBill>();
List<CFeePropChange> propList = new ArrayList<CFeePropChange>();
CFeePropChange prop = null;
for (PayDto payDto : payList) {
if(payDto.getFee() > 0){
//查找设置费用信息
List<CFee> feeList = feeComponent.queryByDoneCode(payDto.getDone_code());
for (CFee fee : feeList) {
if(fee.getUser_id().equals(payDto.getUser_id()) && fee.getAcctitem_id().equals(payDto.getAcctitem_id())
&& fee.getReal_pay().equals(payDto.getFee()) && fee.getStatus().equals(SystemConstants.PAY_TYPE_UNPAY)){
Integer doneCode = doneCodeComponent.gDoneCode();
//记录异动
prop = new CFeePropChange();
prop.setFee_sn(fee.getFee_sn());
prop.setColumn_name("pay_type");
prop.setOld_value(fee.getPay_type());
prop.setNew_value(SystemConstants.PAY_TYPE_CASH);
prop.setDone_code(doneCode);
propList.add(prop);
prop = new CFeePropChange();
prop.setFee_sn(fee.getFee_sn());
prop.setColumn_name("status");
prop.setOld_value(fee.getStatus());
prop.setNew_value(StatusConstants.PAY);
prop.setDone_code(doneCode);
propList.add(prop);
fee.setStatus(StatusConstants.PAY);
fee.setPay_type(SystemConstants.PAY_TYPE_CASH);
fee.setIs_doc(SystemConstants.BOOLEAN_TRUE);
fee.setInvoice_id(payDto.getInvoice_id());
fee.setInvoice_book_id(payDto.getInvoice_book_id());
fee.setInvoice_mode(SystemConstants.INVOICE_MODE_MANUAL);
fee.setInvoice_code(payDto.getInvoice_code());
mobileFee.add(fee);
//更新发票金额
invoiceComponent.useInvoice(payDto.getInvoice_code(), payDto.getInvoice_id(), SystemConstants.INVOICE_MODE_MANUAL, payDto.getFee());
//保存结账明细
CProdMobileBill mobileBill = new CProdMobileBill();
BeanUtils.copyProperties(payDto, mobileBill);
mobileBill.setCreate_done_code(doneCode);
mobileBillList.add(mobileBill);
//修改账目余额,未结账资金转成现金
acctComponent.changeAcctItemBanlance(doneCode, BusiCodeConstants.CHECK_MOBILE_BILL,
fee.getCust_id(), fee.getAcct_id(), fee.getAcctitem_id(), SystemConstants.ACCT_CHANGE_CHECKMOBILE, SystemConstants.ACCT_FEETYPE_UNPAY, -fee.getReal_pay(), null);
acctComponent.changeAcctItemBanlance(doneCode, BusiCodeConstants.CHECK_MOBILE_BILL,
fee.getCust_id(), fee.getAcct_id(), fee.getAcctitem_id(), SystemConstants.ACCT_CHANGE_CHECKMOBILE, SystemConstants.ACCT_FEETYPE_CASH, fee.getReal_pay(), null);
//销账任务
jobComponent.createCustWriteOffJob(doneCode, fee.getCust_id(), SystemConstants.BOOLEAN_TRUE);
//保存流水
saveDoneCode(doneCode, BusiCodeConstants.CHECK_MOBILE_BILL, fee.getCust_id());
}
}
}
}
//更新费用信息
if(mobileFee.size() > 0){
feeComponent.updateFees(mobileFee);
feeComponent.saveFeePropChange(propList);
feeComponent.saveMoblieBill(mobileBillList);
}
return mobileFee.size();
}
/* (non-Javadoc)
* 根据银行交易流水号查询C_Fee费用信息
* @see com.ycsoft.business.service.IPayService#queryFeeByBankTransCode(java.lang.String, java.lang.String)
*/
public List<CFee> queryFeeByBankTransCode(String startTransCode,String endTransCode,String countyId) throws JDBCException {
// TODO Auto-generated method stub
return feeComponent.queryFeeByBankTransCode(startTransCode,endTransCode,countyId);
}
public CFee editBusiOptr(String feeSn,String newBusiOptrId,String oldBusiOptrId) throws Exception {
CFee fee = feeComponent.editBusiOptr(feeSn, newBusiOptrId);
Integer doneCode = doneCodeComponent.gDoneCode();
BusiParameter p = getBusiParam();
p.setRemark("旧业务员:" + MemoryDict.getDictName(DictKey.OPTR, oldBusiOptrId)
+ " 新业务员:" + (fee.getBusi_optr_name()==null?"":fee.getBusi_optr_name()));
saveAllPublic(doneCode,p);
return fee;
}
/* (non-Javadoc)
* @see com.ycsoft.business.service.IPayService#editRemark(int, java.lang.String)
*/
public void editRemark(int doneCode, String remark) throws Exception {
doneCodeComponent.editRemark(doneCode, remark);
Integer d = doneCodeComponent.gDoneCode();
BusiParameter p = getBusiParam();
if(null != p)
p.setRemark(String.valueOf(doneCode));
saveAllPublic(d, p);
}
/**
* 标记打印
*/
public void savePrintStatus(String fee_sn) throws Exception {
CFee fee = feeComponent.queryBySn(fee_sn);
if(BusiCodeConstants.PROM_ACCT_PAY.equals(fee.getBusi_code())){
feeComponent.updateIsDocByDoneCode(fee.getCreate_done_code(),SystemConstants.BOOLEAN_NO);
}else{
feeComponent.savePrintStatus(fee_sn);
cFeeUnprintDao.remove(fee_sn);
}
String optrId = getOptr().getOptr_id();
//重载操作员未打印的费用
//List<String> feeSnList = feeComponent.queryUnPrintFeeByOptr(optrId);
//MemoryPrintData.reloadOptrFee(optrId, feeSnList);
Integer doneCode = doneCodeComponent.gDoneCode();
BusiParameter p = getBusiParam();
this.getBusiParam().setOperateObj(fee.getAcctitem_id_text()+fee.getFee_id_text()+"(doneCode:"+fee.getCreate_done_code()+" feeSn:"+fee_sn+")");
saveAllPublic(doneCode,p);
}
/**
* 取消标记
*/
public void saveCancelPrintStatus(String fee_sn) throws Exception {
CFee fee = feeComponent.queryBySn(fee_sn);
if(BusiCodeConstants.PROM_ACCT_PAY.equals(fee.getBusi_code())){
feeComponent.updateIsDocByDoneCode(fee.getCreate_done_code(),SystemConstants.BOOLEAN_FALSE);
}else{
feeComponent.saveCancelPrintStatus(fee_sn);
}
String optrId = getOptr().getOptr_id();
//重载操作员未打印的费用
//List<String> feeSnList = feeComponent.queryUnPrintFeeByOptr(optrId);
//MemoryPrintData.reloadOptrFee(optrId, feeSnList);
Integer doneCode = doneCodeComponent.gDoneCode();
this.getBusiParam().setOperateObj(fee.getAcctitem_id_text()+fee.getFee_id_text()+"(doneCode:"+fee.getCreate_done_code()+" feeSn:"+fee_sn+")");
BusiParameter p = getBusiParam();
saveAllPublic(doneCode,p);
}
public void setCBankReturnDao(CBankReturnDao cBankReturnDao) {
this.cBankReturnDao = cBankReturnDao;
}
public void setCBankReturnPayerrorDao(
CBankReturnPayerrorDao cBankReturnPayerrorDao) {
this.cBankReturnPayerrorDao = cBankReturnPayerrorDao;
}
public void setCBankGotodiskDao(CBankGotodiskDao cBankGotodiskDao) {
this.cBankGotodiskDao = cBankGotodiskDao;
}
}