package com.hai.service.impl; import com.hai.common.exception.ErrorCode; import com.hai.common.exception.ErrorHelp; import com.hai.common.exception.SysCode; import com.hai.common.security.AESEncodeUtil; import com.hai.common.security.UserCenter; import com.hai.common.utils.BankNumberUtil; import com.hai.dao.HighOilCardMapper; import com.hai.entity.*; import com.hai.enum_type.OilCardBindStatusEnum; import com.hai.enum_type.OilCardRecordTypeEnum; import com.hai.enum_type.OilCardStatusEnum; import com.hai.model.UserInfoModel; import com.hai.service.*; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.*; @Service("oilCardService") public class HighOilCardServiceImpl implements HighOilCardService { @Resource private HighOilCardMapper oilCardMapper; @Resource private HighOilCardContactRecordService oilCardContactRecordService; @Resource private HighOilCardRecordService oilCardRecordService; @Resource private BsOrganizationService organizationService; @Resource private BsCompanyService companyService; @Resource private HighCompanyAccountService companyAccountService; @Resource private UserCenter userCenter; @Override public void editData(HighOilCard oilCard) { if (oilCard.getId() == null) { oilCard.setCreateTime(new Date()); oilCard.setUpdateTime(new Date()); oilCard.setStatus(OilCardStatusEnum.status1.getStatus()); oilCard.setBindStatus(OilCardBindStatusEnum.status0.getStatus()); oilCardMapper.insert(oilCard); } else { oilCard.setUpdateTime(new Date()); oilCardMapper.updateByPrimaryKey(oilCard); } } @Override @Transactional(rollbackFor=Exception.class,isolation = Isolation.SERIALIZABLE,propagation= Propagation.REQUIRES_NEW) public synchronized void recharge(String cardNo, BigDecimal price, Long orgId) { HighOilCard oilCard = getOilCardByCardNo(cardNo); if (oilCard == null) { throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未找到部门"); } if (!oilCard.getStatus().equals(OilCardStatusEnum.status1.getStatus())) { throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "油卡不处于正常状态"); } // 账户扣款 Map consumeType = new HashMap<>(); consumeType.put("sourceType", "2"); consumeType.put("sourceId", oilCard.getId()); consumeType.put("sourceContent", "油卡:"+oilCard.getCardNo()+",充值:"+price.toString()); companyAccountService.consume(orgId, price, consumeType); // 变更前金额 BigDecimal beforeAmount = oilCard.getAmount(); // 计算金额 oilCard.setAmount(oilCard.getAmount().add(price)); editData(oilCard); // 变更后金额 BigDecimal afterAmount = oilCard.getAmount(); HighOilCardRecord record = new HighOilCardRecord(); record.setOilCardId(oilCard.getId()); record.setType(OilCardRecordTypeEnum.type1.getType()); record.setAmount(price); record.setBeforeAmount(beforeAmount); record.setAfterAmount(afterAmount); record.setSourceContent("充值油卡金额:" + record.getAmount()); oilCardRecordService.insertRecord(record); } @Override @Transactional(propagation= Propagation.REQUIRES_NEW, rollbackFor = Exception.class) public void generateCard(Long orgId, Integer generateNum) { UserInfoModel userInfoModel = userCenter.getSessionModel(UserInfoModel.class); // 查询部门信息 BsOrganization organization = organizationService.findById(orgId); if (organization == null) { throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未找到部门"); } BsCompany company = companyService.getCompanyById(organization.getCompanyId()); List oilCardList = new ArrayList<>(); HighOilCard oilCard; for (int i = 0; i < generateNum; i++) { oilCard = new HighOilCard(); oilCard.setCompanyId(organization.getCompanyId()); oilCard.setCompanyName(company.getName()); oilCard.setOrgId(organization.getId()); oilCard.setOrgName(organization.getName()); oilCard.setAmount(new BigDecimal("0")); oilCard.setCardNo(BankNumberUtil.getBrankNumber("8")); oilCard.setOpUserId(userInfoModel.getSecUser().getId()); oilCard.setOpUserName(userInfoModel.getSecUser().getUserName()); oilCard.setCreateTime(new Date()); oilCard.setUpdateTime(new Date()); oilCard.setStatus(OilCardStatusEnum.status1.getStatus()); oilCard.setBindStatus(OilCardBindStatusEnum.status0.getStatus()); oilCardList.add(oilCard); } oilCardMapper.insertList(oilCardList); } @Override @Transactional(propagation= Propagation.REQUIRES_NEW, rollbackFor = Exception.class) public void setContact(String cardNo, String contactName, String contactPhone) { // 查询油卡 HighOilCard oilCard = getOilCardByCardNo(cardNo); if (oilCard == null) { throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未找到油卡"); } // 查询手机号是否绑定油卡 HighOilCard phone = getOilCardByPhone(contactPhone); if (phone != null && !phone.getId().equals(oilCard.getId())) { throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "联系电话已绑定其他油卡"); } oilCard.setContactName(contactName); oilCard.setContactPhone(contactPhone); editData(oilCard); // 绑定状态 0:未绑定 1:已绑定 if (oilCard.getBindStatus() == 1) { oilCardContactRecordService.insert(oilCard.getId(), "新设置:联系人【"+oilCard.getContactName()+"】,联系电话【"+oilCard.getContactPhone()+"】"); } else { oilCardContactRecordService.insert(oilCard.getId(), "联系信息变更:原来联系人【"+oilCard.getContactName()+"】,联系电话【"+oilCard.getContactPhone()+"】。" + "变跟后联系人【"+oilCard.getContactName()+ "】,联系电话【"+oilCard.getContactPhone()+"】"); } } @Override public void disabled(String cardNo) { // 查询油卡 HighOilCard oilCard = getOilCardByCardNo(cardNo); if (oilCard == null) { throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未找到油卡"); } if (!oilCard.getStatus().equals(OilCardStatusEnum.status1.getStatus())) { throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "油卡状态错误"); } oilCard.setStatus(OilCardStatusEnum.status2.getStatus()); editData(oilCard); oilCardContactRecordService.insert(oilCard.getId(), "禁用油卡"); } @Override public void enable(String cardNo) { // 查询油卡 HighOilCard oilCard = getOilCardByCardNo(cardNo); if (oilCard == null) { throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未找到油卡"); } if (!oilCard.getStatus().equals(OilCardStatusEnum.status2.getStatus())) { throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "油卡状态错误"); } oilCard.setStatus(OilCardStatusEnum.status1.getStatus()); editData(oilCard); oilCardContactRecordService.insert(oilCard.getId(), "启用油卡"); } @Override public HighOilCard getOilCardByPhone(String phone) { HighOilCardExample example = new HighOilCardExample(); example.createCriteria().andStatusNotEqualTo(0).andContactPhoneEqualTo(phone); List list = oilCardMapper.selectByExample(example); if (list.size() > 0) { return list.get(0); } return null; } @Override public HighOilCard getOilCardByCardNo(String cardNo) { HighOilCardExample example = new HighOilCardExample(); example.createCriteria().andStatusNotEqualTo(0).andCardNoEqualTo(cardNo); List list = oilCardMapper.selectByExample(example); if (list.size() > 0) { return list.get(0); } return null; } @Override public List getOilCardList(Map param) { HighOilCardExample example = new HighOilCardExample(); HighOilCardExample.Criteria criteria = example.createCriteria().andStatusNotEqualTo(0); if (MapUtils.getLong(param, "companyId") != null) { criteria.andCompanyIdEqualTo(MapUtils.getLong(param, "companyId")); } if (MapUtils.getLong(param, "orgId") != null) { criteria.andOrgIdEqualTo(MapUtils.getLong(param, "orgId")); } if (StringUtils.isNotBlank(MapUtils.getString(param, "cardNo"))) { criteria.andCardNoLike("%" + MapUtils.getString(param, "cardNo") + "%"); } if (StringUtils.isNotBlank(MapUtils.getString(param, "contactName"))) { criteria.andContactNameLike("%" + MapUtils.getString(param, "contactName") + "%"); } if (StringUtils.isNotBlank(MapUtils.getString(param, "contactPhone"))) { criteria.andContactPhoneLike("%" + MapUtils.getString(param, "contactPhone") + "%"); } if (MapUtils.getLong(param, "createTimeS") != null) { criteria.andCreateTimeGreaterThanOrEqualTo(new Date(MapUtils.getLong(param, "createTimeS"))); } if (MapUtils.getLong(param, "createTimeE") != null) { criteria.andCreateTimeLessThanOrEqualTo(new Date(MapUtils.getLong(param, "createTimeE"))); } if (MapUtils.getLong(param, "bindTimeS") != null) { criteria.andBindTimeGreaterThanOrEqualTo(new Date(MapUtils.getLong(param, "bindTimeS"))); } if (MapUtils.getLong(param, "bindTimeE") != null) { criteria.andBindTimeLessThanOrEqualTo(new Date(MapUtils.getLong(param, "bindTimeE"))); } if (MapUtils.getBoolean(param, "isConfigContact") != null) { if (MapUtils.getBoolean(param, "isConfigContact") == true) { criteria.andContactPhoneIsNotNull(); } if (MapUtils.getBoolean(param, "isConfigContact") == false) { criteria.andContactPhoneIsNull(); } } if (MapUtils.getInteger(param, "status") != null) { criteria.andStatusEqualTo(MapUtils.getInteger(param, "status")); } if (MapUtils.getInteger(param, "bindStatus") != null) { criteria.andBindStatusEqualTo(MapUtils.getInteger(param, "bindStatus")); } example.setOrderByClause("create_time desc"); return oilCardMapper.selectByExample(example); } }