package com.panzhihua.service_community.service.impl; import static java.util.Objects.isNull; import static java.util.Objects.nonNull; import static org.apache.commons.lang3.StringUtils.isBlank; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.stream.Collectors; import javax.annotation.Resource; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.panzhihua.common.exceptions.ServiceException; import com.panzhihua.common.model.dtos.community.warehouse.ComActWarehouseApplyDTO; import com.panzhihua.common.model.dtos.community.warehouse.ComActWarehouseDonatesDTO; import com.panzhihua.common.model.dtos.community.warehouse.ExportDonatesDTO; import com.panzhihua.common.model.dtos.community.warehouse.PageDonatesDTO; import com.panzhihua.common.model.dtos.property.CommonPage; import com.panzhihua.common.model.vos.R; import com.panzhihua.common.model.vos.community.warehouse.ComActWarehouseApplyVO; import com.panzhihua.common.model.vos.community.warehouse.ComActWarehouseDonatesVO; import com.panzhihua.common.model.vos.community.warehouse.ComActWarehouseOperationVO; import com.panzhihua.common.model.vos.community.warehouse.DonatesStatisticsVO; import com.panzhihua.common.model.vos.community.warehouse.WarehouseDonatesExcelVO; import com.panzhihua.service_community.dao.ComActWarehouseApplyDao; import com.panzhihua.service_community.dao.ComActWarehouseDonatesDao; import com.panzhihua.service_community.dao.ComActWarehouseOperationDao; import com.panzhihua.service_community.entity.ComActWarehouseApply; import com.panzhihua.service_community.entity.ComActWarehouseDonates; import com.panzhihua.service_community.entity.ComActWarehouseOperation; import com.panzhihua.service_community.service.ComActWarehouseDonatesService; import lombok.extern.slf4j.Slf4j; /** * 爱心义仓/物品捐赠表(ComActWarehouseDonates)表服务实现类 * * @author makejava * @since 2021-10-09 17:14:16 */ @Slf4j @Service public class ComActWarehouseDonatesServiceImpl extends ServiceImpl implements ComActWarehouseDonatesService { @Resource private ComActWarehouseOperationDao comActWarehouseOperationDao; @Resource private ComActWarehouseApplyDao comActWarehouseApplyDao; @Override public R pageList(CommonPage commonPage) { return null; } /** * 后台导入捐赠物品 * @param list * @return */ @Override @Transactional(rollbackFor = Exception.class) public R batchImportWarehouseDonates(List list) { try { if (!list.isEmpty()) { List donateList = list.stream().map(excelVO -> { ComActWarehouseDonates donates = new ComActWarehouseDonates(); BeanUtils.copyProperties(excelVO, donates); if (excelVO.getIsAnonymous().equals("是")) { donates.setIsAnonymous(1); } else { donates.setIsAnonymous(2); } return donates; }).collect(Collectors.toList()); this.baseMapper.batchInsertDonates(donateList); List operationList = new ArrayList<>(); Date nowDate = new Date(); donateList.forEach(donate -> { Long donateId = donate.getId(); if (nonNull(donateId)) { ComActWarehouseOperation comActWarehouseOperation = new ComActWarehouseOperation(); comActWarehouseOperation.setGoodsId(donateId); comActWarehouseOperation.setUserId(donate.getSigningBy()); comActWarehouseOperation.setContent("工作人员完成了物品签收"); comActWarehouseOperation.setCreateTime(nowDate); comActWarehouseOperation.setType(ComActWarehouseOperation.type.bxs); operationList.add(comActWarehouseOperation); } }); if (!operationList.isEmpty()) { comActWarehouseOperationDao.batchInsertOperation(operationList); } } } catch (Exception e) { log.error("导入捐赠物品失败【{}】", e.getMessage()); return R.fail("导入捐赠物品失败"); } return R.ok(); } /** * 后台导出捐赠物品表格 * @param exportDonatesDTO * @return */ @Override public R exportDonates(ExportDonatesDTO exportDonatesDTO) { List needExportIds = exportDonatesDTO.getIds(); if (nonNull(needExportIds) && !needExportIds.isEmpty()) { //根据id导出 return R.ok(this.baseMapper.exportDonatesByIds(needExportIds)); } return R.ok(this.baseMapper.exportDonatesBySearch(exportDonatesDTO)); } /** * 分页查询捐赠物品 * @param pageDonatesDTO * @return */ @Override public R pageDonates(PageDonatesDTO pageDonatesDTO) { Page page = new Page<>(); page.setCurrent(pageDonatesDTO.getPageNum()); page.setSize(pageDonatesDTO.getPageSize()); IPage donatesVOIPage = this.baseMapper.pageDonates(page, pageDonatesDTO); Integer isWhich = pageDonatesDTO.getIsWhich(); if (nonNull(isWhich) && isWhich.intValue() == 3) { List records = donatesVOIPage.getRecords(); if (!records.isEmpty()) { records.forEach(record -> { String name = record.getName(); if (record.getIsAnonymous().equals(ComActWarehouseDonatesVO.isAnonymous.yes) || isBlank(name)) { record.setName("匿名用户"); } else { record.setName(name.substring(0, 1).concat(name.substring(1).replaceAll("\\S", "*"))); } record.setPhone(null); }); } } return R.ok(donatesVOIPage); } /** * 新增物品捐赠 * @param comActWarehouseDonatesDTO * @return */ @Override @Transactional(rollbackFor = Exception.class) public R addDonates(ComActWarehouseDonatesDTO comActWarehouseDonatesDTO) { ComActWarehouseDonates comActWarehouseDonates = new ComActWarehouseDonates(); BeanUtils.copyProperties(comActWarehouseDonatesDTO, comActWarehouseDonates); Date nowDate = new Date(); comActWarehouseDonates.setRegisterAt(nowDate); comActWarehouseDonates.setSurplusQuantity(comActWarehouseDonatesDTO.getQuantity()); if (isNull(comActWarehouseDonatesDTO.getUserId())) { //userId为空代表后台新增 comActWarehouseDonates.setSigningAt(nowDate); comActWarehouseDonates.setStatus(2); } else { comActWarehouseDonates.setStatus(1); } int result = this.baseMapper.insert(comActWarehouseDonates); if (result > 0) { if (comActWarehouseDonates.getStatus().intValue() == 2) { ComActWarehouseOperation comActWarehouseOperation = new ComActWarehouseOperation(); comActWarehouseOperation.setGoodsId(comActWarehouseDonates.getId()); comActWarehouseOperation.setUserId(comActWarehouseDonates.getSigningBy()); comActWarehouseOperation.setContent("工作人员完成了物品签收"); comActWarehouseOperation.setCreateTime(nowDate); comActWarehouseOperation.setType(ComActWarehouseOperation.type.bxs); comActWarehouseOperationDao.insert(comActWarehouseOperation); } return R.ok(); } return R.fail("添加失败,请重试"); } /** * 查看物品捐赠详情 * @param donatesId * @param isWhich * @param userId * @return */ @Override public R getDonates(Long donatesId, Integer isWhich, Long userId) { ComActWarehouseDonatesVO comActWarehouseDonatesVO = this.baseMapper.selectDetailById(donatesId); if (isNull(comActWarehouseDonatesVO)) { return R.fail("捐赠物品记录不存在"); } if (nonNull(isWhich) && isWhich.intValue() != 0) { if (isWhich.intValue() == 3) { String name = comActWarehouseDonatesVO.getName(); if (comActWarehouseDonatesVO.getIsAnonymous().equals(ComActWarehouseDonatesVO.isAnonymous.yes) || isBlank(name)) { comActWarehouseDonatesVO.setName("匿名用户"); } else { comActWarehouseDonatesVO.setName(name.substring(0, 1).concat(name.substring(1).replaceAll("\\S", "*"))); } comActWarehouseDonatesVO.setPhone(null); } if (isWhich.intValue() == 1 && !userId.equals(comActWarehouseDonatesVO.getUserId())) { return R.fail("无法获取他人捐赠记录"); } List operationList = comActWarehouseOperationDao.selectList(donatesId); comActWarehouseDonatesVO.setOperationList(operationList); } return R.ok(comActWarehouseDonatesVO); } /** * 捐赠物品后台签收 * @param comActWarehouseDonatesDTO * @return */ @Override @Transactional(rollbackFor = Exception.class) public R signingDonates(ComActWarehouseDonatesDTO comActWarehouseDonatesDTO) { ComActWarehouseDonates comActWarehouseDonates = this.baseMapper.selectById(comActWarehouseDonatesDTO.getId()); if (isNull(comActWarehouseDonates)) { return R.fail("捐赠物品记录不存在"); } if (comActWarehouseDonates.getStatus().intValue() != 1) { return R.fail("捐赠物品已被签收或已被取消"); } BeanUtils.copyProperties(comActWarehouseDonatesDTO, comActWarehouseDonates); Date nowDate = new Date(); if (nonNull(comActWarehouseDonatesDTO.getQuantity())) { comActWarehouseDonates.setSurplusQuantity(comActWarehouseDonatesDTO.getQuantity()); } comActWarehouseDonates.setSigningAt(nowDate); comActWarehouseDonates.setStatus(2); int result = this.baseMapper.updateById(comActWarehouseDonates); if (result > 0) { ComActWarehouseOperation comActWarehouseOperation = new ComActWarehouseOperation(); comActWarehouseOperation.setGoodsId(comActWarehouseDonates.getId()); comActWarehouseOperation.setUserId(comActWarehouseDonates.getSigningBy()); comActWarehouseOperation.setContent("工作人员完成了物品签收"); comActWarehouseOperation.setCreateTime(nowDate); comActWarehouseOperation.setType(ComActWarehouseOperation.type.bxs); comActWarehouseOperationDao.insert(comActWarehouseOperation); return R.ok(); } return R.fail("签收失败"); } /** * 用户取消捐赠 * @param donatesId * @param currentUser * @return */ @Override public R cancelDonates(Long donatesId, Long currentUser) { ComActWarehouseDonates comActWarehouseDonates = this.baseMapper.selectById(donatesId); if (isNull(comActWarehouseDonates)) { return R.fail("没有你的捐赠记录"); } if (!currentUser.equals(comActWarehouseDonates.getUserId())) { return R.fail("不能取消他人的捐赠记录"); } if (comActWarehouseDonates.getStatus().equals(ComActWarehouseDonates.status.yqx)) { return R.ok(); } comActWarehouseDonates.setStatus(ComActWarehouseDonates.status.yqx); int result = this.baseMapper.updateById(comActWarehouseDonates); if (result > 0) { ComActWarehouseOperation comActWarehouseOperation = new ComActWarehouseOperation(); comActWarehouseOperation.setGoodsId(comActWarehouseDonates.getId()); comActWarehouseOperation.setUserId(currentUser); comActWarehouseOperation.setContent("已取消捐赠"); comActWarehouseOperation.setCreateTime(new Date()); comActWarehouseOperation.setType(ComActWarehouseOperation.type.bxs); comActWarehouseOperationDao.insert(comActWarehouseOperation); } return R.ok(); } /** * 捐赠物品统计查询 * @param communityId * @return */ @Override public R getDonatesStatistics(Long communityId) { Date nowDate = new Date(); SimpleDateFormat yearFormat = new SimpleDateFormat("yyyy"); SimpleDateFormat monthFormat = new SimpleDateFormat("yyyy-MM"); SimpleDateFormat dayFormat = new SimpleDateFormat("yyyy-MM-dd"); String currentYear = yearFormat.format(nowDate).concat("%"); String currentMonth = monthFormat.format(nowDate).concat("%"); String today = dayFormat.format(nowDate).concat("%"); DonatesStatisticsVO donatesStatisticsVO = this.baseMapper.selectDonatesStatistics(communityId, currentYear, currentMonth, today); donatesStatisticsVO.setTotalDec(donatesStatisticsVO.getTotalInc().intValue() - donatesStatisticsVO.getSurplus().intValue()); return R.ok(donatesStatisticsVO); } /** * 社区后台物品领用 * @param comActWarehouseApplyDTO * @return */ @Override @Transactional(rollbackFor = Exception.class) public R applyDonates(ComActWarehouseApplyDTO comActWarehouseApplyDTO) { List applyItems = comActWarehouseApplyDTO.getApplyItems(); if (!applyItems.isEmpty()) { Date nowDate = new Date(); applyItems.forEach(item -> { Long goodsId = item.getGoodsId(); Integer goodsNum = item.getGoodsNum(); if (isNull(goodsId) || isNull(goodsNum)) { throw new ServiceException("请求参数有误"); } ComActWarehouseDonates warehouseDonates = this.baseMapper.selectById(goodsId); if (nonNull(warehouseDonates) && warehouseDonates.getSurplusQuantity() - goodsNum >= 0) { warehouseDonates.setSurplusQuantity(warehouseDonates.getSurplusQuantity() - goodsNum); this.baseMapper.updateById(warehouseDonates); ComActWarehouseApply apply = new ComActWarehouseApply(); BeanUtils.copyProperties(comActWarehouseApplyDTO, apply); apply.setActualTime(nowDate); apply.setCreateTime(nowDate); apply.setGoodsId(goodsId); apply.setGoodsNum(goodsNum); apply.setReserveTime(nowDate); apply.setStatus(ComActWarehouseApplyVO.status.ylq); apply.setWriteOffUserId(comActWarehouseApplyDTO.getOperateUserId()); comActWarehouseApplyDao.insert(apply); ComActWarehouseOperation comActWarehouseOperation=new ComActWarehouseOperation(); comActWarehouseOperation.setGoodsId(goodsId); comActWarehouseOperation.setCreateTime(nowDate); comActWarehouseOperation.setContent("爱心传递给了"+comActWarehouseApplyDTO.getApplyName().charAt(0)+"**,"+"减少了"+comActWarehouseApplyDTO.getReason()+"的困难,谢谢你的帮助"); comActWarehouseOperation.setType(ComActWarehouseOperation.type.xs); comActWarehouseOperation.setApplyId(apply.getId()); comActWarehouseOperationDao.insert(comActWarehouseOperation); } }); } return R.ok("领取成功,部分物品可能因剩余数量不足领取失败,请以实际领取记录为准"); } }