package com.ruoyi.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.BaseModel;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.dto.AddProcurementDto;
import com.ruoyi.system.export.PlatformLedgerReportExport;
import com.ruoyi.system.export.ProcurementReportClinicExport;
import com.ruoyi.system.export.ProcurementReportDetailExport;
import com.ruoyi.system.export.ProcurementReportPlatformExport;
import com.ruoyi.system.export.ProcurementReportSupplierExport;
import com.ruoyi.system.mapper.*;
import com.ruoyi.system.model.*;
import com.ruoyi.system.query.ClinicProcurementReportQuery;
import com.ruoyi.system.query.PerformanceReportQuery;
import com.ruoyi.system.query.TErpGoodsQuery;
import com.ruoyi.system.query.TErpProcurementQuery;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.system.service.TErpProcurementGoodsService;
import com.ruoyi.system.service.TErpProcurementService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.system.vo.*;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
/**
*
* erp采购 服务实现类
*
*
* @author xiaochen
* @since 2025-08-20
*/
@Service
public class TErpProcurementServiceImpl extends ServiceImpl implements TErpProcurementService {
@Resource
private TErpProcurementGoodsMapper erpProcurementGoodsMapper;
@Resource
private TSysCommissionMapper sysCommissionMapper;
@Resource
private TCrmClinicMapper crmClinicMapper;
@Resource
private TCrmSupplierMapper crmSupplierMapper;
@Resource
private SysUserMapper sysUserMapper;
@Resource
private TErpGoodsMapper erpGoodsMapper;
@Resource
private TErpGoodsTypeMapper erpGoodsTypeMapper;
@Resource
private TErpGoodsUnitMapper erpGoodsUnitMapper;
@Autowired
private TErpProcurementGoodsService erpProcurementGoodsService;
@Resource
private TErpSupplierWarehousingMapper erpSupplierWarehousingMapper;
@Resource
private TErpSupplierWarehousingBatchMapper erpSupplierWarehousingBatchMapper;
@Resource
private TErpSupplierOutboundMapper erpSupplierOutboundMapper;
@Resource
private TErpSupplierOutboundGoodsMapper erpSupplierOutboundGoodsMapper;
@Resource
private TCrmWarehouseMapper crmWarehouseMapper;
@Resource
private TCrmBranchMapper crmBranchMapper;
@Resource
private TCrmSalespersonMapper crmSalespersonMapper;
@Resource
private TCrmChangePointsMapper crmChangePointsMapper;
@Resource
private TErpProcurementCommissionMapper erpProcurementCommissionMapper;
@Autowired
private ISysUserService sysUserService;
@Autowired
private TCrmBranchAreaMapper crmBranchAreaMapper;
@Override
public PageInfo pageList(TErpProcurementQuery query, SysUser user) {
Integer roleType = user.getRoleType();
String supplierClinicId = null;
if (roleType == 4) {
// 供应商
TCrmSupplier crmSupplier = crmSupplierMapper.selectOne(Wrappers.lambdaQuery(TCrmSupplier.class)
.eq(TCrmSupplier::getUserId, user.getUserId())
.last("LIMIT 1"));
// ***
if(Objects.isNull(crmSupplier)){
SysUser sysUser = sysUserService.selectUserById(user.getUserId());
crmSupplier = crmSupplierMapper.selectById(sysUser.getObjectId());
}
supplierClinicId = crmSupplier.getId();
}
if (roleType == 5) {
// 诊所
TCrmClinic crmClinic = crmClinicMapper.selectOne(Wrappers.lambdaQuery(TCrmClinic.class)
.eq(TCrmClinic::getUserId, user.getUserId())
.last("LIMIT 1"));
// ***
if(Objects.isNull(crmClinic)){
SysUser sysUser = sysUserService.selectUserById(user.getUserId());
crmClinic = crmClinicMapper.selectById(sysUser.getObjectId());
}
supplierClinicId = crmClinic.getId();
}
String sTime = null;
String eTime = null;
if (query.getTime() != null && !query.getTime().isEmpty()) {
String[] split = query.getTime().split(" - ");
sTime = split[0] + " 00:00:00";
eTime = split[1] + " 23:59:59";
}
PageInfo pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
List list = this.baseMapper.pageList(query, pageInfo, user, sTime, eTime, supplierClinicId);
if (list.isEmpty()) {
return pageInfo;
}
List ids = list.stream().map(TErpProcurementVo::getId).collect(Collectors.toList());
List tErpProcurementGoods = erpProcurementGoodsMapper.selectList
(new LambdaQueryWrapper().in(TErpProcurementGoods::getProcurementId, ids));
//// List tSysCommissions = new ArrayList<>();
// if (!tErpProcurementGoods.isEmpty()) {
//// List collect = tErpProcurementGoods.stream().map(TErpProcurementGoods::getId).collect(Collectors.toList());
//// tSysCommissions = sysCommissionMapper.selectList(new LambdaQueryWrapper().in(TSysCommission::getTErpProcurementGoodsId, collect));
// }
for (TErpProcurementVo tErpProcurementVo : list) {
List collect = tErpProcurementGoods.stream().filter(e -> e.getProcurementId().equals(tErpProcurementVo.getId())).collect(Collectors.toList());
int size = collect.stream().map(TErpProcurementGoods::getGoodsId).collect(Collectors.toSet()).size();
tErpProcurementVo.setTypeNum(size);
BigDecimal reduce = collect.stream().map(TErpProcurementGoods::getTotalPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
tErpProcurementVo.setTotalPrice(reduce);
// if (!collect.isEmpty()) {
//// List collect1 = collect.stream().map(TErpProcurementGoods::getId).collect(Collectors.toList());
//// List collect2 = tSysCommissions.stream().filter(e -> collect1.contains(e.getTErpProcurementGoodsId())).collect(Collectors.toList());
//// BigDecimal reduce1 = collect2.stream().filter(e -> e.getType() == 1).map(TSysCommission::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
//// BigDecimal reduce2 = collect2.stream().filter(e -> e.getType() == 2).map(TSysCommission::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
//// tErpProcurementVo.setPlatformMoney(reduce1);
//// tErpProcurementVo.setSupplierMoney(reduce2);
// }
}
pageInfo.setRecords(list);
return pageInfo;
}
@Override
public PageInfo pageListWarehouse(TErpProcurementQuery query, SysUser user) {
Integer roleType = user.getRoleType();
List supplierClinicId = null;
if (roleType == 6) {
TCrmWarehouse warehouse = crmWarehouseMapper.selectOne(Wrappers.lambdaQuery(TCrmWarehouse.class)
.eq(TCrmWarehouse::getUserId, user.getUserId())
.last("LIMIT 1"));
// 供应商
supplierClinicId = crmSupplierMapper.selectList(Wrappers.lambdaQuery(TCrmSupplier.class)
.eq(TCrmSupplier::getWarehouseId, warehouse.getId())).stream().map(TCrmSupplier::getId).collect(Collectors.toList());
String sTime = null;
String eTime = null;
if (query.getTime() != null && !query.getTime().isEmpty()) {
String[] split = query.getTime().split(" - ");
sTime = split[0] + " 00:00:00";
eTime = split[1] + " 23:59:59";
}
PageInfo pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
if(CollectionUtils.isEmpty(supplierClinicId)){
return pageInfo;
}
List list = this.baseMapper.pageListWarehouse(query, pageInfo, user, sTime, eTime, supplierClinicId);
// if (list.isEmpty()) {
// return pageInfo;
// }
// List ids = list.stream().map(TErpProcurementVo::getId).collect(Collectors.toList());
// List tErpProcurementGoods = erpProcurementGoodsMapper.selectList
// (new LambdaQueryWrapper().in(TErpProcurementGoods::getProcurementId, ids));
// List tSysCommissions = new ArrayList<>();
// if (!tErpProcurementGoods.isEmpty()) {
// List collect = tErpProcurementGoods.stream().map(TErpProcurementGoods::getId).collect(Collectors.toList());
// tSysCommissions = sysCommissionMapper.selectList(new LambdaQueryWrapper().in(TSysCommission::getTErpProcurementGoodsId, collect));
// }
// for (TErpProcurementVo tErpProcurementVo : list) {
// List collect = tErpProcurementGoods.stream().filter(e -> e.getProcurementId().equals(tErpProcurementVo.getId())).collect(Collectors.toList());
// int size = collect.stream().map(TErpProcurementGoods::getGoodsId).collect(Collectors.toSet()).size();
// tErpProcurementVo.setTypeNum(size);
// BigDecimal reduce = collect.stream().map(TErpProcurementGoods::getTotalPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
// tErpProcurementVo.setTotalPrice(reduce);
// if (!collect.isEmpty()) {
// List collect1 = collect.stream().map(TErpProcurementGoods::getId).collect(Collectors.toList());
// List collect2 = tSysCommissions.stream().filter(e -> collect1.contains(e.getTErpProcurementGoodsId())).collect(Collectors.toList());
// BigDecimal reduce1 = collect2.stream().filter(e -> e.getType() == 1).map(TSysCommission::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
// BigDecimal reduce2 = collect2.stream().filter(e -> e.getType() == 2).map(TSysCommission::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
// tErpProcurementVo.setPlatformMoney(reduce1);
// tErpProcurementVo.setSupplierMoney(reduce2);
// }
//
// }
pageInfo.setRecords(list);
return pageInfo;
}
return null;
}
@Override
public TErpProcurementDetailVo detail(String id, SysUser user, String goodsName) {
Integer roleType = user.getRoleType();
String supplierClinicId = null;
if (roleType == 4) {
// 供应商
TCrmSupplier crmSupplier = crmSupplierMapper.selectOne(Wrappers.lambdaQuery(TCrmSupplier.class)
.eq(TCrmSupplier::getUserId, user.getUserId())
.last("LIMIT 1"));
// ***
if(Objects.isNull(crmSupplier)){
SysUser sysUser = sysUserService.selectUserById(user.getUserId());
crmSupplier = crmSupplierMapper.selectById(sysUser.getObjectId());
}
supplierClinicId = crmSupplier.getId();
}
if (roleType == 5) {
// 诊所
TCrmClinic crmClinic = crmClinicMapper.selectOne(Wrappers.lambdaQuery(TCrmClinic.class)
.eq(TCrmClinic::getUserId, user.getUserId())
.last("LIMIT 1"));
// ***
if(Objects.isNull(crmClinic)){
SysUser sysUser = sysUserService.selectUserById(user.getUserId());
crmClinic = crmClinicMapper.selectById(sysUser.getObjectId());
}
supplierClinicId = crmClinic.getId();
}
TErpProcurementDetailVo tErpProcurementVo = new TErpProcurementDetailVo();
TErpProcurement tErpProcurement = this.getById(id);
tErpProcurementVo.setId(id);
tErpProcurementVo.setProcurementCode(tErpProcurement.getProcurementCode());
tErpProcurementVo.setClinicId(tErpProcurement.getClinicId());
TCrmClinic tCrmClinic = crmClinicMapper.selectById(tErpProcurement.getClinicId());
tErpProcurementVo.setClinicName(tCrmClinic.getClinicName());
tErpProcurementVo.setUserName(tCrmClinic.getPersonChargeName());
SysUser sysUser = sysUserMapper.selectUserById(Long.valueOf(tErpProcurement.getCreateId()));
tErpProcurementVo.setUserName(sysUser.getNickName());
tErpProcurementVo.setCreateTime(tErpProcurement.getCreateTime());
tErpProcurementVo.setUpdateTime(tErpProcurement.getUpdateTime());
if (tErpProcurement.getWarehousingUserId() != null) {
SysUser sysUser1 = sysUserMapper.selectUserById(Long.valueOf(tErpProcurement.getWarehousingUserId()));
tErpProcurementVo.setOperName(sysUser1.getNickName());
}
tErpProcurementVo.setStatus(tErpProcurement.getStatus());
tErpProcurementVo.setSendTime(tErpProcurement.getSendTime());
tErpProcurementVo.setMoney(tErpProcurement.getMoney());
tErpProcurementVo.setTotalPrice(tErpProcurement.getPayMoney());
List tErpProcurementGoods = erpProcurementGoodsMapper.selectList
(new LambdaQueryWrapper().eq(TErpProcurementGoods::getProcurementId, id)
.like(goodsName != null && !goodsName.isEmpty(), TErpProcurementGoods::getGoodsName, goodsName)
.eq(TErpProcurementGoods::getSupplierId, supplierClinicId));
if (tErpProcurementGoods.isEmpty()) {
return tErpProcurementVo;
}
ArrayList tErpProcurementDetailNextVos = new ArrayList<>();
for (TErpProcurementGoods tErpProcurementGood : tErpProcurementGoods) {
TErpProcurementDetailNextVo tErpProcurementDetailNextVo = new TErpProcurementDetailNextVo();
BeanUtils.copyProperties(tErpProcurementGood, tErpProcurementDetailNextVo);
tErpProcurementDetailNextVo.setGoodsName(tErpProcurementGood.getGoodsName());
tErpProcurementDetailNextVo.setUnitName(tErpProcurementGood.getUnitName());
tErpProcurementDetailNextVo.setNum(tErpProcurementGood.getPurchaseCount());
tErpProcurementDetailNextVo.setTotalPrice(tErpProcurementGood.getTotalPrice());
tErpProcurementDetailNextVo.setQuasiNumber(tErpProcurementGood.getQuasiNumber());
tErpProcurementDetailNextVo.setPurchasePrice(tErpProcurementGood.getSalesAmount());
List tSysCommissions = sysCommissionMapper.selectList(new LambdaQueryWrapper().eq(TSysCommission::getTErpProcurementGoodsId, tErpProcurementGood.getId()));
if (!tSysCommissions.isEmpty()) {
BigDecimal reduce = tSysCommissions.stream().filter(e -> e.getType() == 1).map(TSysCommission::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
tErpProcurementDetailNextVo.setPlatformMoney(reduce);
BigDecimal reduce1 = tSysCommissions.stream().filter(e -> e.getType() == 2).map(TSysCommission::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
tErpProcurementDetailNextVo.setSupplierMoney(reduce1);
}
tErpProcurementDetailNextVos.add(tErpProcurementDetailNextVo);
}
tErpProcurementVo.setList(tErpProcurementDetailNextVos);
return tErpProcurementVo;
}
@Override
public PageInfo pageGoodsPageList(TErpGoodsQuery query, SysUser user) {
PageInfo pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
// 获取未禁用的供应商
List suppliers = crmSupplierMapper.selectList(new LambdaQueryWrapper().eq(TCrmSupplier::getStatus, 1));
if(suppliers.isEmpty()){
return pageInfo;
}
PageInfo p = erpGoodsMapper.selectPage(pageInfo, new LambdaQueryWrapper()
.like(StringUtils.isNotBlank(query.getGoodsName()), TErpGoods::getGoodsName, query.getGoodsName())
.like(StringUtils.isNotBlank(query.getGoodsIdCode()), TErpGoods::getGoodsIdCode, query.getGoodsIdCode())
.like(StringUtils.isNotBlank(query.getQuasiNumber()), TErpGoods::getQuasiNumber, query.getQuasiNumber())
.eq(StringUtils.isNotBlank(query.getTypeId()),TErpGoods::getTypeId, query.getTypeId())
.eq(TErpGoods::getState,1)
.eq(TErpGoods::getGoodsSource, 1)
.in(TErpGoods::getSupplierClinicId, suppliers.stream().map(TCrmSupplier::getId).collect(Collectors.toList()))
.isNotNull(TErpGoods::getClinicPurchasePrice)
.orderByDesc(BaseModel::getCreateTime));
List list = p.getRecords();
List typeIds = list.stream().map(TErpGoods::getTypeId).collect(Collectors.toList());
if (!typeIds.isEmpty()) {
List typeList = erpGoodsTypeMapper.selectBatchIds(typeIds);
for (TErpGoods tErpGoodsVO : list) {
typeList.stream().filter(t -> t.getId().equals(tErpGoodsVO.getTypeId())).findFirst().ifPresent(t -> tErpGoodsVO.setTypeName(t.getTypeName()));
tErpGoodsVO.setTypeName(tErpGoodsVO.getTypeName());
}
}
List supplierClinicId = list.stream().filter(e -> e.getGoodsSource() == 1).map(TErpGoods::getSupplierClinicId).collect(Collectors.toList());
if (!supplierClinicId.isEmpty()) {
List crmClinics = crmSupplierMapper.selectBatchIds(supplierClinicId);
for (TErpGoods tErpGoodsVO : list) {
crmClinics.stream().filter(t -> t.getId().equals(tErpGoodsVO.getSupplierClinicId())).findFirst().ifPresent(t -> tErpGoodsVO.setSupplierName(t.getSupplierName()));
}
}
pageInfo.setRecords(list);
return pageInfo;
}
@Override
public List inventoryNotEnoughList(SysUser user) {
// 查询诊所
TCrmClinic crmClinic = crmClinicMapper.selectOne(new LambdaQueryWrapper().eq(TCrmClinic::getUserId, user.getUserId())
.last("limit 1"));
if (Objects.isNull(crmClinic)) {
SysUser sysUser = sysUserService.selectUserById(user.getUserId());
crmClinic = crmClinicMapper.selectById(sysUser.getObjectId());
}
List list = this.baseMapper.inventoryNotEnoughList(user,crmClinic.getId());
List typeIds = list.stream().map(TErpGoodsVO::getTypeId).collect(Collectors.toList());
if (!typeIds.isEmpty()) {
List typeList = erpGoodsTypeMapper.selectBatchIds(typeIds);
for (TErpGoodsVO tErpGoodsVO : list) {
typeList.stream().filter(t -> t.getId().equals(tErpGoodsVO.getTypeId())).findFirst().ifPresent(t -> tErpGoodsVO.setTypeName(t.getTypeName()));
}
}
List supplierClinicId = list.stream().filter(e -> e.getGoodsSource() == 1).map(TErpGoodsVO::getSupplierClinicId).collect(Collectors.toList());
if (!supplierClinicId.isEmpty()) {
List crmSuppliers = crmSupplierMapper.selectBatchIds(supplierClinicId);
for (TErpGoodsVO tErpGoodsVO : list) {
crmSuppliers.stream().filter(t -> t.getId().equals(tErpGoodsVO.getSupplierClinicId())).findFirst().ifPresent(t -> tErpGoodsVO.setSupplierName(t.getSupplierName()));
}
}
return list;
}
@Override
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
public void addProcurement(String clinicSupplierId, SysUser user, List dtos) {
List goodsIds = dtos.stream().map(AddProcurementDto::getGoodsId).collect(Collectors.toList());
List tErpGoods = erpGoodsMapper.selectBatchIds(goodsIds);
for (AddProcurementDto dto : dtos) {
TErpGoods tErpGoodsVO = tErpGoods.stream().filter(t -> t.getId().equals(dto.getGoodsId())).findFirst().get();
dto.setPlatformCommissionPrice(tErpGoodsVO.getPlatformCommissionPrice());
dto.setSupplierId(tErpGoodsVO.getSupplierClinicId());
dto.setGoodsSalesAmount(tErpGoodsVO.getClinicPurchasePrice());
if (dto.getSalesAmount() == null) {
dto.setSalesAmount(tErpGoodsVO.getClinicPurchasePrice());
}
}
// 供应商分组
Map> supplierClinicIdListMap = dtos.stream().collect(Collectors.groupingBy(AddProcurementDto::getSupplierId));
for (Map.Entry> entry : supplierClinicIdListMap.entrySet()) {
String supplierClinicId = entry.getKey();
TCrmSupplier supplier = crmSupplierMapper.selectById(supplierClinicId);
List value = entry.getValue();
TErpProcurement tErpProcurement = new TErpProcurement();
tErpProcurement.setClinicId(clinicSupplierId);
tErpProcurement.setSupplierId(supplierClinicId);
tErpProcurement.setTermNo(supplier.getTermNo());
tErpProcurement.setMerchantNo(supplier.getRecvMerchantNo());
tErpProcurement.setCreateId(user.getUserId().toString());
BigDecimal all = BigDecimal.ZERO;
for (AddProcurementDto addProcurementDto : value) {
if(addProcurementDto.getGoodsSalesAmount()!= null && addProcurementDto.getPurchaseCount()!=null){
BigDecimal multiply = addProcurementDto.getGoodsSalesAmount().multiply(BigDecimal.valueOf(addProcurementDto.getPurchaseCount()));
all = all.add(multiply);
}
}
tErpProcurement.setPayMoney(all);
AddProcurementDto addProcurementDto = value.get(0);
if (addProcurementDto.getState() != null && addProcurementDto.getState() == 1) {
tErpProcurement.setStatus(1);
} else {
tErpProcurement.setStatus(2);
}
ArrayList tErpProcurementGoods1 = new ArrayList<>();
BigDecimal add = BigDecimal.ZERO;
BigDecimal supplierCommissionPrice = BigDecimal.ZERO;
for (AddProcurementDto dto : value) {
TErpProcurementGoods tErpProcurementGoods = new TErpProcurementGoods();
tErpProcurementGoods.setProcurementId(tErpProcurement.getId());
TErpGoods goods = tErpGoods.stream().filter(e -> e.getId().equals(dto.getGoodsId())).findFirst().get();
BeanUtils.copyProperties(goods, tErpProcurementGoods);
if (goods.getContentState()==null || goods.getContentState()!=1) {
tErpProcurementGoods.setContent(null);
}
tErpProcurementGoods.setGoodsId(dto.getGoodsId());
tErpProcurementGoods.setGoodsName(goods.getGoodsName());
tErpProcurementGoods.setSupplierName(supplier.getSupplierName());
tErpProcurementGoods.setQuasiNumber(goods.getQuasiNumber());
TErpGoodsUnit tErpGoodsUnit = erpGoodsUnitMapper.selectById(goods.getPackingUnitId());
if(tErpGoodsUnit!=null){
tErpProcurementGoods.setUnitName(tErpGoodsUnit.getUnitName());
}
tErpProcurementGoods.setPurchasePrice(dto.getGoodsSalesAmount());
tErpProcurementGoods.setSalesAmount(dto.getSalesAmount());
if(dto.getPurchaseCount()!=null && dto.getGoodsSalesAmount()!=null){
tErpProcurementGoods.setTotalPrice(dto.getGoodsSalesAmount().multiply(new BigDecimal(dto.getPurchaseCount())));
}
tErpProcurementGoods.setPurchaseCount(dto.getPurchaseCount());
tErpProcurementGoods.setSupplierId(supplierClinicId);
tErpProcurementGoods.setRecvMerchantNo(supplier.getRecvMerchantNo());
tErpProcurementGoods.setSupplierMoney(dto.getGoodsSalesAmount().subtract(dto.getPlatformCommissionPrice()));
if(dto.getPurchaseCount()!=null){
supplierCommissionPrice = supplierCommissionPrice.add(tErpProcurementGoods.getSupplierMoney().multiply(BigDecimal.valueOf(dto.getPurchaseCount())));
}
if (tErpProcurementGoods.getSupplierMoney().doubleValue() < 0) {
throw new RuntimeException("平台抽成不能大于售卖价格");
}
if(dto.getPurchaseCount()!=null){
add = add.add(dto.getPlatformCommissionPrice().multiply(BigDecimal.valueOf(dto.getPurchaseCount())));
}
tErpProcurementGoods1.add(tErpProcurementGoods);
}
BigDecimal bigDecimal = tErpProcurement.getPayMoney().multiply(BigDecimal.valueOf(0.0038)).setScale(2, RoundingMode.HALF_UP);
tErpProcurement.setMoney(add.subtract(bigDecimal));
if (tErpProcurement.getMoney().doubleValue() < 0) {
throw new RuntimeException("金额设置错误,请联系平台管理员");
}
tErpProcurement.setSupplierMoney(supplierCommissionPrice);
// 获取上一条最新的数据
TErpProcurement tErpProcurement1 = this.baseMapper.selectOne(new QueryWrapper()
.orderByDesc("create_time")
.orderByDesc("procurement_code").last("limit 1"));
if(tErpProcurement1==null){
tErpProcurement.setProcurementCode("C" + DateUtils.dateTimeNow()+"00001");
}else {
String lastProcurementCode = tErpProcurement1.getProcurementCode();
String datePart = "C" + DateUtils.dateTimeNow();
// 直接获取后五位数字并+1,不考虑是否同一天
try {
String numberPart = lastProcurementCode.substring(Math.max(0, lastProcurementCode.length() - 5));
int number = Integer.parseInt(numberPart);
if (number < 99999) {
number++;
} else {
number = 2; // 达到99999后重置为00002
}
tErpProcurement.setProcurementCode(datePart + String.format("%05d", number));
} catch (NumberFormatException e) {
// 如果解析失败,默认从00001开始
tErpProcurement.setProcurementCode(datePart + "00001");
}
}
try {
this.save(tErpProcurement);
}catch (Exception e){
e.printStackTrace();
throw new RuntimeException("网络繁忙,请重试");
}
for (TErpProcurementGoods tErpProcurementGoods : tErpProcurementGoods1) {
tErpProcurementGoods.setId(null);
tErpProcurementGoods.setProcurementId(tErpProcurement.getId());
}
erpProcurementGoodsService.saveBatch(tErpProcurementGoods1);
}
}
@Override
public DetailProcurementVO detailProcurement(String clinicSupplierId, SysUser user, String id) {
DetailProcurementVO detailProcurementVO = new DetailProcurementVO();
TErpProcurement tErpProcurement = this.getById(id);
if (tErpProcurement.getWarehousingUserId()!=null && !tErpProcurement.getWarehousingUserId().isEmpty()) {
SysUser sysUser = sysUserMapper.selectUserById(Long.valueOf(tErpProcurement.getWarehousingUserId()));
detailProcurementVO.setWarehousingUserName(sysUser.getNickName());
}
detailProcurementVO.setWarehousingTime(tErpProcurement.getWarehousingTime());
detailProcurementVO.setStatus(tErpProcurement.getStatus());
detailProcurementVO.setCreateTime(tErpProcurement.getCreateTime());
detailProcurementVO.setSendTime(tErpProcurement.getSendTime());
TCrmSupplier supplier = crmSupplierMapper.selectById(tErpProcurement.getSupplierId());
detailProcurementVO.setSupplierName(supplier.getSupplierName());
detailProcurementVO.setUserName(sysUserMapper.selectUserById(Long.valueOf(tErpProcurement.getCreateId())).getNickName());
TCrmClinic tCrmClinic = crmClinicMapper.selectById(tErpProcurement.getClinicId());
detailProcurementVO.setClinicName(tCrmClinic.getClinicName());
detailProcurementVO.setClinicAddress(tCrmClinic.getClinicAddress());
detailProcurementVO.setLogisticsNumber(tErpProcurement.getLogisticsNumber());
List list = erpProcurementGoodsService.list(new QueryWrapper().eq("procurement_id", id));
ArrayList detailProcurementNextVOS = new ArrayList<>();
for (TErpProcurementGoods tErpProcurementGoods : list) {
DetailProcurementNextVO detailProcurementNextVO = new DetailProcurementNextVO();
BeanUtils.copyProperties(tErpProcurementGoods, detailProcurementNextVO);
detailProcurementNextVO.setGoodsName(tErpProcurementGoods.getGoodsName());
detailProcurementNextVO.setQuasiNumber(tErpProcurementGoods.getQuasiNumber());
detailProcurementNextVO.setPackingUnitName(tErpProcurementGoods.getUnitName());
detailProcurementNextVO.setSalesAmount(tErpProcurementGoods.getSalesAmount());
detailProcurementNextVO.setNum(tErpProcurementGoods.getPurchaseCount());
detailProcurementNextVO.setTotalPrice(tErpProcurement.getPayMoney());
detailProcurementNextVO.setId(tErpProcurementGoods.getId());
detailProcurementNextVO.setPurchasePrice(tErpProcurementGoods.getPurchasePrice());
List tErpSupplierOutboundGoods = erpSupplierOutboundGoodsMapper.selectList(new LambdaQueryWrapper().eq(TErpSupplierOutboundGoods::getProcurementGoodsId, tErpProcurementGoods.getId()));
if(!tErpSupplierOutboundGoods.isEmpty()){
ArrayList detailProcurementNextThreeVOS = new ArrayList<>();
List collect = tErpSupplierOutboundGoods.stream().map(TErpSupplierOutboundGoods::getWarehousingBatchId).collect(Collectors.toList());
List tErpSupplierWarehousingBatches = erpSupplierWarehousingBatchMapper.selectBatchIds(collect);
for (TErpSupplierOutboundGoods tErpSupplierOutboundGood : tErpSupplierOutboundGoods) {
List collect1 = tErpSupplierWarehousingBatches.stream().filter(e -> e.getId().equals(tErpSupplierOutboundGood.getWarehousingBatchId())).collect(Collectors.toList());
for (TErpSupplierWarehousingBatch tErpSupplierWarehousingBatch : collect1) {
DetailProcurementNextThreeVO detailProcurementNextThreeVO = new DetailProcurementNextThreeVO();
detailProcurementNextThreeVO.setBatchNumber(tErpSupplierWarehousingBatch.getBatchNumber());
detailProcurementNextThreeVO.setProductionDate(tErpSupplierWarehousingBatch.getProductionDate());
detailProcurementNextThreeVO.setExpirationDate(tErpSupplierWarehousingBatch.getExpiryDate());
detailProcurementNextThreeVO.setNum(tErpSupplierOutboundGood.getOutboundCount());
detailProcurementNextThreeVOS.add(detailProcurementNextThreeVO);
}
}
detailProcurementNextVO.setDetailProcurementNextThreeVOS(detailProcurementNextThreeVOS);
}
detailProcurementNextVOS.add(detailProcurementNextVO);
}
detailProcurementVO.setList(detailProcurementNextVOS);
return detailProcurementVO;
}
@Override
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
public void detailProcurementSend(List clinicSupplierId, SysUser user, String id,String logisticsNumber) {
// 查出这个采购的下级商品
List list = erpProcurementGoodsService.list(new QueryWrapper().eq("procurement_id", id));
List tErpSupplierWarehousings = erpSupplierWarehousingMapper.selectList(new LambdaQueryWrapper()
.in(TErpSupplierWarehousing::getSupplierId, clinicSupplierId).in(TErpSupplierWarehousing::getGoodsId, list.stream().map(TErpProcurementGoods::getGoodsId).collect(Collectors.toList()))
.orderByAsc(BaseModel::getCreateTime));
if(tErpSupplierWarehousings.isEmpty()){
throw new RuntimeException("商品供应商未入库,请先入库");
}
List tErpSupplierWarehousingBatches = erpSupplierWarehousingBatchMapper.selectList(new LambdaQueryWrapper().in(TErpSupplierWarehousingBatch::getWarehousingId, tErpSupplierWarehousings.stream().map(TErpSupplierWarehousing::getId).collect(Collectors.toList())));
// 获取所有的出库记录
List tErpSupplierOutboundGoodsLists = erpSupplierOutboundGoodsMapper.selectList(new LambdaQueryWrapper().in(TErpSupplierOutboundGoods::getWarehousingBatchId, tErpSupplierWarehousingBatches.stream().map(TErpSupplierWarehousingBatch::getId).collect(Collectors.toList())));
outer:for (TErpProcurementGoods tErpProcurementGoods : list) {
// 分别入库
String goodsId = tErpProcurementGoods.getGoodsId();
// 查询这个供应商的 该商品是否入过库 未入库提示 出库判断库存 先找先入库的
List collect = tErpSupplierWarehousings.stream().filter(e -> e.getGoodsId().equals(goodsId)).collect(Collectors.toList());
if(collect.isEmpty()){
throw new RuntimeException("商品供应商未入库,请先入库");
}
// 需要出库的数量
Integer purchaseCount = tErpProcurementGoods.getPurchaseCount();
if(purchaseCount==0){
continue;
}
for (TErpSupplierWarehousing tErpSupplierWarehousing : collect) {
List warehousingBatches = tErpSupplierWarehousingBatches.stream().filter(e -> e.getWarehousingId().equals(tErpSupplierWarehousing.getId())).collect(Collectors.toList());
for (TErpSupplierWarehousingBatch warehousingBatch : warehousingBatches) {
// 已出库数量
int sum = tErpSupplierOutboundGoodsLists.stream().filter(e -> e.getWarehousingBatchId().equals(warehousingBatch.getId())).mapToInt(TErpSupplierOutboundGoods::getOutboundCount).sum();
// 该批次剩余的数量
int count = warehousingBatch.getWarehousingNumber() - sum;
// 该批次没有数量 找下个批次
if(count==0 ){
continue;
}
// 如果大于这个数量 则使用这个批次
if(count>=purchaseCount){
// 添加出库记录
TErpSupplierOutbound tErpSupplierOutbound= new TErpSupplierOutbound();
tErpSupplierOutbound.setGoodsId(tErpSupplierWarehousing.getGoodsId());
tErpSupplierOutbound.setSupplierId(tErpSupplierWarehousing.getSupplierId());
tErpSupplierOutbound.setWarehouseId(tErpSupplierWarehousing.getWarehouseId());
tErpSupplierOutbound.setOutboundType(7);
//TODO 确定这个是采购价还是销售价格
tErpSupplierOutbound.setTotalMoney(tErpProcurementGoods.getPurchasePrice().multiply(new BigDecimal(purchaseCount)));
TErpSupplierOutbound last = erpSupplierOutboundMapper.selectOne(new LambdaQueryWrapper().orderByDesc(BaseModel::getCreateTime).orderByDesc(TErpSupplierOutbound::getOutboundNumber).last("limit 1"));
if(last==null){
tErpSupplierOutbound.setOutboundNumber("G" + DateUtils.dateTimeNow()+"00001");
}else {
String lastProcurementCode = last.getOutboundNumber();
String datePart = "G" + DateUtils.dateTimeNow();
// 直接获取后五位数字并+1,不考虑是否同一天
try {
String numberPart = lastProcurementCode.substring(Math.max(0, lastProcurementCode.length() - 5));
int number = Integer.parseInt(numberPart);
if (number < 99999) {
number++;
} else {
number = 2; // 达到99999后重置为00002
}
tErpSupplierOutbound.setOutboundNumber(datePart + String.format("%05d", number));
} catch (NumberFormatException e) {
// 如果解析失败,默认从00001开始
tErpSupplierOutbound.setOutboundNumber(datePart + "00001");
}
}
try {
erpSupplierOutboundMapper.insert(tErpSupplierOutbound);
}catch (Exception e){
throw new RuntimeException("网络繁忙,请重试");
}
TErpSupplierOutboundGoods tErpSupplierOutboundGoods = new TErpSupplierOutboundGoods();
tErpSupplierOutboundGoods.setOutboundId(tErpSupplierOutbound.getId());
tErpSupplierOutboundGoods.setWarehousingId(tErpSupplierWarehousing.getId());
tErpSupplierOutboundGoods.setWarehousingBatchId(warehousingBatch.getId());
tErpSupplierOutboundGoods.setOutboundCount(purchaseCount);
tErpSupplierOutboundGoods.setTotalPrice(tErpProcurementGoods.getPurchasePrice().multiply(new BigDecimal(purchaseCount)));
tErpSupplierOutboundGoods.setProcurementGoodsId(tErpProcurementGoods.getId());
erpSupplierOutboundGoodsMapper.insert(tErpSupplierOutboundGoods);
continue outer;
}
if(count().orderByDesc(BaseModel::getCreateTime).orderByDesc(TErpSupplierOutbound::getOutboundNumber).last("limit 1"));
if(last==null){
tErpSupplierOutbound.setOutboundNumber("G" + DateUtils.dateTimeNow()+"00001");
}else {
String lastProcurementCode = last.getOutboundNumber();
String datePart = "G" + DateUtils.dateTimeNow();
// 直接获取后五位数字并+1,不考虑是否同一天
try {
String numberPart = lastProcurementCode.substring(Math.max(0, lastProcurementCode.length() - 5));
int number = Integer.parseInt(numberPart);
if (number < 99999) {
number++;
} else {
number = 2; // 达到99999后重置为00002
}
tErpSupplierOutbound.setOutboundNumber(datePart + String.format("%05d", number));
} catch (NumberFormatException e) {
// 如果解析失败,默认从00001开始
tErpSupplierOutbound.setOutboundNumber(datePart + "00001");
}
}
try {
erpSupplierOutboundMapper.insert(tErpSupplierOutbound);
}catch (Exception e){
throw new RuntimeException("网络繁忙,请重试");
}
TErpSupplierOutboundGoods tErpSupplierOutboundGoods = new TErpSupplierOutboundGoods();
tErpSupplierOutboundGoods.setOutboundId(tErpSupplierOutbound.getId());
tErpSupplierOutboundGoods.setWarehousingId(tErpSupplierWarehousing.getId());
tErpSupplierOutboundGoods.setWarehousingBatchId(warehousingBatch.getId());
tErpSupplierOutboundGoods.setOutboundCount(purchaseCount);
tErpSupplierOutboundGoods.setTotalPrice(tErpProcurementGoods.getPurchasePrice().multiply(new BigDecimal(purchaseCount)));
tErpSupplierOutboundGoods.setProcurementGoodsId(tErpProcurementGoods.getId());
erpSupplierOutboundGoodsMapper.insert(tErpSupplierOutboundGoods);
}
}
}
if(purchaseCount>0){
throw new RuntimeException("商品供应商库存不足,请先入库");
}
}
TErpProcurement byId = this.getById(id);
byId.setStatus(4);
byId.setSendTime(LocalDateTime.now());
byId.setLogisticsNumber(logisticsNumber);
this.updateById(byId);
}
@Override
public List supplierThirtyProcurementStatistics(String supplierAndClinicId, String startTime, String endTime,Integer roleType) {
return this.baseMapper.supplierThirtyProcurementStatistics(supplierAndClinicId, startTime, endTime, roleType);
}
@Override
public List supplierThirtyMoneyProcurementStatistics(String supplierAndClinicId, String startTime, String endTime,Integer roleType) {
return this.baseMapper.supplierThirtyMoneyProcurementStatistics(supplierAndClinicId, startTime, endTime, roleType);
}
@Override
public Integer supplierSalesStatisticsTypeCount(String supplierId) {
return this.baseMapper.supplierSalesStatisticsTypeCount(supplierId);
}
@Override
public Integer supplierSalesStatisticsCount(String supplierId) {
return this.baseMapper.supplierSalesStatisticsCount(supplierId);
}
@Override
public BigDecimal supplierSalesStatisticsMoney(String supplierId, String startTime, String endTime) {
return this.baseMapper.supplierSalesStatisticsMoney(supplierId,startTime, endTime);
}
@Override
public List supplierSalesStatisticsGoodsType(String supplierId, String startTime, String endTime) {
return this.baseMapper.supplierSalesStatisticsGoodsType(supplierId,startTime, endTime);
}
@Override
public List supplierSalesStatisticsGoodsCount(String supplierId, String startTime, String endTime, String goodsName) {
return this.baseMapper.supplierSalesStatisticsGoodsCount(supplierId,startTime, endTime,goodsName);
}
@Override
public List supplierSalesStatisticsGoodsCountMonth(String supplierId, String startTime, String endTime, String goodsName) {
return this.baseMapper.supplierSalesStatisticsGoodsCountMonth(supplierId,startTime, endTime,goodsName);
}
@Override
public List branchAdminStatisticsThree(List clinicIds) {
return this.baseMapper.branchAdminStatisticsThree(clinicIds);
}
@Override
public PageInfo clinicProcurementReport(ClinicProcurementReportQuery query) {
PageInfo pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
List list = this.baseMapper.clinicProcurementReport(query, pageInfo);
if(CollectionUtils.isEmpty(list)){
return pageInfo;
}
List procurementIds = list.stream().map(TErpProcurement::getId).collect(Collectors.toList());
List erpProcurementGoods = erpProcurementGoodsMapper.selectList(new QueryWrapper().lambda().in(TErpProcurementGoods::getProcurementId, procurementIds));
for (ClinicProcurementReportVO clinicProcurementReportVO : list) {
List procurementGoods = erpProcurementGoods.stream().filter(tErpProcurementGoods -> tErpProcurementGoods.getProcurementId().equals(clinicProcurementReportVO.getId())).collect(Collectors.toList());
if(!CollectionUtils.isEmpty(procurementGoods)){
int sum = procurementGoods.stream().mapToInt(TErpProcurementGoods::getPurchaseCount).sum();
clinicProcurementReportVO.setProcurementGoodsNum(sum);
}
}
pageInfo.setRecords(list);
return pageInfo;
}
@Override
public List exportProcurementReportClinic(ClinicProcurementReportQuery query) {
List list = this.baseMapper.exportProcurementReportClinic(query);
if(CollectionUtils.isEmpty(list)){
return new ArrayList<>();
}
List procurementIds = list.stream().map(ProcurementReportClinicExport::getId).collect(Collectors.toList());
List erpProcurementGoods = erpProcurementGoodsMapper.selectList(new QueryWrapper().lambda().in(TErpProcurementGoods::getProcurementId, procurementIds));
for (ProcurementReportClinicExport procurementReportClinicExport : list) {
List procurementGoods = erpProcurementGoods.stream().filter(tErpProcurementGoods -> tErpProcurementGoods.getProcurementId().equals(procurementReportClinicExport.getId())).collect(Collectors.toList());
if(!CollectionUtils.isEmpty(procurementGoods)){
int sum = procurementGoods.stream().mapToInt(TErpProcurementGoods::getPurchaseCount).sum();
procurementReportClinicExport.setProcurementGoodsNum(sum);
}
if(Objects.nonNull(procurementReportClinicExport.getPayTime())){
String payTimeStr = new SimpleDateFormat("yyyy-MM-dd").format(DateUtils.localDateTimeToDate(procurementReportClinicExport.getPayTime()));
procurementReportClinicExport.setPayTimeStr(payTimeStr);
}
}
return list;
}
@Override
public List exportProcurementReportSupplier(ClinicProcurementReportQuery query) {
List list = this.baseMapper.exportProcurementReportSupplier(query);
if(CollectionUtils.isEmpty(list)){
return new ArrayList<>();
}
for (ProcurementReportSupplierExport procurementReportSupplierExport : list) {
if(Objects.nonNull(procurementReportSupplierExport.getPayTime())){
String payTimeStr = new SimpleDateFormat("yyyy-MM-dd").format(DateUtils.localDateTimeToDate(procurementReportSupplierExport.getPayTime()));
procurementReportSupplierExport.setPayTimeStr(payTimeStr);
}
}
return list;
}
@Override
public List exportProcurementReportPlatform(ClinicProcurementReportQuery query) {
List list = this.baseMapper.exportProcurementReportPlatform(query);
if(CollectionUtils.isEmpty(list)){
return new ArrayList<>();
}
for (ProcurementReportPlatformExport procurementReportPlatformExport : list) {
if(Objects.nonNull(procurementReportPlatformExport.getPayTime())){
String payTimeStr = new SimpleDateFormat("yyyy-MM-dd").format(DateUtils.localDateTimeToDate(procurementReportPlatformExport.getPayTime()));
procurementReportPlatformExport.setPayTimeStr(payTimeStr);
}
}
return list;
}
@Override
public PageInfo platformLedgerReport(ClinicProcurementReportQuery query) {
PageInfo pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
List list = this.baseMapper.platformLedgerReport(query, pageInfo);
pageInfo.setRecords(list);
return pageInfo;
}
@Override
public List exportPlatformLedgerReport(ClinicProcurementReportQuery query) {
List list = this.baseMapper.exportPlatformLedgerReport(query);
if(CollectionUtils.isEmpty(list)){
return new ArrayList<>();
}
for (PlatformLedgerReportExport platformLedgerReportExport : list) {
if(Objects.nonNull(platformLedgerReportExport.getPayTime())){
String payTimeStr = new SimpleDateFormat("yyyy-MM-dd").format(DateUtils.localDateTimeToDate(platformLedgerReportExport.getPayTime()));
platformLedgerReportExport.setPayTimeStr(payTimeStr);
}
}
return list;
}
@Override
public PageInfo branchPerformanceReport(PerformanceReportQuery query) {
List clinicIds = new ArrayList<>();
List crmBranchAreas = new ArrayList<>();
if(StringUtils.isNotEmpty(query.getCityCode())){
crmBranchAreas = crmBranchAreaMapper.selectList(Wrappers.lambdaQuery(TCrmBranchArea.class)
.eq(TCrmBranchArea::getCityCode, query.getCityCode())
.eq(TCrmBranchArea::getAreaType, 2));
if(CollectionUtils.isEmpty(crmBranchAreas)){
return new PageInfo<>();
}
}
if(StringUtils.isNotEmpty(query.getProvinceCode())){
crmBranchAreas = crmBranchAreaMapper.selectList(Wrappers.lambdaQuery(TCrmBranchArea.class)
.eq(TCrmBranchArea::getProvinceCode, query.getProvinceCode())
.eq(TCrmBranchArea::getAreaType, 2));
if(CollectionUtils.isEmpty(crmBranchAreas)){
return new PageInfo<>();
}
}
if(!CollectionUtils.isEmpty(crmBranchAreas)){
List branchIds = crmBranchAreas.stream().map(TCrmBranchArea::getBranchId).collect(Collectors.toList());
List crmClinics = crmClinicMapper.selectList(Wrappers.lambdaQuery(TCrmClinic.class)
.in(TCrmClinic::getBranchId, branchIds));
if(CollectionUtils.isEmpty(crmClinics)){
return new PageInfo<>();
}
List ids = crmClinics.stream().map(TCrmClinic::getId).collect(Collectors.toList());
clinicIds.addAll(ids);
}
if(StringUtils.isNotBlank(query.getBranchName())){
// 查询分公司名称
List crmBranches = crmBranchMapper.selectList(Wrappers.lambdaQuery(TCrmBranch.class)
.like(TCrmBranch::getBranchName, query.getBranchName()));
if(CollectionUtils.isEmpty(crmBranches)){
return new PageInfo<>();
}
List branchIds = crmBranches.stream().map(TCrmBranch::getId).collect(Collectors.toList());
List crmClinics = crmClinicMapper.selectList(Wrappers.lambdaQuery(TCrmClinic.class)
.in(TCrmClinic::getBranchId, branchIds));
if(CollectionUtils.isEmpty(crmClinics)){
return new PageInfo<>();
}
List ids = crmClinics.stream().map(TCrmClinic::getId).collect(Collectors.toList());
clinicIds.addAll(ids);
}
clinicIds = clinicIds.stream().distinct().collect(Collectors.toList());
query.setClinicIds(clinicIds);
PageInfo pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
List list = this.baseMapper.branchPerformanceReport(query, pageInfo);
if(CollectionUtils.isEmpty(list)){
return pageInfo;
}
List procurementIds = list.stream().map(BranchPerformanceReportVO::getId).collect(Collectors.toList());
// 查询可获得积分
List crmChangePoints = crmChangePointsMapper.selectList(Wrappers.lambdaQuery(TCrmChangePoints.class)
.in(TCrmChangePoints::getProcurementId, procurementIds)
.eq(TCrmChangePoints::getUserType, 1)
.eq(TCrmChangePoints::getChangeType, 1)
.eq(TCrmChangePoints::getChangeReason, 1));
// 查询业绩
List erpProcurementCommissions = erpProcurementCommissionMapper.selectList(Wrappers.lambdaQuery(TErpProcurementCommission.class)
.in(TErpProcurementCommission::getProcurementId, procurementIds)
.eq(TErpProcurementCommission::getCommissionType, 1));
for (BranchPerformanceReportVO branchPerformanceReportVO : list) {
// 查询可获得积分
List changePoints = crmChangePoints.stream().filter(tCrmChangePoints -> branchPerformanceReportVO.getId().equals(tCrmChangePoints.getProcurementId())).collect(Collectors.toList());
if(!CollectionUtils.isEmpty(changePoints)){
branchPerformanceReportVO.setAvailablePoints(changePoints.stream().mapToInt(TCrmChangePoints::getChangeValue).sum());
}
// 查询业绩
List commissions = erpProcurementCommissions.stream().filter(tErpProcurementCommission -> branchPerformanceReportVO.getId().equals(tErpProcurementCommission.getProcurementId())).collect(Collectors.toList());
if(!CollectionUtils.isEmpty(commissions)){
branchPerformanceReportVO.setPerformance(commissions.stream().map(TErpProcurementCommission::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add));
}
}
pageInfo.setRecords(list);
return pageInfo;
}
@Override
public PageInfo salespersonPerformanceReport(PerformanceReportQuery query) {
List clinicIds = new ArrayList<>();
if(StringUtils.isNotBlank(query.getBranchName())){
// 查询分公司名称
List crmBranches = crmBranchMapper.selectList(Wrappers.lambdaQuery(TCrmBranch.class)
.like(TCrmBranch::getBranchName, query.getBranchName()));
if(CollectionUtils.isEmpty(crmBranches)){
return new PageInfo<>();
}
List branchIds = crmBranches.stream().map(TCrmBranch::getId).collect(Collectors.toList());
List crmClinics = crmClinicMapper.selectList(Wrappers.lambdaQuery(TCrmClinic.class)
.in(TCrmClinic::getBranchId, branchIds));
if(CollectionUtils.isEmpty(crmClinics)){
return new PageInfo<>();
}
List ids = crmClinics.stream().map(TCrmClinic::getId).collect(Collectors.toList());
clinicIds.addAll(ids);
}
if(StringUtils.isNotBlank(query.getSalespersonName())){
// 查询业务员名称
List crmSalespeopleList = crmSalespersonMapper.selectList(Wrappers.lambdaQuery(TCrmSalesperson.class)
.like(TCrmSalesperson::getSalespersonName, query.getSalespersonName()));
if(CollectionUtils.isEmpty(crmSalespeopleList)){
return new PageInfo<>();
}
List salespersonIds = crmSalespeopleList.stream().map(TCrmSalesperson::getId).collect(Collectors.toList());
List crmClinics = crmClinicMapper.selectList(Wrappers.lambdaQuery(TCrmClinic.class)
.in(TCrmClinic::getSalespersonId, salespersonIds));
if(CollectionUtils.isEmpty(crmClinics)){
return new PageInfo<>();
}
List ids = crmClinics.stream().map(TCrmClinic::getId).collect(Collectors.toList());
clinicIds.addAll(ids);
}
clinicIds = clinicIds.stream().distinct().collect(Collectors.toList());
query.setClinicIds(clinicIds);
PageInfo pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
List list = this.baseMapper.salespersonPerformanceReport(query, pageInfo);
if(CollectionUtils.isEmpty(list)){
return pageInfo;
}
List procurementIds = list.stream().map(SalespersonPerformanceReportVO::getId).collect(Collectors.toList());
// 查询可获得积分
List crmChangePoints = crmChangePointsMapper.selectList(Wrappers.lambdaQuery(TCrmChangePoints.class)
.in(TCrmChangePoints::getProcurementId, procurementIds)
.eq(TCrmChangePoints::getUserType, 2)
.eq(TCrmChangePoints::getChangeType, 1)
.eq(TCrmChangePoints::getChangeReason, 1));
// 查询业绩
List erpProcurementCommissions = erpProcurementCommissionMapper.selectList(Wrappers.lambdaQuery(TErpProcurementCommission.class)
.in(TErpProcurementCommission::getProcurementId, procurementIds)
.eq(TErpProcurementCommission::getCommissionType, 2));
for (SalespersonPerformanceReportVO salespersonPerformanceReportVO : list) {
// 查询可获得积分
List changePoints = crmChangePoints.stream().filter(tCrmChangePoints -> salespersonPerformanceReportVO.getId().equals(tCrmChangePoints.getProcurementId())).collect(Collectors.toList());
if(!CollectionUtils.isEmpty(changePoints)){
salespersonPerformanceReportVO.setAvailablePoints(changePoints.stream().mapToInt(TCrmChangePoints::getChangeValue).sum());
}
// 查询业绩
List commissions = erpProcurementCommissions.stream().filter(tErpProcurementCommission -> salespersonPerformanceReportVO.getId().equals(tErpProcurementCommission.getProcurementId())).collect(Collectors.toList());
if(!CollectionUtils.isEmpty(commissions)){
salespersonPerformanceReportVO.setPerformance(commissions.stream().map(TErpProcurementCommission::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add));
}
}
pageInfo.setRecords(list);
return pageInfo;
}
@Override
public List exportBranchPerformanceReport(PerformanceReportQuery query) {
List clinicIds = new ArrayList<>();
List crmBranchAreas = new ArrayList<>();
if(StringUtils.isNotEmpty(query.getCityCode())){
crmBranchAreas = crmBranchAreaMapper.selectList(Wrappers.lambdaQuery(TCrmBranchArea.class)
.eq(TCrmBranchArea::getCityCode, query.getCityCode())
.eq(TCrmBranchArea::getAreaType, 2));
}
if(StringUtils.isNotEmpty(query.getProvinceCode())){
crmBranchAreas = crmBranchAreaMapper.selectList(Wrappers.lambdaQuery(TCrmBranchArea.class)
.eq(TCrmBranchArea::getProvinceCode, query.getProvinceCode())
.eq(TCrmBranchArea::getAreaType, 2));
}
if(!CollectionUtils.isEmpty(crmBranchAreas)){
List branchIds = crmBranchAreas.stream().map(TCrmBranchArea::getBranchId).collect(Collectors.toList());
List crmClinics = crmClinicMapper.selectList(Wrappers.lambdaQuery(TCrmClinic.class)
.in(TCrmClinic::getBranchId, branchIds));
if(CollectionUtils.isEmpty(crmClinics)){
return new ArrayList<>();
}
List ids = crmClinics.stream().map(TCrmClinic::getId).collect(Collectors.toList());
clinicIds.addAll(ids);
}
if(StringUtils.isNotBlank(query.getBranchName())){
// 查询分公司名称
List crmBranches = crmBranchMapper.selectList(Wrappers.lambdaQuery(TCrmBranch.class)
.like(TCrmBranch::getBranchName, query.getBranchName()));
if(CollectionUtils.isEmpty(crmBranches)){
return new ArrayList<>();
}
List branchIds = crmBranches.stream().map(TCrmBranch::getId).collect(Collectors.toList());
List crmClinics = crmClinicMapper.selectList(Wrappers.lambdaQuery(TCrmClinic.class)
.in(TCrmClinic::getBranchId, branchIds));
if(CollectionUtils.isEmpty(crmClinics)){
return new ArrayList<>();
}
List ids = crmClinics.stream().map(TCrmClinic::getId).collect(Collectors.toList());
clinicIds.addAll(ids);
}
query.setClinicIds(clinicIds);
List list = this.baseMapper.exportBranchPerformanceReport(query);
if(CollectionUtils.isEmpty(list)){
return new ArrayList<>();
}
List procurementIds = list.stream().map(BranchPerformanceReportVO::getId).collect(Collectors.toList());
// 查询可获得积分
List crmChangePoints = crmChangePointsMapper.selectList(Wrappers.lambdaQuery(TCrmChangePoints.class)
.in(TCrmChangePoints::getProcurementId, procurementIds)
.eq(TCrmChangePoints::getUserType, 1)
.eq(TCrmChangePoints::getChangeType, 1)
.eq(TCrmChangePoints::getChangeReason, 1));
// 查询业绩
List erpProcurementCommissions = erpProcurementCommissionMapper.selectList(Wrappers.lambdaQuery(TErpProcurementCommission.class)
.in(TErpProcurementCommission::getProcurementId, procurementIds)
.eq(TErpProcurementCommission::getCommissionType, 1));
for (BranchPerformanceReportVO branchPerformanceReportVO : list) {
// 查询可获得积分
List changePoints = crmChangePoints.stream().filter(tCrmChangePoints -> branchPerformanceReportVO.getId().equals(tCrmChangePoints.getProcurementId())).collect(Collectors.toList());
if(!CollectionUtils.isEmpty(changePoints)){
branchPerformanceReportVO.setAvailablePoints(changePoints.stream().mapToInt(TCrmChangePoints::getChangeValue).sum());
}
// 查询业绩
List commissions = erpProcurementCommissions.stream().filter(tErpProcurementCommission -> branchPerformanceReportVO.getId().equals(tErpProcurementCommission.getProcurementId())).collect(Collectors.toList());
if(!CollectionUtils.isEmpty(commissions)){
branchPerformanceReportVO.setPerformance(commissions.stream().map(TErpProcurementCommission::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add));
}
if(Objects.nonNull(branchPerformanceReportVO.getPayTime())){
String payTimeStr = new SimpleDateFormat("yyyy-MM-dd").format(DateUtils.localDateTimeToDate(branchPerformanceReportVO.getPayTime()));
branchPerformanceReportVO.setPayTimeStr(payTimeStr);
}
}
return list;
}
@Override
public List exportSalespersonPerformanceReport(PerformanceReportQuery query) {
List clinicIds = new ArrayList<>();
if(StringUtils.isNotBlank(query.getBranchName())){
// 查询分公司名称
List crmBranches = crmBranchMapper.selectList(Wrappers.lambdaQuery(TCrmBranch.class)
.like(TCrmBranch::getBranchName, query.getBranchName()));
if(CollectionUtils.isEmpty(crmBranches)){
return new ArrayList<>();
}
List branchIds = crmBranches.stream().map(TCrmBranch::getId).collect(Collectors.toList());
List crmClinics = crmClinicMapper.selectList(Wrappers.lambdaQuery(TCrmClinic.class)
.in(TCrmClinic::getBranchId, branchIds));
if(CollectionUtils.isEmpty(crmClinics)){
return new ArrayList<>();
}
List ids = crmClinics.stream().map(TCrmClinic::getId).collect(Collectors.toList());
clinicIds.addAll(ids);
}
if(StringUtils.isNotBlank(query.getSalespersonName())){
// 查询业务员名称
List crmSalespeopleList = crmSalespersonMapper.selectList(Wrappers.lambdaQuery(TCrmSalesperson.class)
.like(TCrmSalesperson::getSalespersonName, query.getSalespersonName()));
if(CollectionUtils.isEmpty(crmSalespeopleList)){
return new ArrayList<>();
}
List salespersonIds = crmSalespeopleList.stream().map(TCrmSalesperson::getId).collect(Collectors.toList());
List crmClinics = crmClinicMapper.selectList(Wrappers.lambdaQuery(TCrmClinic.class)
.in(TCrmClinic::getSalespersonId, salespersonIds));
if(CollectionUtils.isEmpty(crmClinics)){
return new ArrayList<>();
}
List ids = crmClinics.stream().map(TCrmClinic::getId).collect(Collectors.toList());
clinicIds.addAll(ids);
}
clinicIds = clinicIds.stream().distinct().collect(Collectors.toList());
query.setClinicIds(clinicIds);
List list = this.baseMapper.exportSalespersonPerformanceReport(query);
if(CollectionUtils.isEmpty(list)){
return new ArrayList<>();
}
List procurementIds = list.stream().map(SalespersonPerformanceReportVO::getId).collect(Collectors.toList());
// 查询可获得积分
List crmChangePoints = crmChangePointsMapper.selectList(Wrappers.lambdaQuery(TCrmChangePoints.class)
.in(TCrmChangePoints::getProcurementId, procurementIds)
.eq(TCrmChangePoints::getUserType, 2)
.eq(TCrmChangePoints::getChangeType, 1)
.eq(TCrmChangePoints::getChangeReason, 1));
// 查询业绩
List erpProcurementCommissions = erpProcurementCommissionMapper.selectList(Wrappers.lambdaQuery(TErpProcurementCommission.class)
.in(TErpProcurementCommission::getProcurementId, procurementIds)
.eq(TErpProcurementCommission::getCommissionType, 2));
for (SalespersonPerformanceReportVO salespersonPerformanceReportVO : list) {
// 查询可获得积分
List changePoints = crmChangePoints.stream().filter(tCrmChangePoints -> salespersonPerformanceReportVO.getId().equals(tCrmChangePoints.getProcurementId())).collect(Collectors.toList());
if(!CollectionUtils.isEmpty(changePoints)){
salespersonPerformanceReportVO.setAvailablePoints(changePoints.stream().mapToInt(TCrmChangePoints::getChangeValue).sum());
}
// 查询业绩
List commissions = erpProcurementCommissions.stream().filter(tErpProcurementCommission -> salespersonPerformanceReportVO.getId().equals(tErpProcurementCommission.getProcurementId())).collect(Collectors.toList());
if(!CollectionUtils.isEmpty(commissions)){
salespersonPerformanceReportVO.setPerformance(commissions.stream().map(TErpProcurementCommission::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add));
}
if(Objects.nonNull(salespersonPerformanceReportVO.getPayTime())){
String payTimeStr = new SimpleDateFormat("yyyy-MM-dd").format(DateUtils.localDateTimeToDate(salespersonPerformanceReportVO.getPayTime()));
salespersonPerformanceReportVO.setPayTimeStr(payTimeStr);
}
}
return list;
}
@Override
public List clinicProcurementReportDetail(String id) {
return this.baseMapper.clinicProcurementReportDetail(id);
}
@Override
public List exportProcurementReportDetail(List procurementIds) {
return this.baseMapper.exportProcurementReportDetail(procurementIds);
}
}