101captain
2021-12-23 5a8a90c095280fbd2106869ecd2bad10e01a57a6
springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComActWarehouseDonatesServiceImpl.java
@@ -1,13 +1,45 @@
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.service_community.entity.ComActWarehouseDonates;
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;
import org.springframework.stereotype.Service;
/**
 * 爱心义仓/物品捐赠表(ComActWarehouseDonates)表服务实现类
@@ -19,8 +51,304 @@
@Service
public class ComActWarehouseDonatesServiceImpl extends ServiceImpl<ComActWarehouseDonatesDao, ComActWarehouseDonates> 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<WarehouseDonatesExcelVO> list) {
        try {
            if (!list.isEmpty()) {
                List<ComActWarehouseDonates> 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<ComActWarehouseOperation> operationList = new ArrayList<>();
                Date nowDate = new Date();
                donateList.forEach(donate -> {
                    Long donateId = donate.getId();
                    if (nonNull(donateId)) {
                        ComActWarehouseOperation comActWarehouseOperation = new ComActWarehouseOperation();
                        comActWarehouseOperation.setGoodsId(donateId.intValue());
                        comActWarehouseOperation.setUserId(donate.getSigningBy().intValue());
                        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<Long> 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<ComActWarehouseDonatesVO> donatesVOIPage = this.baseMapper.pageDonates(page, pageDonatesDTO);
        Integer isWhich = pageDonatesDTO.getIsWhich();
        if (nonNull(isWhich) && isWhich.intValue() == 3) {
            List<ComActWarehouseDonatesVO> 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().intValue());
                comActWarehouseOperation.setUserId(comActWarehouseDonates.getSigningBy().intValue());
                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<ComActWarehouseOperationVO> 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().intValue());
            comActWarehouseOperation.setUserId(comActWarehouseDonates.getSigningBy().intValue());
            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().intValue());
            comActWarehouseOperation.setUserId(currentUser.intValue());
            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<ComActWarehouseApplyVO> applyItems = comActWarehouseApplyDTO.getApplyItems();
        if (!applyItems.isEmpty()) {
            Date nowDate = new Date();
            applyItems.forEach(item -> {
                Integer 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("领取成功,部分物品可能因剩余数量不足领取失败,请以实际领取记录为准");
    }
}