package com.vincent.rsf.server.manager.service.impl; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.manager.entity.Loc; import com.vincent.rsf.server.manager.entity.Task; import com.vincent.rsf.server.manager.entity.TaskItem; import com.vincent.rsf.server.manager.enums.*; import com.vincent.rsf.server.manager.mapper.LocItemMapper; import com.vincent.rsf.server.manager.entity.LocItem; import com.vincent.rsf.server.manager.service.LocItemService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.vincent.rsf.server.manager.service.LocService; import com.vincent.rsf.server.manager.service.TaskItemService; import com.vincent.rsf.server.manager.service.TaskService; import com.vincent.rsf.server.system.constant.SerialRuleCode; import com.vincent.rsf.server.system.utils.SerialRuleUtils; import lombok.Synchronized; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; @Service("locItemService") public class LocItemServiceImpl extends ServiceImpl implements LocItemService { @Autowired private LocService locService; @Autowired private TaskService taskService; @Autowired private TaskItemService taskItemService; @Autowired private LocItemService locItemService; /** * 库存出库生成出库任务 * * @param map * @return */ @Override @Synchronized @Transactional(rollbackFor = Exception.class) public R generateTask(Map map) { if (Objects.isNull(map.get("siteNo"))) { throw new CoolException("站点不能为空!"); } if (Objects.isNull(map.get("items"))) { throw new CoolException("明细不能为空!"); } String siteNo = map.get("siteNo").toString(); List items = JSONArray.parseArray(JSONArray.toJSONString(map.get("items")), LocItem.class); Map> listMap = items.stream().collect(Collectors.groupingBy(LocItem::getLocId)); listMap.keySet().forEach(key -> { Task task = new Task(); Loc loc = locService.getById(key); if (Objects.isNull(loc)) { throw new CoolException("数据错误:所选库存信息不存在!!"); } loc.setUseStatus(LocStsType.LOC_STS_TYPE_R.type); if (!locService.updateById(loc)) { throw new CoolException("库位状态更新失败!!"); } String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_TASK_CODE, null); task.setOrgLoc(loc.getCode()) .setTaskCode(ruleCode) .setTargSite(siteNo) .setTaskStatus(TaskStsType.GENERATE_OUT.id) .setBarcode(loc.getBarcode()); List locItems = this.list(new LambdaQueryWrapper().eq(LocItem::getLocId, key)); if (locItems.isEmpty()) { throw new CoolException("数据错误:所选库存明细不存在!!"); } Double orgQty = locItems.stream().mapToDouble(LocItem::getAnfme).sum(); Double workQty = locItems.stream().mapToDouble(LocItem::getWorkQty).sum(); List locItemList = listMap.get(key); Double outQty = locItemList.stream().mapToDouble(LocItem::getOutQty).sum(); Task serviceOne = taskService.getOne(new LambdaQueryWrapper().eq(Task::getBarcode, loc.getBarcode())); if (!Objects.isNull(serviceOne)) { throw new CoolException("托盘任务执行中,不能重复创建!"); } Double useQty = Math.round((outQty + workQty) * 10000) / 10000.0; if (orgQty.compareTo(useQty) > 0) { //拣料出库 task.setTaskType(TaskType.TASK_TYPE_PICK_AGAIN_IN.type); } else { //全板出库 task.setTaskType(TaskType.TASK_TYPE_OUT.type); } if (!taskService.save(task)) { throw new CoolException("任务创建失败!!"); } List taskItems = new ArrayList<>(); listMap.get(key).forEach(item -> { TaskItem taskItem = new TaskItem(); BeanUtils.copyProperties(item, taskItem); taskItem.setTaskId(task.getId()) .setAnfme(item.getOutQty()) .setBatch(item.getBatch()) .setOrderType(OrderType.ORDER_OUT.type) .setWkType(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_STOCK_OUT.type)); taskItems.add(taskItem); Double qty = Math.round((item.getWorkQty() + item.getOutQty()) * 10000) / 10000.0; LocItem locItem = locItemService.getById(item.getId()); if (Objects.isNull(locItem)) { throw new CoolException("库存信息不存在!"); } if (locItem.getAnfme().compareTo(qty) < 0) { Double minusQty = Math.round((locItem.getAnfme() - locItem.getWorkQty()) * 10000) / 10000.0; item.setWorkQty(minusQty); } else { item.setWorkQty(qty); } if (! locItemService.updateById(item)) { throw new CoolException("库存信息修改失败!!"); } }); if (!taskItemService.saveBatch(taskItems)) { throw new CoolException("任务明细生成失败!!"); } }); return R.ok("任务生成完成!!"); } }