package com.xzx.gc.order.service; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.exceptions.ExceptionUtil; import cn.hutool.core.lang.Dict; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.StrUtil; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.xzx.gc.common.Result; import com.xzx.gc.common.constant.CommonEnum; import com.xzx.gc.common.constant.Constants; import com.xzx.gc.common.constant.OrderEnum; import com.xzx.gc.common.constant.PayEnum; import com.xzx.gc.common.dto.SimplePage; import com.xzx.gc.common.exception.BusinessException; import com.xzx.gc.common.exception.RestException; import com.xzx.gc.common.utils.*; import com.xzx.gc.entity.*; import com.xzx.gc.model.admin.PayRequestInfoModel; import com.xzx.gc.model.admin.PayStorageModel; import com.xzx.gc.model.admin.StorageUserModel; import com.xzx.gc.model.comon.account.AllAcountParamDto; import com.xzx.gc.model.order.OrderInfoReq; import com.xzx.gc.model.order.RkStatisticsStorageReceiverDto; import com.xzx.gc.model.user.AccountVo; import com.xzx.gc.order.dto.*; import com.xzx.gc.order.mapper.*; import com.xzx.gc.service.AccountContext; import com.xzx.gc.util.DoubleUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import tk.mybatis.mapper.entity.Example; import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.ParseException; import java.util.*; import java.util.stream.Collectors; @Service @Transactional @Slf4j public class StorageService { @Autowired private PayInfoMapper payInfoMapper; @Autowired private IdUtils idUtils; @Autowired private OrderItemInfoMapper orderItemInfoMapper; @Autowired private OrderBatchInfoMapper orderBatchInfoMapper; @Autowired private OrderBatchMapper orderBatchMapper; @Autowired private RedisUtil redisUtil; @Autowired private AddressMapper addressMapper; @Autowired private OrderStorageDetailMapper orderStorageDetailMapper; @Autowired private SysStorageService sysStorageService; @Autowired private OrderDetailService orderDetailService; @Autowired private OrderClockInMapper orderClockInMapper; @Autowired private OrderStorageInfoMapper orderStorageInfoMapper; @Autowired private OrderDetailMapper orderDetailMapper; @Autowired private SysStorageMapper sysStorageMapper; @Autowired private OrderBatchInfoService orderBatchInfoService; @Autowired private OrderMapper orderMapper; @Autowired private PackageGoodsInfoService packageGoodsInfoService; @Autowired private PromotionRebateService promotionRebateService; @Autowired private OtherUserMapper otherUserMapper; @Autowired private AccountMapper accountMapper; @Autowired private OrderService orderService; @Autowired private HttpServletRequest request; @Autowired private BusinessUtil businessUtil; @Autowired private OtherUserService otherUserService; @Autowired private SysEnvironmentalInfoService sysEnvironmentalInfoService; @Autowired private WeightItemPriceService weightItemPriceService; @Autowired private CityPartnerService cityPartnerService; @Autowired private PartnerGaodeService partnerGaodeService; @Autowired private UserVehicleInfoService userVehicleInfoService; @Autowired private OrderHomeApplianceService orderHomeApplianceService; /** * 入库详情 * @param storageId * @return */ public StorageDetailBatchDto detail(String storageId){ StorageDetailBatchDto storageDetailBatchDto=new StorageDetailBatchDto(); //物品清单 OrderStorageDetailInfo orderStorageDetailInfo=new OrderStorageDetailInfo(); orderStorageDetailInfo.setStorageId(storageId); List select = orderStorageDetailMapper.select(orderStorageDetailInfo); Example example=new Example(OrderStorageInfo.class); Example.Criteria criteria = example.createCriteria(); criteria.andEqualTo("storageId",storageId); OrderStorageInfo orderStorageInfo = orderStorageInfoMapper.selectOneByExample(example); Long sysStorageId = orderStorageInfo.getSysStorageId(); Short sysStorageType = orderStorageInfo.getSysStorageType(); if(CollUtil.isNotEmpty(select)){ Map map=new HashMap<>(); for (OrderStorageDetailInfo storageDetailInfo : select) { String flag = storageDetailInfo.getFlag(); BigDecimal weight = storageDetailInfo.getWeight(); String amount = storageDetailInfo.getAmount(); String money = storageDetailInfo.getMoney(); String itemType = storageDetailInfo.getItemType(); String price=storageDetailInfo.getPrice(); if(OrderEnum.入库型.getValue().equals(flag)&&weight!=null&&weight.compareTo(BigDecimal.ZERO)!=0){ if(map.containsKey(itemType)){ Dict dict = map.get(itemType); BigDecimal storageWeight1 = dict.getBigDecimal("storageWeight"); dict.set("storageWeight",NumberUtil.add(storageWeight1,weight)); BigDecimal storageMoney1 = dict.getBigDecimal("storageMoney"); dict.set("storageMoney",NumberUtil.add(storageMoney1,Convert.toBigDecimal(money))); map.put(itemType,dict); }else{ Dict dict=Dict.create(); dict.set("storageWeight",weight); dict.set("storageMoney",new BigDecimal(money)); dict.set("price",price); map.put(itemType,dict); } } if(OrderEnum.入库型.getValue().equals(flag)&&amount!=null&&Convert.toBigDecimal(amount,BigDecimal.ZERO).compareTo(BigDecimal.ZERO)!=0){ if(map.containsKey(itemType)){ Dict dict = map.get(itemType); BigDecimal storageAmount1 = dict.getBigDecimal("storageAmount"); dict.set("storageAmount",NumberUtil.add(storageAmount1,Convert.toBigDecimal(amount))); BigDecimal storageMoney1 = dict.getBigDecimal("storageMoney"); dict.set("storageMoney",NumberUtil.add(storageMoney1,Convert.toBigDecimal(money))); map.put(itemType,dict); }else{ Dict dict=Dict.create(); dict.set("storageAmount",Convert.toBigDecimal(amount)); dict.set("storageMoney",new BigDecimal(money)); dict.set("price",price); map.put(itemType,dict); } } if(OrderEnum.回收型.getValue().equals(flag)&&weight!=null&&weight.compareTo(BigDecimal.ZERO)!=0){ if(map.containsKey(itemType)){ Dict dict = map.get(itemType); BigDecimal recyleweight1 = dict.getBigDecimal("recyleweight"); dict.set("recyleweight",NumberUtil.add(recyleweight1,weight)); BigDecimal recyleMoney1 = dict.getBigDecimal("recyleMoney"); dict.set("recyleMoney",NumberUtil.add(recyleMoney1,Convert.toBigDecimal(money))); map.put(itemType,dict); }else{ Dict dict=Dict.create(); dict.set("recyleweight",weight); dict.set("recyleMoney",new BigDecimal(money)); dict.set("price",price); map.put(itemType,dict); } } if(OrderEnum.回收型.getValue().equals(flag)&&amount!=null&&Convert.toBigDecimal(amount,BigDecimal.ZERO).compareTo(BigDecimal.ZERO)!=0){ if(map.containsKey(itemType)){ Dict dict = map.get(itemType); BigDecimal recyleAmount1 = dict.getBigDecimal("recyleAmount"); dict.set("recyleAmount",NumberUtil.add(recyleAmount1,Convert.toBigDecimal(amount))); BigDecimal recyleMoney1 = dict.getBigDecimal("recyleMoney"); dict.set("recyleMoney",NumberUtil.add(recyleMoney1,Convert.toBigDecimal(money))); map.put(itemType,dict); }else{ Dict dict=Dict.create(); dict.set("recyleAmount",Convert.toBigDecimal(amount)); dict.set("recyleMoney",new BigDecimal(money)); dict.set("price",price); map.put(itemType,dict); } } } if(MapUtil.isNotEmpty(map)){ List list=new ArrayList<>(); for (String s : map.keySet()) { OrderStorageDetailInfo orderStorageDetailInfo1=new OrderStorageDetailInfo(); //选取仓库价格 SysEnvironmentalInfo sysEnvironmentalInfo1=new SysEnvironmentalInfo(); if(Convert.toShort(OrderEnum.打包站.getValue()).equals(sysStorageType)){ PackageGoodsInfo byPackageId = packageGoodsInfoService.findByPackageIdAndItemType(sysStorageId.toString(),s); BeanUtil.copyProperties(byPackageId,sysEnvironmentalInfo1); }else if(Convert.toShort(OrderEnum.仓库.getValue()).equals(sysStorageType)){ SysStorage byId1 = sysStorageService.findById(Convert.toInt(sysStorageId)); Integer areaId = Convert.toInt(byId1.getArea()); sysEnvironmentalInfo1 = sysEnvironmentalInfoService.findByItemTypeAndArea(s, areaId); } Dict dict = map.get(s); String price = dict.getStr("price"); //设置分类价格等 orderStorageDetailInfo1.setItemTypeName(sysEnvironmentalInfo1.getTitle()); if(StrUtil.isNotBlank(price)){ orderStorageDetailInfo1.setItemTypePrice(price); }else { orderStorageDetailInfo1.setItemTypePrice(sysEnvironmentalInfo1.getPrice()); } orderStorageDetailInfo1.setItemTypePicture(sysEnvironmentalInfo1.getPicture()); //上门价格 orderStorageDetailInfo1.setItemTypePrice2(sysEnvironmentalInfo1.getSecondPrice()); BigDecimal recyleweight = dict.getBigDecimal("recyleweight"); BigDecimal recyleMoney = dict.getBigDecimal("recyleMoney"); BigDecimal recyleAmount = dict.getBigDecimal("recyleAmount"); BigDecimal storageWeight = dict.getBigDecimal("storageWeight"); BigDecimal storageMoney = dict.getBigDecimal("storageMoney"); BigDecimal storageAmount= dict.getBigDecimal("storageAmount"); if(recyleweight!=null&&recyleweight.compareTo(BigDecimal.ZERO)!=0){ orderStorageDetailInfo1.setWeight(recyleweight); } if(recyleMoney!=null&&recyleMoney.compareTo(BigDecimal.ZERO)!=0){ orderStorageDetailInfo1.setMoney(recyleMoney.toString()); } if(recyleAmount!=null&&recyleAmount.compareTo(BigDecimal.ZERO)!=0){ orderStorageDetailInfo1.setAmount(Convert.toStr(recyleAmount)); } if(storageWeight!=null&&storageWeight.compareTo(BigDecimal.ZERO)!=0){ orderStorageDetailInfo1.setStorageWeight(storageWeight); } if(storageMoney!=null&&storageMoney.compareTo(BigDecimal.ZERO)!=0){ orderStorageDetailInfo1.setStorageMoney(storageMoney.toString()); } if(storageAmount!=null&&storageAmount.compareTo(BigDecimal.ZERO)!=0){ orderStorageDetailInfo1.setStorageAmount(storageAmount); } list.add(orderStorageDetailInfo1); } storageDetailBatchDto.setList(list); } } //获取地称的 OrderBatchInfo batchInfo=new OrderBatchInfo(); String orderId = orderStorageInfo.getOrderId(); Example example1=new Example(OrderBatchInfo.class); Example.Criteria criteria1 = example1.createCriteria(); criteria1.andEqualTo("orderId",orderId); criteria1.andEqualTo("status",OrderEnum.已入库.getValue()); OrderBatchInfo orderBatchInfo = orderBatchInfoMapper.selectOneByExample(example1); if(orderBatchInfo!=null){ String weight = orderBatchInfo.getWeight(); batchInfo.setWeight(weight); OrderClockIn today = orderClockInMapper.findToday(orderStorageInfo.getReceiver(), StrUtil.split(orderBatchInfo.getCreateTime(),"")[0]); if(today!=null){ batchInfo.setEmptyWeight(today.getWeight()); } } //获取仓库名称 if(Convert.toShort(OrderEnum.打包站.getValue()).equals(sysStorageType)){ CityPartner sysStorage = cityPartnerService.findById(Convert.toInt(sysStorageId)); if(sysStorage!=null){ orderStorageInfo.setSysStorageName(sysStorage.getPartnerName()); } }else if(Convert.toShort(OrderEnum.仓库.getValue()).equals(sysStorageType)){ SysStorage sysStorage = sysStorageMapper.selectByPrimaryKey(sysStorageId); if(sysStorage!=null){ orderStorageInfo.setSysStorageName(sysStorage.getStorageName()); } } storageDetailBatchDto.setOrderStorageInfo(orderStorageInfo); //设置地称信息 if(StrUtil.isBlank(batchInfo.getWeight())) { batchInfo.setWeight(Convert.toStr(Constants.WEIGHT_INIT)); } if(StrUtil.isBlank(batchInfo.getEmptyWeight())) { batchInfo.setEmptyWeight(Convert.toStr(Constants.WEIGHT_INIT)); } storageDetailBatchDto.setOrderBatchInfo(batchInfo); return storageDetailBatchDto; } /** * 查看回收订单 * @param storageId * @return */ public List recyledDetail(String storageId) { OrderStorageInfo orderStorageInfo = orderStorageInfoMapper.selectByPrimaryKey(storageId); if(orderStorageInfo==null){ throw new RestException(-1,"入库订单不存在"); } String orderId = orderStorageInfo.getOrderId(); String[] split = orderId.split(","); List list=new ArrayList<>(); for (String s : split) { OrderDetailInfo orderDetailInfo = orderDetailMapper.selectByPrimaryKey(s); //地址 Long addressId = orderDetailInfo.getAddressId(); AddressInfo addressInfo = addressMapper.selectByPrimaryKey(addressId); orderDetailInfo.setAddress(StrUtil.nullToEmpty(addressInfo.getAddressArea())+addressInfo.getDetailAddress()); //重新赋值回收员真实名称 源于小程序这边存入的是昵称 String receiverPhone = orderDetailInfo.getReceiverPhone(); if(StrUtil.isNotBlank(receiverPhone)) { OtherUserInfo otherUserInfo1 = otherUserService.findByMobileAndUserType(receiverPhone,CommonEnum.回收员.getValue()); if(otherUserInfo1!=null) { orderDetailInfo.setReceiverName(otherUserInfo1.getName()); } } //回收的物品 OrderItemInfo orderItemInfo=new OrderItemInfo(); orderItemInfo.setOrderId(s); List orderItemInfos = orderItemInfoMapper.select(orderItemInfo); List itemTypeNames=new ArrayList<>(); if(CollUtil.isNotEmpty(orderItemInfos)){ List collect = orderItemInfos.stream().filter(x -> (StrUtil.isNotBlank(x.getWeight())&&Convert.toBigDecimal(x.getWeight()).compareTo(BigDecimal.ZERO)!=0)||(StrUtil.isNotBlank(x.getAmount())&&Convert.toBigDecimal(x.getAmount()).compareTo(BigDecimal.ZERO)!=0)).collect(Collectors.toList()); if(CollUtil.isNotEmpty(collect)){ for (OrderItemInfo itemInfo : collect) { String itemType = itemInfo.getItemType(); SysEnvironmentalInfo sysEnvironmentalInfo1 = sysEnvironmentalInfoService.findByItemTypeAndArea(itemType,Convert.toInt(Constants.TIANXIN_CODE)); if(sysEnvironmentalInfo1!=null) { itemTypeNames.add(sysEnvironmentalInfo1.getTitle()); } } orderDetailInfo.setItemTypeName(CollUtil.join(itemTypeNames,"、")); } } list.add(orderDetailInfo); } return list; } /** * 统计 * @param userId * @param userType * @return */ public RkStatisticsDto statistics(String userId,String userType,String data,String receiver){ RkStatisticsDto rkStatisticsDto=new RkStatisticsDto(); RkStatisticsStorageDto rkStatisticsStorageDto=new RkStatisticsStorageDto(); RkStatisticsRecyleDto rkStatisticsRecyleDto=new RkStatisticsRecyleDto(); Example example=new Example(OrderStorageInfo.class); Example.Criteria criteria = example.createCriteria(); criteria.andEqualTo("storageStatus",OrderEnum.已入库.getValue()); if(CommonEnum.回收员.getValue().equals(userType)){ criteria.andEqualTo("receiver",userId); }else if(CommonEnum.入库员.getValue().equals(userType)||CommonEnum.打包员.getValue().equals(userType)){ criteria.andEqualTo("storageUserId",userId); }else if(CommonEnum.打包站运营员.getValue().equals(userType)){ criteria.andEqualTo("sysStorageType",OrderEnum.打包站.getValue()); String partnerId = otherUserService.findById(userId).getPartnerId(); criteria.andEqualTo("sysStorageId",partnerId); }else{ throw new RestException(-1,"用户角色不正确"); } /**********入库员*************/ example.setOrderByClause("storage_time desc"); List orderStorageInfos = orderStorageInfoMapper.selectByExample(example); List orderStorageInfosToday=new ArrayList<>(); //按时间筛选 List orderStorageInfosTime=new ArrayList<>(); if(CollUtil.isNotEmpty(orderStorageInfos)){ rkStatisticsStorageDto.setNumSum(orderStorageInfos.size()); BigDecimal weight=Constants.WEIGHT_INIT; BigDecimal money=Constants.MONEY_INIT; for (OrderStorageInfo orderStorageInfo : orderStorageInfos) { if(StrUtil.isNotBlank(orderStorageInfo.getStorageTime())&&DateUtil.format(new Date(),DateUtils.DATE_FORMAT_YMD).equals(orderStorageInfo.getStorageTime().split(" ")[0])){ orderStorageInfosToday.add(orderStorageInfo); } if(StrUtil.isNotBlank(data)&&StrUtil.isNotBlank(orderStorageInfo.getStorageTime())&&DateUtil.formatDate(DateUtil.parseDate(data)).equals(orderStorageInfo.getStorageTime().split(" ")[0])){ orderStorageInfosTime.add(orderStorageInfo); } weight=NumberUtil.add(weight,Convert.toBigDecimal(orderStorageInfo.getStorageWeight())); money=NumberUtil.add(money,Convert.toBigDecimal(orderStorageInfo.getStorageMoney())); } rkStatisticsStorageDto.setStorageMoneySum(money); rkStatisticsStorageDto.setStorageWeightSum(weight); //当天入库 if(CollUtil.isNotEmpty(orderStorageInfosToday)){ rkStatisticsStorageDto.setNum(orderStorageInfosToday.size()); BigDecimal weightToday=Constants.WEIGHT_INIT; BigDecimal moneyToday=Constants.MONEY_INIT; for (OrderStorageInfo orderStorageInfo : orderStorageInfosToday) { weightToday=NumberUtil.add(weightToday,Convert.toBigDecimal(orderStorageInfo.getStorageWeight())); moneyToday=NumberUtil.add(moneyToday,Convert.toBigDecimal(orderStorageInfo.getStorageMoney())); } rkStatisticsStorageDto.setStorageMoney(moneyToday); rkStatisticsStorageDto.setStorageWeight(weightToday); } //按时间入库 if(CollUtil.isNotEmpty(orderStorageInfosTime)){ List receiverList=new ArrayList<>(); if(StrUtil.isNotBlank(receiver)){ BigDecimal weightToday=Constants.WEIGHT_INIT; BigDecimal moneyToday=Constants.MONEY_INIT; //根据回收员筛选 List collect = orderStorageInfosTime.stream().filter(x -> receiver.equals(x.getReceiver())).collect(Collectors.toList()); for (OrderStorageInfo orderStorageInfo : collect) { weightToday=NumberUtil.add(weightToday,Convert.toBigDecimal(orderStorageInfo.getStorageWeight())); moneyToday=NumberUtil.add(moneyToday,Convert.toBigDecimal(orderStorageInfo.getStorageMoney())); } RkStatisticsStorageReceiverDto dto=new RkStatisticsStorageReceiverDto(); OtherUserInfo byId = otherUserService.findById(receiver); dto.setUserId(byId.getUserId()); dto.setAvatar(byId.getAvatar()); dto.setName(byId.getName()); dto.setMoney(businessUtil.changeMoney(moneyToday)); dto.setWeight(businessUtil.changeWeight(weightToday.toString())); dto.setTime(data); receiverList.add(dto); }else { //按回收员分组 Map> collect = orderStorageInfosTime.stream().collect(Collectors.groupingBy(x -> x.getReceiver())); for (String s : collect.keySet()) { BigDecimal weightToday=Constants.WEIGHT_INIT; BigDecimal moneyToday=Constants.MONEY_INIT; RkStatisticsStorageReceiverDto dto=new RkStatisticsStorageReceiverDto(); OtherUserInfo byId = otherUserService.findById(s); dto.setUserId(byId.getUserId()); dto.setAvatar(byId.getAvatar()); dto.setName(byId.getName()); for (OrderStorageInfo orderStorageInfo : collect.get(s)) { weightToday=NumberUtil.add(weightToday,Convert.toBigDecimal(orderStorageInfo.getStorageWeight())); moneyToday=NumberUtil.add(moneyToday,Convert.toBigDecimal(orderStorageInfo.getStorageMoney())); } dto.setMoney(businessUtil.changeMoney(moneyToday)); dto.setWeight(businessUtil.changeWeight(weightToday.toString())); dto.setTime(data); receiverList.add(dto); } } rkStatisticsStorageDto.setReceiverList(receiverList); } //回收员赋值入库信息 if(CommonEnum.回收员.getValue().equals(userType)) { BeanUtils.copyProperties(rkStatisticsStorageDto, rkStatisticsRecyleDto); rkStatisticsRecyleDto.setNum(0); rkStatisticsRecyleDto.setNumSum(0); } } /**********回收员*************/ if(CommonEnum.回收员.getValue().equals(userType)){ List orderRecyleInfosToday=new ArrayList<>(); List orderInfos = orderDetailService.findByReceiver(userId); if(CollUtil.isNotEmpty(orderInfos)){ rkStatisticsRecyleDto.setNumSum(orderInfos.size()); BigDecimal weight=Constants.WEIGHT_INIT; BigDecimal money=Constants.MONEY_INIT; for (OrderDetailInfo orderInfo : orderInfos) { if(StrUtil.isNotBlank(orderInfo.getCompleteTime())&&DateUtil.format(new Date(),DateUtils.DATE_FORMAT_YMD).equals(orderInfo.getCompleteTime().split(" ")[0])){ orderRecyleInfosToday.add(orderInfo); } weight=NumberUtil.add(weight,Convert.toBigDecimal(orderInfo.getWeight())); money=NumberUtil.add(money,Convert.toBigDecimal(orderInfo.getMoney())); } rkStatisticsRecyleDto.setRecycleMoneySum(money); rkStatisticsRecyleDto.setRecycleWeightSum(weight); if(CollUtil.isNotEmpty(orderRecyleInfosToday)){ rkStatisticsRecyleDto.setNum(orderRecyleInfosToday.size()); BigDecimal weightToday=Constants.WEIGHT_INIT; BigDecimal moneyToday=Constants.MONEY_INIT; for (OrderDetailInfo orderStorageInfo : orderRecyleInfosToday) { weightToday=NumberUtil.add(weightToday,Convert.toBigDecimal(orderStorageInfo.getWeight())); moneyToday=NumberUtil.add(moneyToday,Convert.toBigDecimal(orderStorageInfo.getMoney())); } rkStatisticsRecyleDto.setRecycleMoney(moneyToday); rkStatisticsRecyleDto.setRecycleWeight(weightToday); } } } if(CommonEnum.回收员.getValue().equals(userType)){ rkStatisticsDto.setRkStatisticsRecyleDto(rkStatisticsRecyleDto); }else{ rkStatisticsDto.setStatisticsStorageDto(rkStatisticsStorageDto); } return rkStatisticsDto; } /** * 入库 * @param rk */ public void rk(RkDto rk){ boolean lock=false; try { if(redisUtil.setnx(Constants.REDIS_ORDER_KEY+"rk:"+rk.getStorageId(),rk.getStorageId())) { lock=true; String now = DateUtil.now(); OtherUserInfo otherUserInfo = otherUserMapper.selectByPrimaryKey(rk.getStorageUserId()); //修改入库信息 Example example = new Example(OrderStorageInfo.class); Example.Criteria criteria = example.createCriteria(); criteria.andEqualTo("storageId", rk.getStorageId()); OrderStorageInfo orderStorageInfo = orderStorageInfoMapper.selectOneByExample(example); if (orderStorageInfo == null) { throw new RestException(-1, "入库单不存在"); } Map map = new HashMap(); map.put("userId", orderStorageInfo.getReceiver()); List receiverAccounts = accountMapper.queryMyMoney(map); if(CollUtil.isEmpty(receiverAccounts)){ throw new RestException(-1, "回收员账户已被禁用"); } //检验是否已入库 if (orderStorageInfo.getStorageStatus().toString().equals(OrderEnum.已入库.getValue())) { throw new RestException(-1, "订单已入库"); } orderStorageInfo.setStorageUserId(rk.getStorageUserId()); orderStorageInfo.setStorageUserName(otherUserInfo.getName()); orderStorageInfo.setStorageUserPhone(otherUserInfo.getMobilePhone()); orderStorageInfo.setStorageTime(now); orderStorageInfo.setStorageWeight(rk.getStorageWeight()); orderStorageInfo.setStorageMoney(Convert.toBigDecimal(rk.getStorageMoney())); int usertype=0; String packageId=null; if(otherUserInfo.getUserType().equals(CommonEnum.打包员.getValue())||otherUserInfo.getUserType().equals(CommonEnum.打包站运营员.getValue())) { usertype = 2; packageId = otherUserInfo.getPartnerId(); }else if(otherUserInfo.getUserType().equals(CommonEnum.入库员.getValue())){ usertype=1; } Map map2 = new HashMap(); map2.put("userId", rk.getStorageUserId()); List storageAccount = accountMapper.queryMyMoney(map2); if(CollUtil.isEmpty(storageAccount)){ throw new RestException(-1, "账户已被禁用"); } AccountVo accountVo = storageAccount.get(0); String overdraftLimit = accountVo.getOverdraftLimit(); BigDecimal limit = Convert.toBigDecimal(overdraftLimit, Constants.MONEY_INIT); BigDecimal moneyDecimal=Convert.toBigDecimal(rk.getStorageMoney()); BigDecimal moneyDB = Convert.toBigDecimal(accountVo.getMoney(), Constants.MONEY_INIT); if(usertype==2) { if (NumberUtil.isLess(NumberUtil.add(limit, moneyDB), moneyDecimal)) { throw new RestException(-1, "额度不足"); } }else if(usertype==1){ //判断仓管员额度是否足够 if (NumberUtil.isGreater(moneyDecimal, limit)) { throw new RestException(-1, "额度不足"); } } orderStorageInfo.setStorageStatus(Convert.toShort(OrderEnum.已入库.getValue())); if(usertype==1){ //仓库ID 地磅必须在入库才知道入库id OtherUserInfo byId = otherUserService.findById(rk.getStorageUserId()); orderStorageInfo.setSysStorageId(Convert.toLong(byId.getStorageId())); } //查询废纸分类的单价 合伙人存在多个区域则按最低的单价算 String paperBasic=null; String partnerId = otherUserService.findById(orderStorageInfo.getReceiver()).getPartnerId(); List byPartnerId = partnerGaodeService.findByPartnerId(partnerId); List areaIds=byPartnerId.stream().map(x->x.getTownId()).collect(Collectors.toList()); if(usertype==2) { paperBasic = sysEnvironmentalInfoService.findByMinItemPriceTypeAndAreaIds(areaIds); if (paperBasic==null) { throw new RestException(-1,"请设置纸类的基准价格"); } } orderStorageInfoMapper.updateByPrimaryKeySelective(orderStorageInfo); OrderBatchInfo orderBatchInfo = new OrderBatchInfo(); orderBatchInfo.setStatus(Convert.toShort(OrderEnum.已入库.getValue())); Example example1 = new Example(OrderBatchInfo.class); example1.createCriteria().andEqualTo("orderId", orderStorageInfo.getOrderId()); //修改批次信息 orderBatchInfoMapper.updateByExampleSelective(orderBatchInfo, example1); //修改物品分类信息 List list=new ArrayList<>(); BigDecimal paperWeight=BigDecimal.ZERO; //纸类的所有小类集合 List paperChildType=CollUtil.newArrayList(); if(usertype==2) { paperChildType = packageGoodsInfoService.findChildItemTypeByType(packageId, Constants.PAPER_ITEM_TYPE); } for (OrderItemDto orderItemReq : rk.getStorageItemList()) { //修改入库的金额 和数量 重量 OrderStorageDetailInfo detailInfo = new OrderStorageDetailInfo(); detailInfo.setWeight(Convert.toBigDecimal(orderItemReq.getWeight(),Constants.WEIGHT_INIT)); detailInfo.setMoney(orderItemReq.getMoney()); detailInfo.setAmount(orderItemReq.getAmount()); detailInfo.setPrice(orderItemReq.getItemTypePrice()); Example example2 = new Example(OrderStorageDetailInfo.class); Example.Criteria criteria2 = example2.createCriteria(); criteria2.andEqualTo("storageId", rk.getStorageId()); criteria2.andEqualTo("flag", OrderEnum.入库型.getValue()); criteria2.andEqualTo("itemType", orderItemReq.getItemType()); orderStorageDetailMapper.updateByExampleSelective(detailInfo, example2); if(usertype==2) { if(orderItemReq.getWeight().compareTo(BigDecimal.ZERO)>0){ //计算出所有纸类的重量 if(paperChildType.contains(orderItemReq.getItemType())){ paperWeight=NumberUtil.add(paperWeight,orderItemReq.getWeight()); } } //提成明细 if (detailInfo.getWeight().compareTo(BigDecimal.ZERO) > 0) { WeightItemPrice weightItemPrice = new WeightItemPrice(); weightItemPrice.setStorageId(rk.getStorageId()); weightItemPrice.setStorageTime(now); weightItemPrice.setPackageId(orderStorageInfo.getSysStorageId().toString()); weightItemPrice.setWeight(detailInfo.getWeight().toString()); weightItemPrice.setReceiver(orderStorageInfo.getReceiver()); weightItemPrice.setProductType(orderItemReq.getItemType()); weightItemPrice.setPackagePrice(orderItemReq.getItemTypePrice()); weightItemPrice.setGoodsPrice(paperBasic); //1:未审核,2:已审核 3:异常 weightItemPrice.setStatus("1"); list.add(weightItemPrice); } } } //添加提成明细 if(CollUtil.isNotEmpty(list)){ weightItemPriceService.addBatch(list); } String payType=""; //修改订单相关 int i=0; List listOrder=new ArrayList<>(); for (String orderId : orderStorageInfo.getOrderId().split(",")) { //修改订单信息 OrderInfo orderInfo = new OrderInfo(); orderInfo.setOrderId(orderId); orderInfo.setOrderStatus(OrderEnum.完成.getValue()); listOrder.add(orderInfo); // orderMapper.updateByPrimaryKeySelective(orderInfo); if(i==0) { PayInfo payInfo = new PayInfo(); payInfo.setOrderId(orderId); payInfo.setCreateUserId(orderStorageInfo.getReceiver()); List select = payInfoMapper.select(payInfo); if (CollUtil.isNotEmpty(select)) { String payType1 = select.get(0).getPayType(); if (PayEnum.现金支出.getValue().equals(payType1) || PayEnum.现金收入.getValue().equals(payType1)) { payType = PayEnum.现金支出.getValue(); } else { payType = PayEnum.环保金支出.getValue(); } } } //修改订单详情信息 冗余字段暂时废弃 // OrderDetailInfo orderDetailInfo = new OrderDetailInfo(); // orderDetailInfo.setStorageMoney(Convert.toStr(rk.getStorageMoney())); // orderDetailInfo.setStorageUserId(orderStorageInfo.getStorageUserId()); // orderDetailInfo.setStorageUserName(orderStorageInfo.getStorageUserName()); // orderDetailInfo.setStorageUserPhone(orderStorageInfo.getStorageUserPhone()); // Example example2 = new Example(OrderDetailInfo.class); // example2.createCriteria().andEqualTo("orderId", orderId); // orderDetailMapper.updateByExampleSelective(orderDetailInfo, example2); i++; } //批量修改订单状态 if(CollUtil.isNotEmpty(listOrder)){ orderBatchMapper.updateBatchByPrimaryKeySelective(listOrder); } OrderInfoReq orderInfoReq = new OrderInfoReq(); orderInfoReq.setNewVersion(true); orderInfoReq.setReceiver(orderStorageInfo.getReceiver()); orderInfoReq.setStorageUserId(orderStorageInfo.getStorageUserId()); orderInfoReq.setPayType(payType); orderInfoReq.setStorageMoney(Convert.toStr(rk.getStorageMoney())); orderInfoReq.setOrderId(orderStorageInfo.getOrderId()); orderInfoReq.setStorageId(orderStorageInfo.getStorageId()); orderInfoReq.setVersion(rk.getVersion()); if(paperBasic!=null){ orderInfoReq.setPaperMoney(NumberUtil.mul(Convert.toBigDecimal(paperBasic),paperWeight)); } //录入支付记录 AccountVo receiverAccount=receiverAccounts.get(0); // orderService.storageOperInfo(orderInfoReq, orderStorageInfo.getStorageId(), now, accountId); //更改账户信息 orderService.storageAccount(orderInfoReq, receiverAccount,accountVo,usertype,partnerId); //推广返利 AllAcountParamDto allAcountParamDto=AllAcountParamDto.builder(). type(6).flowNo(orderStorageInfo.getOrderId()).userId(orderInfoReq.getStorageUserId()) .build(); // accountFactory.getService(6).account(allAcountParamDto); new AccountContext(promotionRebateService).account(allAcountParamDto); //入库消息 orderService.storageMessage(orderInfoReq, now); //删除回收员的入库错误次数 redisUtil.hdel(Constants.REDIS_ORDER_KEY + "storage:errcount", orderStorageInfo.getReceiver()); } } catch (RestException e){ throw new BusinessException(-1,e.getMsg(),ExceptionUtil.getMessage(e)); }catch (Exception e) { ExceptionUtils.err("入库失败",e); }finally { if(lock) { redisUtil.del(Constants.REDIS_ORDER_KEY + "rk:" + rk.getStorageId()); } } } /** * 已完成订单列表查询 * @param simplePage * @param userId * @return */ public List findCompleteOrder(SimplePage simplePage,String userId){ Example example=new Example(OrderStorageInfo.class); Example.Criteria criteria = example.createCriteria(); criteria.andEqualTo("storageStatus",Convert.toShort(0)); //rk代表入库员已完成列表查询接口 if(StrUtil.isBlank(simplePage.getExtra())){ criteria.andEqualTo("receiver",userId); }else{ criteria.andEqualTo("storageUserId",userId); } example.setOrderByClause("storage_time desc"); PageHelper.startPage(simplePage.getPageNo(),simplePage.getPageSize()); List select = orderStorageInfoMapper.selectByExample(example); //查看是否是定点下单 不可能混合 否则会拆分成2个入库单 if(CollUtil.isNotEmpty(select)){ for (OrderStorageInfo orderStorageInfo : select) { // String orderId = orderStorageInfo.getOrderId(); // String s = orderId.split(",")[0]; // OrderInfo orderInfo = orderMapper.selectByPrimaryKey(s); // if(orderInfo!=null) { // orderStorageInfo.setStoreId(orderInfo.getStoreId()); // } String weight = orderStorageInfo.getStorageWeight(); String recycleWeight = orderStorageInfo.getRecycleWeight(); if(StrUtil.isBlank(weight)){ orderStorageInfo.setStorageWeight(Constants.WEIGHT_INIT.toString()); } if(StrUtil.isBlank(recycleWeight)){ orderStorageInfo.setRecycleWeight(Constants.WEIGHT_INIT.toString()); } } } //如果是入库员 需要显示回收员名字和其所属的车辆编号 if(StrUtil.isNotBlank(simplePage.getExtra())) { for (OrderStorageInfo orderStorageInfo : select) { String receiver = orderStorageInfo.getReceiver(); orderStorageInfo.setReceiverName(otherUserService.findById(receiver).getName()); VehicleInfo byUserId = userVehicleInfoService.findByUserId(receiver); if (byUserId != null) { orderStorageInfo.setVehicleNo(byUserId.getVehicleNo()); } } }else { //回收员 for (OrderStorageInfo orderStorageInfo : select) { String orderId = orderStorageInfo.getOrderId(); String[] split = orderId.split(","); if(ArrayUtil.isNotEmpty(split)&&split.length==1){ orderId=split[0]; OrderInfo byId = orderService.findById(orderId); //设置订单状态 orderStorageInfo.setOrderType(byId.getOrderType()); if(OrderEnum.到家服务.getValue().equals(byId.getOrderType())){ orderStorageInfo.setRelaPhone(byId.getRelaPhone()); orderStorageInfo.setCreateUserId(byId.getCreateUserId()); orderStorageInfo.setOrderId(byId.getOrderId()); }else if(OrderEnum.家电回收.getValue().equals(byId.getOrderType())){ OrderDetailInfo byId1 = orderDetailService.findById(orderId); Long homeApplianceId = byId1.getHomeApplianceId(); //家电下单的家电信息 if(homeApplianceId!=null) { OrderHomeAppliance byOrderId = orderHomeApplianceService.findById(homeApplianceId); orderStorageInfo.setOrderHomeAppliance(byOrderId); } } } } } return select; } /** * 已完成订单列表个数 * @return */ public int countCompleteOrder(String userId){ Example example=new Example(OrderStorageInfo.class); Example.Criteria criteria = example.createCriteria(); criteria.andEqualTo("storageStatus",Convert.toShort(OrderEnum.已入库.getValue())); criteria.andEqualTo("storageUserId",userId); int select = orderStorageInfoMapper.selectCountByExample(example); return select; } /** * 新任务订单列表个数 * @return */ public int countStorageOrder(String userId){ Example example=new Example(OrderStorageInfo.class); Example.Criteria criteria = example.createCriteria(); criteria.andEqualTo("storageStatus",Convert.toShort(OrderEnum.入库检验中.getValue())); criteria.andEqualTo("storageUserId",userId); int select = orderStorageInfoMapper.selectCountByExample(example); return select; } /** * 手动扫码入库新任务详情 * * @param request * @param userId * @param usertype 1入库 2打包 * @return */ public Result rkDetail(HttpServletRequest request, String userId, int usertype, String packageId) { Result result = new Result(); RkDto rk = new RkDto(); String key=Constants.REDIS_ORDER_KEY+"rkscan:"+request.getHeader("userId"); if(redisUtil.setnx(key,"0")) { try { //获取用户所有待入库订单 List orderInfos = orderService.findDetailByReceiverAndStatus(userId, OrderEnum.待入库.getValue()); if (CollUtil.isEmpty(orderInfos)) { return Result.error(-1, "没有待入库的订单"); } //定点回收 List collect1 = orderInfos.stream().filter(x -> x.getStoreId() != null).map(OrderInfo::getOrderId).collect(Collectors.toList()); //上门回收 List collect2 = orderInfos.stream().filter(x -> x.getStoreId() == null).map(OrderInfo::getOrderId).collect(Collectors.toList()); //1为上门 2为定点 int type = 0; Dict dict = null; if (CollUtil.isNotEmpty(collect1)) { type = 2; String storageId = idUtils.generate("RK", 0); dict = orderBatchInfoService.addDB(userId, collect1, storageId, usertype, packageId); } if (CollUtil.isNotEmpty(collect2)) { type = 1; String storageId = idUtils.generate("RK", 2); dict = orderBatchInfoService.addDB(userId, collect2, storageId, usertype, packageId); } //混合订单直接返回到列表 if (CollUtil.isNotEmpty(collect1) && CollUtil.isNotEmpty(collect2)) { rk.setMixOrder(true); result.setData(rk); return result; } List orderItemDtos = new ArrayList<>(); List select = (List) dict.get("detail"); //设置分类 setItem(rk, orderItemDtos, select, usertype, packageId); rk.setStorageUserId(request.getHeader("userId")); rk.setStorageId(dict.getStr("storageId")); OrderInfoReq orderInfoReq = new OrderInfoReq(); orderInfoReq.setReceiver(userId); List strings = orderMapper.fwOrderListByUserId(orderInfoReq); if (CollUtil.isNotEmpty(strings)) { rk.setFwOrderNum(strings.size()); } //回收金额 String recycleMoney = dict.getStr("recycleMoney"); rk.setMoney(recycleMoney); result.setData(rk); } catch (Exception e) { ExceptionUtils.err("扫码入库失败",e); } finally { redisUtil.del(key); } return result; }else { throw new RestException(-1,"二维码已被扫码"); } } /** * 设置分类信息 * @param rk * @param orderItemDtos * @param select */ public void setItem(RkDto rk, List orderItemDtos, List select, int usertype, String packageId) { //入库根据仓库所属地查看价格 Long parentId = null; if (usertype == 1) { SysStorage byId1 = sysStorageService.findById(Convert.toInt(packageId)); Integer areaId = Convert.toInt(byId1.getArea()); SysEnvironmentalInfo sysEnvironmentalInfo2 = sysEnvironmentalInfoService.findByItemTypeAndArea(Constants.HOUSE_HOLD_ITEM_TYPE,areaId); if (sysEnvironmentalInfo2 != null) { parentId = sysEnvironmentalInfo2.getId(); } if (CollUtil.isNotEmpty(select)) { for (OrderStorageDetailInfo detailInfo : select) { OrderItemDto orderItemDto = new OrderItemDto(); BeanUtils.copyProperties(detailInfo, orderItemDto); //设置分类名称和图片 String itemType = detailInfo.getItemType(); SysEnvironmentalInfo sysEnvironmentalInfo1 = null; sysEnvironmentalInfo1 = sysEnvironmentalInfoService.findByItemTypeAndArea(itemType, areaId); if (sysEnvironmentalInfo1 != null) { Long parentId1 = sysEnvironmentalInfo1.getParentId(); if (parentId != null && parentId.intValue() == (parentId1.intValue())) { orderItemDto.setHouseHold(true); BigDecimal mul = NumberUtil.mul(Convert.toBigDecimal(sysEnvironmentalInfo1.getPutStoragePrice()), Convert.toBigDecimal(orderItemDto.getAmount(), Constants.MONEY_INIT)); orderItemDto.setMoney(businessUtil.changeMoney(mul)); }else { BigDecimal mul = NumberUtil.mul(Convert.toBigDecimal(sysEnvironmentalInfo1.getPutStoragePrice()), Convert.toBigDecimal(orderItemDto.getWeight(), Constants.MONEY_INIT)); orderItemDto.setMoney(businessUtil.changeMoney(mul)); } orderItemDto.setItemPic(sysEnvironmentalInfo1.getPicture()); orderItemDto.setItemName(sysEnvironmentalInfo1.getTitle()); orderItemDto.setItemTypePrice(sysEnvironmentalInfo1.getPutStoragePrice().toString()); // if (type == 1) { // orderItemDto.setItemTypePrice(sysEnvironmentalInfo1.getPutStoragePrice().toString()); // } else if (type == 2) { // orderItemDto.setItemTypePrice(sysEnvironmentalInfo1.getSecondPrice()); // } //查找父类的itemType SysEnvironmentalInfo byId = null; byId = sysEnvironmentalInfoService.findById(parentId1); if (byId != null) { orderItemDto.setParentItemType(byId.getItemType()); } orderItemDtos.add(orderItemDto); } } //按重量降序排序 List collect = orderItemDtos.stream().sorted(Comparator.comparing(OrderItemDto::getWeight).reversed()).collect(Collectors.toList()); rk.setStorageItemList(collect); } } else if (usertype == 2) { List byPackageId = packageGoodsInfoService.findByPackageId(packageId); if (CollUtil.isNotEmpty(byPackageId)) { for (PackageGoodsInfo packageGoodsInfo : byPackageId) { OrderItemDto orderItemDto = new OrderItemDto(); orderItemDto.setAmount("0"); orderItemDto.setWeight(Constants.WEIGHT_INIT); orderItemDto.setMoney(Constants.MONEY_INIT.toString()); orderItemDto.setItemType(packageGoodsInfo.getItemType()); //设置分类名称和图片 Long parentId1 = packageGoodsInfo.getParentId(); if (parentId != null && parentId.intValue() == (parentId1.intValue())) { orderItemDto.setHouseHold(true); } orderItemDto.setItemPic(packageGoodsInfo.getPicture()); orderItemDto.setItemName(packageGoodsInfo.getTitle()); orderItemDto.setItemTypePrice(packageGoodsInfo.getPutStoragePrice().toString()); // if (type == 1) { // orderItemDto.setItemTypePrice(packageGoodsInfo.getPrice()); // } else if (type == 2) { // orderItemDto.setItemTypePrice(packageGoodsInfo.getSecondPrice()); // } //查找父类的itemType SysEnvironmentalInfo byId = null; packageGoodsInfo = packageGoodsInfoService.findById(parentId1); if (packageGoodsInfo != null) { byId = new SysEnvironmentalInfo(); BeanUtil.copyProperties(packageGoodsInfo, byId); } if (byId != null) { orderItemDto.setParentItemType(byId.getItemType()); } orderItemDtos.add(orderItemDto); } rk.setStorageItemList(orderItemDtos); } } } }