package com.caimei.modules.groupbuy.service; import com.caimei.modules.club.entity.CmUser; import com.caimei.modules.club.entity.Page; import com.caimei.modules.groupbuy.dao.ProcureRepository; import com.caimei.modules.groupbuy.entity.AdditionalPo; import com.caimei.modules.groupbuy.entity.BuyerDto; import com.caimei.modules.groupbuy.entity.ProcurePo; import com.caimei.modules.shiro.dao.UserDao; import com.caimei.utils.ResponseJson; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.stereotype.Service; import org.springframework.data.mongodb.core.query.Query; import javax.annotation.Resource; import java.text.SimpleDateFormat; import java.time.Instant; import java.time.temporal.ChronoUnit; import java.util.*; import java.util.concurrent.atomic.AtomicReference; import java.util.regex.Pattern; @Slf4j @Service public class ProcureService { @Resource private ProcureRepository procureRepository; @Resource private MongoTemplate mongoTemplate; @Resource private AdditionalService additionalService; @Resource private UserDao userDao; /** * 保存 * * @param procure */ public void save(ProcurePo procure) { //如果需要自定义主键,可以在这里指定主键;如果不指定主键,MongoDB会自动生成主键 //设置一些默认初始值。。。 //调用dao procureRepository.save(procure); } /** * 修改 * * @param procure */ public void update(ProcurePo procure) { //调用dao procureRepository.save(procure); } /** * 根据id删除 * * @param id */ public void deleteById(String id) { //调用dao procureRepository.deleteById(id); } /** * 查询所有集采 * * @return */ public Page findList(int pageNo, int pageSize) { //调用dao Pageable pageable = PageRequest.of(pageNo, pageSize); Query query = new Query(); query.addCriteria(Criteria.where("delFlag").is("0")); query.with(Sort.by(Sort.Direction.DESC, "saveTime")); List procurePos = mongoTemplate.find(query.with(pageable), ProcurePo.class); long count = mongoTemplate.count(query, ProcurePo.class); PageImpl page = new PageImpl<>(procurePos, pageable, count); return pageCopy(page, procurePos); } /** * 根据id查询 * * @param id * @return */ public ProcurePo findById(String id) { //调用dao return procureRepository.findById(id).get(); } /** * 我参与的集采 * * @param userId * @return */ public List findInvolvedList(Integer userId) { Query query = new Query(); query.addCriteria(Criteria.where("userId").is(userId)); query.addCriteria(Criteria.where("createUserId").not().is(userId)); query.with(Sort.by(Sort.Direction.DESC, "saveTime")); query.with(Sort.by(Sort.Direction.DESC, "isAchieve")); List procureList = mongoTemplate.find(query, ProcurePo.class); procureList.forEach(p -> { }); return mongoTemplate.find(query, ProcurePo.class); } /** * 我发起的集采 * * @param userId * @return */ public List findUserList(Integer userId) { Query query = new Query(); query.addCriteria(Criteria.where("createUserId").is(userId)); query.with(Sort.by(Sort.Direction.DESC, "saveTime")); query.with(Sort.by(Sort.Direction.DESC, "isAchieve")); return mongoTemplate.find(query, ProcurePo.class); } public ProcurePo editData(Integer id, Integer userId) { Query query = new Query(); query.addCriteria(Criteria.where("id").is(id)); query.addCriteria(Criteria.where("userId").is(userId)); return mongoTemplate.find(query, ProcurePo.class).get(0); } public Page findBuyListByPro(BuyerDto dto, Integer pageNum, Integer pageSize) { Pageable pageable = PageRequest.of(pageNum - 1, pageSize); Query query = new Query(); setCriteriaVal(query, dto); query.with(Sort.by(Sort.Direction.DESC, "saveTime")).with(pageable); List procurePos = mongoTemplate.find(query, ProcurePo.class); List buyerDtos = new ArrayList<>(); // 定义格式化字符串 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); procurePos.forEach(p -> { BuyerDto buyerDto = new BuyerDto(); String format = dateFormat.format(new Date(p.getSaveTime())); buyerDto.setSaveTime(format); int count = (int) mongoTemplate.count(Query.query(Criteria.where("procureId").is(p.getId())), AdditionalPo.class); log.info("p.getUserId()======"+p.getUserId()); CmUser linkMan = userDao.findLinkMan(p.getUserId()); log.info("linkMan======"+linkMan); buyerDto.setLinkMan(linkMan.getLinkMan()); buyerDto.setMobile(linkMan.getMobile()); buyerDto.setClubCount(count); // 1未完成 2已完成 3已删除 Integer status = "0".equals(p.getIsAchieve()) ? 1 : 2; status = !"0".equals(p.getDelFlag()) ? 3 : status; buyerDto.setStatus(status); BeanUtils.copyProperties(p, buyerDto); AtomicReference totalCount = new AtomicReference<>(0); totalCount.set(Integer.valueOf(p.getNumber())); List procureById = additionalService.findProcureById(p.getId()); procureById.forEach(b -> { ProcurePo byId1 = findById(b.getAdditionalId()); totalCount.set(totalCount.get() + Integer.parseInt(byId1.getNumber())); }); buyerDto.setNeedNum(totalCount.get()); buyerDtos.add(buyerDto); }); long count = mongoTemplate.count(query, ProcurePo.class); PageImpl page = new PageImpl<>(buyerDtos, pageable, count); return pageCopy(page, buyerDtos); } public Page pageCopy(PageImpl page, List info) { Page result = new Page<>(); result.setTotalPage(page.getTotalPages()); result.setPageSize(page.getSize()); result.setHasNextPage(page.hasNext()); result.setHasPreviousPage(page.hasPrevious()); result.setIndex(page.getPageable().getPageNumber()); result.setPageSize(page.getPageable().getPageSize()); result.setResults(info); return result; } public Query setCriteriaVal(Query query, BuyerDto dto) { // 发布者有创建者id query.addCriteria(Criteria.where("createUserId").ne(null)); if (StringUtils.isNotBlank(dto.getClubName())) { Pattern pattern = Pattern.compile("^.*" + dto.getClubName() + ".*$", Pattern.CASE_INSENSITIVE); query.addCriteria(Criteria.where("clubName").regex(pattern)); } if (StringUtils.isNotBlank(dto.getProductName())) { Pattern pattern = Pattern.compile("^.*" + dto.getProductName() + ".*$", Pattern.CASE_INSENSITIVE); query.addCriteria(Criteria.where("productName").regex(pattern)); } if (null != dto.getStatus()) { if (3 == dto.getStatus()) { query.addCriteria(Criteria.where("delFlag").is("1")); } else { query.addCriteria(Criteria.where("isAchieve").is(dto.getStatus().toString())); query.addCriteria(Criteria.where("delFlag").is("0")); } } if (StringUtils.isNotBlank(dto.getLinkMan())) { query.addCriteria(Criteria.where("clubName").regex(".*" + dto.getLinkMan() + ".*")); } if (StringUtils.isNotBlank(dto.getStartSaveTime()) && StringUtils.isNotBlank(dto.getEndSaveTime())) { /** * 传入结束时间为当日0点,加一天改为当日结束时间 */ Instant start = Instant.parse(dto.getStartSaveTime()); Instant end = Instant.parse(dto.getEndSaveTime()); end = end.plus(1, ChronoUnit.DAYS); long st = start.toEpochMilli(); long ed = end.toEpochMilli(); query.addCriteria(Criteria.where("saveTime").gte(st).lte(ed)); } return query; } public Map findDetail(String id) { // 发起者 ProcurePo byId = findById(id.toString()); // 参与者 List procureById = additionalService.findProcureById(byId.getId()); List procurePos = new ArrayList<>(); procureById.forEach(p -> { ProcurePo byId1 = findById(p.getAdditionalId()); procurePos.add(byId1); }); Map map = new HashMap<>(2); map.put("publishMan", byId); map.put("followMan", procurePos); return map; } public ResponseJson checkDone(String id) { ProcurePo byId = findById(id); byId.setIsAchieve("1"); update(byId); return ResponseJson.success(); } }