|
@@ -28,6 +28,7 @@ import javax.annotation.Resource;
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
import java.math.BigDecimal;
|
|
|
import java.math.BigInteger;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.time.format.DateTimeFormatter;
|
|
|
import java.util.*;
|
|
@@ -73,6 +74,12 @@ public class AmountWaterUsedAmountServiceImpl implements AmountWaterUsedAmountSe
|
|
|
@Resource
|
|
|
private SiteMapper siteMapper;
|
|
|
|
|
|
+ @Resource
|
|
|
+ PayMessagetemplateMapper payMessagetemplateMapper;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private PayMessagesendrecordServiceImp payMessagesendrecordServiceImp;
|
|
|
+
|
|
|
@Override
|
|
|
public Pagination<AmountWaterUsedAmountDto> getList(String condition, String accountNumber, String accountName, String meterCode, String address, Integer year, Integer month, Integer state,
|
|
|
Integer amountMin, Integer amountMax, Integer pageNum, Integer pageSize) {
|
|
@@ -717,4 +724,183 @@ public class AmountWaterUsedAmountServiceImpl implements AmountWaterUsedAmountSe
|
|
|
|
|
|
}
|
|
|
|
|
|
+ public Integer isEnable(Integer year,Integer month,BigInteger watermeterId,BigInteger waterPropertyId,Integer siteId,Integer customerId){
|
|
|
+ Integer isEnable = 1;
|
|
|
+ if(waterPropertyId != null){
|
|
|
+ //根据用水性质ID查找是否是阶梯
|
|
|
+ BaseWaterPropertyDto waterPropertyDto = baseWaterPropertyMapper.get(waterPropertyId,siteId,customerId);
|
|
|
+ Integer laddertype = waterPropertyDto.getLaddertype();
|
|
|
+ if(laddertype != null && laddertype == 0){
|
|
|
+ isEnable = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //月阶梯用户 新安装户相差天数>31天或者跨账期结算则非阶梯结算
|
|
|
+ if(isEnable>=1){
|
|
|
+ List<AmountWaterUsedAmountDto> amountWaterUsedAmounts = amountWaterUsedAmountMapper.getWaterUsedAmountByMeterId(watermeterId);
|
|
|
+ if(amountWaterUsedAmounts!=null && amountWaterUsedAmounts.size()>0){
|
|
|
+ AmountWaterUsedAmountDto theLastOne = null;
|
|
|
+ if(amountWaterUsedAmounts.size()>1){
|
|
|
+ //取最后一次已审核
|
|
|
+ theLastOne = amountWaterUsedAmounts.get(1);
|
|
|
+ if((theLastOne.getYear() - year) ==0){
|
|
|
+ //同年跨月
|
|
|
+ if(month-theLastOne.getMonth()>1){
|
|
|
+ isEnable =0;
|
|
|
+ }
|
|
|
+ }else if((year - theLastOne.getYear()) == 1){
|
|
|
+ if((month!= 1||theLastOne.getMonth()!= 12)){
|
|
|
+ isEnable =0;
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ //跨年
|
|
|
+ isEnable =0;
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ //新安装户,取安装时间比较
|
|
|
+ theLastOne = amountWaterUsedAmounts.get(0);
|
|
|
+ Date createDate = theLastOne.getInstalldate();
|
|
|
+ if(createDate!=null) {
|
|
|
+ Double sDay = DateTimeUtil.getDistanceOfTwoDate(createDate, new Date());
|
|
|
+ if (sDay > 31) {
|
|
|
+ isEnable = 0;
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ isEnable = 2;//异常
|
|
|
+ /* ajaxMessage.setMsg(-701,"水表设备"+amountWaterUsedAmount.getMetercode()+"安装时间为空");
|
|
|
+ return ajaxMessage;*/
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return isEnable;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void estimatedDay(Integer siteId,Integer customerId){
|
|
|
+ // createReceivable
|
|
|
+ //查询当前账期
|
|
|
+ Calendar calendar = Calendar.getInstance(); //得到日历
|
|
|
+ Date dNow = new Date(); //当前时间
|
|
|
+ calendar.setTime(dNow);//把当前时间赋给日历
|
|
|
+ calendar.add(Calendar.DAY_OF_MONTH, -1); //设置为前一天
|
|
|
+ String beforDate = new SimpleDateFormat("yyyyMMdd").format(calendar.getTime());//格式化前一天
|
|
|
+ //获取最新账期
|
|
|
+ BaseClosingAccountInfoDto baseClosingAccountInfoDto = baseClosingAccountInfoMapper.getLastClosingAccount(siteId,customerId);
|
|
|
+ //1.如果账期为空则取水表起度
|
|
|
+ //1.1.费用=(每天的止度-月用量)*单价
|
|
|
+ BigDecimal balance = BigDecimal.ZERO;
|
|
|
+ if(baseClosingAccountInfoDto != null){
|
|
|
+ //根据最新账期,水司进行统计每天
|
|
|
+ List<EstimatedDayDto> list = amountWaterUsedAmountMapper.getEstimatedDay(beforDate,baseClosingAccountInfoDto.getYear(),baseClosingAccountInfoDto.getMonth(),siteId,customerId);
|
|
|
+ if(list != null && list.size() > 0){
|
|
|
+ for(EstimatedDayDto dto:list){
|
|
|
+ BigDecimal dayReading = dto.getDayReading();
|
|
|
+ BigDecimal mReading = dto.getMReading();
|
|
|
+ String readdate = dto.getReaddate();
|
|
|
+ BigInteger waterPropertyId = dto.getWaterpropertyId();
|
|
|
+ BigInteger watermeterId = dto.getWatermeterId();
|
|
|
+ BigInteger accountId = dto.getAccountId();
|
|
|
+ PayRechargeaccountDto payRechargeaccountDto = payRechargeaccountMapper.findById(null,accountId);//查询预存账户
|
|
|
+ BigDecimal remaining = payRechargeaccountDto.getRemaining();//预存金额
|
|
|
+ //必须当天有数据,并且月结数据也有数据才进行计算
|
|
|
+ if(dayReading != null && mReading != null){
|
|
|
+ BigDecimal amount = dayReading.subtract(mReading);
|
|
|
+
|
|
|
+ Integer isEnable = this.isEnable(baseClosingAccountInfoDto.getYear(),baseClosingAccountInfoDto.getMonth(),watermeterId,waterPropertyId,siteId,customerId);
|
|
|
+ //isEnable 0非阶梯 1阶梯 2异常(不做处理)
|
|
|
+ if(isEnable ==0){
|
|
|
+ //非阶梯用水
|
|
|
+ BaseWaterProperty baseWaterProperty= baseWaterPropertyMapper.get(waterPropertyId,siteId,customerId);
|
|
|
+ List<PayBaseWaterprice> priceList = baseWaterPropertyMapper.getFeeInfo(waterPropertyId,1,customerId,siteId);
|
|
|
+ BigDecimal fee = BigDecimal.ZERO;
|
|
|
+ if (priceList!=null && priceList.size() > 0) {
|
|
|
+ for (PayBaseWaterprice info : priceList) {
|
|
|
+ // 应收费用=水量 * 价格
|
|
|
+ BigDecimal debt = amount.multiply(info.getPrice());
|
|
|
+ fee= fee.add(debt);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //预存余额-用水金额=用水余额
|
|
|
+ balance = remaining.subtract(fee);
|
|
|
+ }else if(isEnable == 1){
|
|
|
+ //阶梯用水
|
|
|
+ Integer debtFlag = 1;
|
|
|
+ PayBaseAccount payBaseAccount = payBaseAccountMapper.get(accountId);
|
|
|
+ debtFlag =payBaseAccount.getState();
|
|
|
+ int n = 4; //阶梯级别
|
|
|
+ BigDecimal fee = BigDecimal.ZERO;
|
|
|
+ for (int i = 1; i <= n; i++) {
|
|
|
+ BigDecimal availableAmount = new BigDecimal(0);
|
|
|
+ Object objAmount = ReflectionsUtil.getFieldValue(payBaseAccount, "availableamount" + i);
|
|
|
+ if (objAmount != null) {
|
|
|
+ availableAmount = new BigDecimal(objAmount.toString());
|
|
|
+ }
|
|
|
+ //阶梯结算水量
|
|
|
+ BigDecimal calAmount = BigDecimal.ZERO;
|
|
|
+ if (availableAmount.intValue() > 0) {
|
|
|
+ if (amount.intValue() == 0) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (amount.intValue() > availableAmount.intValue()) {
|
|
|
+ calAmount = availableAmount;
|
|
|
+ amount = amount.subtract(availableAmount);
|
|
|
+ } else {
|
|
|
+ calAmount = amount;
|
|
|
+ amount = BigDecimal.ZERO;
|
|
|
+ }
|
|
|
+ BaseWaterProperty baseWaterProperty= baseWaterPropertyMapper.get(waterPropertyId,siteId,customerId);
|
|
|
+ List<PayBaseWaterprice> priceList = baseWaterPropertyMapper.getFeeInfo(waterPropertyId,i,customerId,siteId);
|
|
|
+ if (priceList!=null && priceList.size() > 0) {
|
|
|
+ for (PayBaseWaterprice info : priceList) {
|
|
|
+ // 应收费用=水量 * 价格
|
|
|
+ BigDecimal debt = calAmount.multiply(info.getPrice());
|
|
|
+ fee= fee.add(debt);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //预存余额-用水金额=用水余额
|
|
|
+ balance = remaining.subtract(fee);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ payRechargeaccountMapper.updateBalance(balance,new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()),payRechargeaccountDto.getId());
|
|
|
+ //修改账户用水余额字段跟预计费日期
|
|
|
+ log.info("【"+payRechargeaccountDto.getAccountnumber()+"】户:用水余额:"+balance+",预计费日期:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ //取起度作为量(每天的用量-起度)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void estimateMsgSend(Integer siteId,Integer customerId){
|
|
|
+
|
|
|
+ PayMessageTemplateDto payMessageTemplateDto = new PayMessageTemplateDto();
|
|
|
+ payMessageTemplateDto.setSiteId(BigInteger.valueOf(siteId));
|
|
|
+ payMessageTemplateDto.setCustomerId(BigInteger.valueOf(customerId));
|
|
|
+ payMessageTemplateDto.setSendType(0);
|
|
|
+
|
|
|
+ //获取短信模板
|
|
|
+ PayMessageTemplateDto templateList= payMessagetemplateMapper.get(BigInteger.valueOf(siteId),BigInteger.valueOf(customerId),null,null);
|
|
|
+ if(templateList == null){
|
|
|
+ //获取短信模板失败,没查询到有效模板
|
|
|
+ throw new ServiceException(ResultStatus.MESSAGE_TEMPLATE_FAILED);
|
|
|
+ }
|
|
|
+ //获取最新账期
|
|
|
+ BaseClosingAccountInfoDto baseClosingAccountInfoDto=baseClosingAccountInfoMapper.getLastClosingAccount(siteId,customerId);
|
|
|
+ if(baseClosingAccountInfoDto == null){
|
|
|
+ throw new ServiceException(ResultStatus.ClOSING_ACCCOUNT_NOT_EXIT);
|
|
|
+ }
|
|
|
+ //根据站点跟客户ID查找出用水余额小于0用户
|
|
|
+ List<PayRechargeaccountDto> rechList = payRechargeaccountMapper.getEstimateBalance(siteId,customerId);
|
|
|
+ if(rechList != null && rechList.size() >0){
|
|
|
+ for(PayRechargeaccountDto dto: rechList){
|
|
|
+ PayBaseAccount account = payBaseAccountMapper.get(dto.getAccountId());
|
|
|
+ payMessagesendrecordServiceImp.sendEstimateMessage(BigInteger.valueOf(siteId),BigInteger.valueOf(customerId),templateList,baseClosingAccountInfoDto.getYear(),baseClosingAccountInfoDto.getMonth(),account);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ System.out.println("==============================>预计费短信推送成功<============================");
|
|
|
+ }
|
|
|
+
|
|
|
}
|