package com.mvc.service.impl; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.base.enums.RemoveType; import com.base.enums.RenoStatus; import com.mvc.dao.ReceiveNodeDao; import com.mvc.entity.Contract; import com.mvc.entity.ProjectStage; import com.mvc.entity.ReceiveNode; import com.mvc.entity.User; import com.mvc.repository.ContractRepository; import com.mvc.repository.ProjectStageRepository; import com.mvc.repository.ReceiveNodeRepository; import com.mvc.service.AlarmService; import com.mvc.service.ReceiveNodeService; import net.sf.json.JSONObject; /** * 收款节点业务层实现 * * @author wangrui * @date 2016-09-20 */ @Service("receiveNodeServiceImpl") public class ReceiveNodeServiceImpl implements ReceiveNodeService { @Autowired ReceiveNodeRepository receiveNodeRepository; @Autowired ReceiveNodeDao receiveNodeDao; @Autowired AlarmService alarmService; @Autowired ContractRepository contractRepository; @Autowired ProjectStageRepository projectStageRepository; // 添加收款节点 @Override public Boolean addReceiveNode(JSONObject jsonObject, Integer cont_id, User user) { ReceiveNode receiveNode = new ReceiveNode(); try { DateFormat format = new SimpleDateFormat("yyyy-MM-dd"); long time = System.currentTimeMillis(); if (jsonObject.containsKey("reno_time")) { Date date = format.parse(jsonObject.getString("reno_time"));// 收款截止时间 Calendar calendar = Calendar.getInstance(); calendar.setTime(date); receiveNode.setReno_time(date);// 节点截止时间 int days = 0; if (jsonObject.containsKey("reno_wday")) { days = Integer.parseInt(jsonObject.getString("reno_wday"));// 收款提醒天数 } receiveNode.setReno_wday(days);// 添加收款提醒的天数 calendar.add(Calendar.DAY_OF_MONTH, -days);// 收款结束提醒时间=收款截止时间-收款提醒天数 receiveNode.setReno_wtime(calendar.getTime());// 收款结束提醒时间 } if (jsonObject.containsKey("reno_content")) { receiveNode.setReno_content(jsonObject.getString("reno_content"));// 节点内容 } if (jsonObject.containsKey("reno_money")) { receiveNode.setReno_money(Float.parseFloat(jsonObject.getString("reno_money")));// 应收款金额 } receiveNode.setReno_state(0);// 是否已收款,默认未收款;0未收款,1已收款,2未付全款,3提前收到款 receiveNode.setReno_amoney((float) 0.00);// 实际收款金额 receiveNode.setReno_ctime(new Date(time));// 节点录入时间 receiveNode.setUser(user); Contract contract = contractRepository.selectContById(cont_id);// 所属合同 receiveNode.setContract(contract); receiveNode.setReno_isdelete(0);// 默认未删除 if (jsonObject.containsKey("projectStage")) { JSONObject tmp = (JSONObject) jsonObject.get("projectStage"); Integer prst_id = Integer.valueOf(tmp.getString("prst_id")); ProjectStage projectStage = projectStageRepository.findOne(prst_id);// 所属阶段 receiveNode.setProjectStage(projectStage); } } catch (ParseException e) { e.printStackTrace(); } // 写入数据库 receiveNode = receiveNodeRepository.saveAndFlush(receiveNode); if (receiveNode.getReno_id() != null) return true; else return false; } // 根据合同ID查找收款节点 @Override public List<ReceiveNode> selectRenoByContId(Integer cont_id) { return receiveNodeRepository.findByContId(cont_id); } // 根据ID查询收款节点 @Override public ReceiveNode findByRenoId(Integer reno_id) { return receiveNodeRepository.findOne(reno_id); } // 根据收款节点ID删除收款节点 @Override public Boolean deleteReno(Integer reno_id) { return receiveNodeDao.deleteReno(reno_id); } // 更新收款节点状态和金额 @Override public Boolean updateRenoStateAndMoney(Integer cont_id, Float remoAmoney) { List<ReceiveNode> renoList = receiveNodeRepository.findByContIdAndState(cont_id); float dvalue; ReceiveNode receiveNode = null; long time = System.currentTimeMillis();// 当前时间 for (int i = 0; i < renoList.size(); i++) { if (remoAmoney > 0) { receiveNode = renoList.get(i); dvalue = receiveNode.getReno_money() - receiveNode.getReno_amoney();// 差值=应收款-实收款 if (dvalue > remoAmoney) {// 若差值>本次确认金额 float nowMoney = remoAmoney + receiveNode.getReno_amoney(); receiveNodeDao.updateState(receiveNode.getReno_id(), RenoStatus.noEnough.value, nowMoney); break; } else {// 若差值<=本次确认金额 if (time < receiveNode.getReno_time().getTime()) {// 提前到款 receiveNodeDao.updateState(receiveNode.getReno_id(), RenoStatus.beyondActually.value, receiveNode.getReno_money()); } else {// 已付全款 receiveNodeDao.updateState(receiveNode.getReno_id(), RenoStatus.finish.value, receiveNode.getReno_money()); alarmService.updateByIdType(receiveNode.getReno_id(), RemoveType.RenoAlarm.value);// 解除报警 } if ((Math.abs(dvalue - remoAmoney) < 0.00000001)) {// 若差值=本次确认金额,跳出循环 break; } remoAmoney -= dvalue;// 本次确认金额-差值 } } else { break; } } return true; } // 修改收款节点 @Override public Boolean updateReno(JSONObject jsonObject, Integer reno_id) { ReceiveNode receiveNode = receiveNodeRepository.findOne(reno_id); if (jsonObject != null) { try { DateFormat format = new SimpleDateFormat("yyyy-MM-dd"); if (jsonObject.containsKey("reno_content")) { receiveNode.setReno_content(jsonObject.getString("reno_content"));// 节点内容 } if (jsonObject.containsKey("reno_money")) { receiveNode.setReno_money(Float.parseFloat(jsonObject.getString("reno_money")));// 应收款金额 } Date date = null; if (jsonObject.containsKey("reno_time")) { date = format.parse(jsonObject.getString("reno_time"));// 节点截止时间 receiveNode.setReno_time(date); } else { date = receiveNode.getReno_time(); } if (jsonObject.containsKey("reno_wday")) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); int days = Integer.parseInt(jsonObject.getString("reno_wday")); receiveNode.setReno_wday(days);// 收款提醒天数 calendar.add(Calendar.DAY_OF_MONTH, -days);// 收款提醒时间=节点截止时间-收款提醒天数 receiveNode.setReno_wtime(calendar.getTime());// 收款提醒时间 } if (jsonObject.containsKey("projectStage")) { JSONObject tmp = (JSONObject) jsonObject.get("projectStage"); Integer prst_id = Integer.valueOf(tmp.getString("prst_id")); ProjectStage projectStage = projectStageRepository.findOne(prst_id);// 所属阶段 receiveNode.setProjectStage(projectStage); } } catch (Exception e) { e.printStackTrace(); } } receiveNode = receiveNodeRepository.saveAndFlush(receiveNode); if (receiveNode.getReno_id() != null) return true; else return false; } }