package com.ycsoft.sysmanager.component.resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;
import com.ycsoft.beans.core.voucher.CVoucher;
import com.ycsoft.beans.core.voucher.CVoucherDoneVoucherid;
import com.ycsoft.beans.core.voucher.CVoucherProcure;
import com.ycsoft.beans.core.voucher.CVoucherType;
import com.ycsoft.beans.system.SDept;
import com.ycsoft.beans.system.SOptr;
import com.ycsoft.business.dao.core.voucher.CVoucherDao;
import com.ycsoft.business.dao.core.voucher.CVoucherDoneVoucheridDao;
import com.ycsoft.business.dao.core.voucher.CVoucherProcureDao;
import com.ycsoft.business.dao.core.voucher.CVoucherTypeDao;
import com.ycsoft.business.dao.system.SDeptDao;
import com.ycsoft.business.dto.core.voucher.VoucherDto;
import com.ycsoft.business.dto.core.voucher.VoucherProcureDto;
import com.ycsoft.commons.abstracts.BaseComponent;
import com.ycsoft.commons.constants.StatusConstants;
import com.ycsoft.commons.constants.SystemConstants;
import com.ycsoft.commons.helper.StringHelper;
import com.ycsoft.daos.core.Pager;
@Component
public class VoucherComponent extends BaseComponent {
private CVoucherDao cVoucherDao;
private CVoucherTypeDao cVoucherTypeDao;
private CVoucherProcureDao cVoucherProcureDao;
private CVoucherDoneVoucheridDao cVoucherDoneVoucheridDao;
private SDeptDao sDeptDao;
public Pager<VoucherDto> queryMulitVoucher(VoucherDto voucherDto,
Integer start, Integer limit) throws Exception {
return cVoucherDao.queryMulitVoucher(voucherDto, start, limit);
}
/**
* 代金券失效
* @param voucherId
* @param countyId
* @throws Exception
*/
public void updateVoucherStatus(String voucherId) throws Exception {
cVoucherDao.updateVoucherStatus(voucherId);
}
/**
* 取消领用
* @param voucherIds
* @param countyId
* @throws Exception
*/
public void updateVoucherProcureStatus(String [] voucherIds,String countyId) throws Exception {
cVoucherDao.updateVoucherProcureStatus(voucherIds, countyId);
}
public Pager<CVoucher> queryProcureByDoneCode(Integer doneCode,
Integer start, Integer limit) throws Exception {
return cVoucherDao.queryProcureByDoneCode(doneCode, start, limit);
}
public List<SDept> queryFgsByDeptId(String countyId) throws Exception {
return sDeptDao.queryFgsByDeptId(countyId);
}
/**
* 生成代金券
* @param startVoucherId
* @param endVoucherId
* @param optr
* @throws Exception
*/
public boolean saveVoucher(VoucherDto voucherDto, SOptr optr) throws Exception {
long startVoucherId = Long.parseLong(voucherDto.getStart_voucher_id());
long endVoucherId = Long.parseLong(voucherDto.getEnd_voucher_id());
List<CVoucher> voucherList = cVoucherDao.queryVoucher(startVoucherId, endVoucherId, optr.getCounty_id());
if(voucherList == null || voucherList.size() == 0){
String optrId = optr.getOptr_id();
CVoucher voucher = null;
ArrayList<CVoucher> list = new ArrayList<CVoucher>();
for(long i=startVoucherId;i<=endVoucherId;i++){
voucher = new CVoucher();
BeanUtils.copyProperties(voucherDto, voucher);
voucher.setVoucher_id(String.valueOf(i));
voucher.setStatus(StatusConstants.IDLE);
voucher.setStatus_time(new Date());
voucher.setCreate_time(new Date());
voucher.setOptr_id(optrId);
voucher.setUnused_money(voucher.getVoucher_value());//生成时,未使用金额就是面额
list.add(voucher);
}
int num = cVoucherDao.save(list.toArray(new CVoucher[list.size()]))[0];
if (num>=0 || num == -2){
return true;
}
}
return false;
}
/**
* 查询代金券信息
* @param countyId
* @return
* @throws Exception
*/
public Pager<CVoucher> queryVoucher(String query, Integer start,
Integer limit, String countyId) throws Exception {
return cVoucherDao.queryVoucher(query, start, limit, countyId);
}
/**
* 领用代金券
* 只记录领用信息,并不变更代金券的适用地区
* @param voucherProduce
* @param voucherIds
* @param optrId
* @throws Exception
*/
public int saveVoucherProcure(VoucherProcureDto voucherProcureDto, SOptr optr) throws Exception {
CVoucherProcure voucherProduce = new CVoucherProcure();
long startVoucherId = Long.parseLong(voucherProcureDto.getStart_voucher_id());
long endVoucherId = Long.parseLong(voucherProcureDto.getEnd_voucher_id());
//空闲、未失效且未领用的代金券数量 可用的
List<CVoucher> idleList = cVoucherDao.queryIdleVoucher(startVoucherId,
endVoucherId, optr.getCounty_id());
int num = idleList.size();
if(num>0){
//在库的总数量
List<CVoucher> voucherList = cVoucherDao.queryVoucher(startVoucherId, endVoucherId, optr.getCounty_id());
int inSum = voucherList.size();
int noSum = inSum - num;//已经使用、失效和领用的代金券
voucherList.removeAll(idleList);
int usedSum = 0;//已经使用的数量
int procureSum = 0;//已领用的数量
for(CVoucher voucher : voucherList){
if(voucher.getStatus().equals(StatusConstants.USE)){
++usedSum;
}else if(voucher.getIs_procured().equals(SystemConstants.BOOLEAN_TRUE)){
++procureSum;
}
}
int invalidSum = noSum - usedSum - procureSum;//已经失效的数量
Integer doneCode = gDoneCode();
BeanUtils.copyProperties(voucherProcureDto, voucherProduce);
voucherProduce.setVoucher_done_code(doneCode);
voucherProduce.setOptr_id(optr.getOptr_id());
voucherProduce.setCount(idleList.size());
voucherProduce.setCreate_time(new Date());
voucherProduce.setCounty_id(optr.getCounty_id());
String remark = voucherProduce.getRemark();
remark = StringHelper.isNotEmpty(remark)?remark+"; ":remark;
long sum = endVoucherId - startVoucherId+1;//领用代金券总数
String str = startVoucherId + " 至 " + endVoucherId + " 共" + sum
+ "张代金券; " + optr.getOptr_name() + "; 成功领用" + num + "张; "
+ "失败领用" + (sum - num) + "张,包括( " + usedSum + "张已使用,"
+ procureSum + "张已领用," + invalidSum + "张已失效)";
voucherProduce.setRemark(remark+""+str);
CVoucherDoneVoucherid voucherid = null;
ArrayList<CVoucherDoneVoucherid> list = new ArrayList<CVoucherDoneVoucherid>();
for(CVoucher voucher : idleList){
voucherid = new CVoucherDoneVoucherid();
voucherid.setVoucher_done_code(doneCode);
voucherid.setVoucher_id(voucher.getVoucher_id());
list.add(voucherid);
voucher.setIs_procured(SystemConstants.BOOLEAN_TRUE);
}
cVoucherProcureDao.save(voucherProduce);
cVoucherDoneVoucheridDao.save(list.toArray(new CVoucherDoneVoucherid[list.size()]));
//领用后记录领用
cVoucherDao.update(idleList.toArray(new CVoucher[idleList.size()]));
}
return num;
}
public List<CVoucherType> queryVoucherTypes() throws Exception{
return cVoucherTypeDao.findAllTypes();
}
/**
* 维护代金券类型.
* @param list
* @throws Exception
*/
public void editVoucherType(CVoucherType vtype) throws Exception{
String voucher_type = vtype.getVoucher_type();
CVoucherType bean = cVoucherTypeDao.findByKey(voucher_type);
if(bean!=null){
cVoucherTypeDao.update(vtype);
}else{
cVoucherTypeDao.save(vtype);
}
}
/**
* 查询代金券领用记录
* @param countyId
* @param start
* @param limit
* @return
* @throws Exception
*/
public Pager<CVoucherProcure> queryVoucherProcure(String query, String countyId,
Integer start, Integer limit) throws Exception {
return cVoucherProcureDao.queryVoucherProcure(query, countyId, start, limit);
}
private Integer gDoneCode() throws Exception {
return Integer.parseInt(cDoneCodeDao.findSequence().toString());
}
public void setCVoucherDao(CVoucherDao voucherDao) {
cVoucherDao = voucherDao;
}
public void setCVoucherProcureDao(CVoucherProcureDao voucherProcureDao) {
cVoucherProcureDao = voucherProcureDao;
}
public void setCVoucherDoneVoucheridDao(
CVoucherDoneVoucheridDao voucherDoneVoucheridDao) {
cVoucherDoneVoucheridDao = voucherDoneVoucheridDao;
}
public void setSDeptDao(SDeptDao deptDao) {
sDeptDao = deptDao;
}
public void setCVoucherTypeDao(CVoucherTypeDao cVoucherTypeDao) {
this.cVoucherTypeDao = cVoucherTypeDao;
}
}