392 lines
17 KiB
Plaintext
392 lines
17 KiB
Plaintext
package com.cmeim.biz.controller.app;
|
|
|
|
import com.cmeim.basic.api.RemoteLocationService;
|
|
import com.cmeim.biz.po.MmMaterialBar;
|
|
import com.cmeim.biz.po.MmSporadicPickBill;
|
|
import com.cmeim.biz.po.MmSporadicPickBillDetail;
|
|
import com.cmeim.biz.po.MmSporadicPickBillItem;
|
|
import com.cmeim.biz.repository.MmSporadicPickBillDetailRepository;
|
|
import com.cmeim.biz.repository.MmSporadicPickBillItemRepository;
|
|
import com.cmeim.biz.repository.MmSporadicPickBillRepository;
|
|
import com.cmeim.biz.service.OutputAppService;
|
|
import com.cmeim.biz.service.SporadicPickBillService;
|
|
import com.cmeim.biz.vo.InputBillDetailVo;
|
|
import com.cmeim.biz.vo.MmPickBillVo;
|
|
import com.cmeim.biz.vo.MmSporadicPickBillVo;
|
|
import com.cmeim.biz.vo.app.FndByPickNumberVo;
|
|
import com.cmeim.biz.vo.app.SporadicPickBillAppVo;
|
|
import com.cmeim.biz.vo.app.SporadicPickBillDetailVo;
|
|
import com.cmeim.biz.vo.app.SporadicPickSaveVo;
|
|
import com.cmeim.biz.vo.app.SporadicRedPickSaveVo;
|
|
import com.cmeim.common.core.utils.BeanUtil;
|
|
import com.cmeim.common.core.utils.DateUtil;
|
|
import com.cmeim.common.core.utils.SecurityUtils;
|
|
import com.cmeim.common.core.utils.bean.BeanUtils;
|
|
import com.cmeim.common.core.web.controller.GenericController;
|
|
import com.cmeim.common.core.web.domain.Respond;
|
|
import com.cmeim.common.core.web.page.PageVo;
|
|
import com.cmeim.stock.dto.MmStockDto;
|
|
import com.cmeim.stock.po.MmStock;
|
|
import com.cmeim.stock.repository.MmStockRepository;
|
|
import com.google.common.collect.Lists;
|
|
import io.swagger.annotations.Api;
|
|
import io.swagger.annotations.ApiOperation;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.data.domain.Page;
|
|
import org.springframework.data.domain.PageRequest;
|
|
import org.springframework.data.domain.Sort;
|
|
import org.springframework.data.jpa.domain.Specification;
|
|
import org.springframework.transaction.annotation.Propagation;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.web.bind.annotation.GetMapping;
|
|
import org.springframework.web.bind.annotation.PostMapping;
|
|
import org.springframework.web.bind.annotation.RequestBody;
|
|
import org.springframework.web.bind.annotation.RequestMapping;
|
|
import org.springframework.web.bind.annotation.RestController;
|
|
|
|
import javax.persistence.criteria.CriteriaBuilder;
|
|
import javax.persistence.criteria.CriteriaQuery;
|
|
import javax.persistence.criteria.Join;
|
|
import javax.persistence.criteria.JoinType;
|
|
import javax.persistence.criteria.Order;
|
|
import javax.persistence.criteria.Path;
|
|
import javax.persistence.criteria.Predicate;
|
|
import javax.persistence.criteria.Root;
|
|
import java.math.BigDecimal;
|
|
import java.util.ArrayList;
|
|
import java.util.Comparator;
|
|
import java.util.List;
|
|
import java.util.stream.Collectors;
|
|
|
|
@Api(value = "app", tags = "APP零星出库模块")
|
|
@RestController
|
|
@RequestMapping(value = "output/app/sporadicPickBill")
|
|
public class AppSporadicPickBillController extends GenericController {
|
|
|
|
@Autowired
|
|
private OutputAppService appService;
|
|
@Autowired
|
|
private SporadicPickBillService service;
|
|
@Autowired
|
|
private MmSporadicPickBillRepository repository;
|
|
@Autowired
|
|
private MmSporadicPickBillDetailRepository detailRepository;
|
|
@Autowired
|
|
private RemoteLocationService locationService;
|
|
@Autowired
|
|
private MmSporadicPickBillItemRepository sporadicPickBillItemRepository;
|
|
@Autowired
|
|
private MmStockRepository mmStockRepository;
|
|
|
|
|
|
private static final String sporadicPickBillNumber = "sporadicPickBillNumber";
|
|
/**
|
|
* IF-150:pc未完成领料单列表 工单 领料单号
|
|
*/
|
|
@ApiOperation(value = "IF-150:pc未完成领料单列表 工单 领料单号")
|
|
@GetMapping(value = "missPickList2")
|
|
public Respond missPickList2(PageVo pv, String parameter) {
|
|
String[] orders = {"sporadicPickBillNumber desc"};
|
|
pv.setPageSize(50);
|
|
pv.setPageNo(1);
|
|
PageRequest pageRequest = PageRequest.of(pv.getPageNo() - 1, pv.getPageSize(),
|
|
Sort.by(sortOrder(orders)));
|
|
Integer[] dictStatus = new Integer[2];
|
|
dictStatus[0] = 15; // 部分领料
|
|
dictStatus[1] = 20; // 全部领料
|
|
MmSporadicPickBillVo mmPickBillVo = new MmSporadicPickBillVo();
|
|
mmPickBillVo.setDictStatusArr(dictStatus);
|
|
Page page = repository.findAll(buildSpecification(mmPickBillVo, parameter), pageRequest);
|
|
|
|
List<MmSporadicPickBill> pickBillList = BeanUtil.copyProperties(page.getContent(), MmSporadicPickBill.class);
|
|
final List<MmSporadicPickBill> collectBillList =
|
|
pickBillList.stream().filter(e -> e.getDictType() != 3).collect(Collectors.toList());
|
|
return buildSuccess(collectBillList);
|
|
}
|
|
|
|
private Specification buildSpecification(MmSporadicPickBillVo mmArriveBillVo, String parameter) {
|
|
return new Specification<MmSporadicPickBill>() {
|
|
@Override
|
|
public Predicate toPredicate(Root<MmSporadicPickBill> root, CriteriaQuery<?> criteriaQuery,
|
|
CriteriaBuilder cb) {
|
|
List<Predicate> predicates = Lists.newArrayList();
|
|
List<Predicate> orlsit = new ArrayList<>();
|
|
if (mmArriveBillVo.getDictStatusArr() != null) {
|
|
CriteriaBuilder.In<Integer> in = cb.in(root.get("dictStatus").as(Integer.class));
|
|
for (Integer status : mmArriveBillVo.getDictStatusArr()) {
|
|
in.value(status);
|
|
}
|
|
predicates.add(in);
|
|
}
|
|
|
|
if (com.cmeim.common.core.utils.StringUtils.isNotEmpty(parameter)) {
|
|
orlsit.add(cb.like(root.get(sporadicPickBillNumber).as(String.class), "%" + parameter + "%"));
|
|
orlsit.add(cb.like(root.get("orderProdNumber").as(String.class), "%" + parameter + "%"));
|
|
}
|
|
|
|
|
|
List<Order> orders = new ArrayList<>();
|
|
orders.add(cb.desc(root.get(sporadicPickBillNumber)));
|
|
criteriaQuery.orderBy(orders);
|
|
|
|
// 外联结子表,状态多选->去重
|
|
criteriaQuery.distinct(true);
|
|
|
|
Predicate[] preOr = new Predicate[orlsit.size()];
|
|
Predicate[] preAnd = new Predicate[predicates.size()];
|
|
|
|
if (orlsit.size() == 0) {
|
|
//单独使用 and 或者 or 时 返回
|
|
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
|
|
}
|
|
//组合 and or 时 返回
|
|
return criteriaQuery.where(cb.and(predicates.toArray(preAnd)), cb.or(orlsit.toArray(preOr))).getRestriction();
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* IF-180:未完成出库单列表接口
|
|
*/
|
|
@ApiOperation(value = "IF-180:未完成出库单列表接口")
|
|
@GetMapping(value = "uncompletedList")
|
|
public Respond uncompletedList(PageVo pv, MmSporadicPickBillVo query) {
|
|
Integer[] dictStatusArr = {5, 15,20};//,20
|
|
query.setDictStatusArr(dictStatusArr);
|
|
PageRequest pageRequest = PageRequest.of(pv.getPageNo() - 1, pv.getPageSize(),
|
|
Sort.by(sortOrder(pv.getOrders())));
|
|
Page page = repository.findAll(buildSpecifications(query), pageRequest);
|
|
List<MmSporadicPickBill> list = page.getContent();
|
|
List<SporadicPickBillAppVo> voList = new ArrayList<>();
|
|
//优化调用接口的逻辑
|
|
list.forEach(v -> {
|
|
SporadicPickBillAppVo vo = new SporadicPickBillAppVo();
|
|
BeanUtils.copyProperties(v, vo);
|
|
if (vo.getDictType() != null) {
|
|
vo.setDictTypeShow(appService.judge1(vo.getDictType()));
|
|
}
|
|
vo.setDictStatusShow(appService.judge2(vo.getDictStatus()));
|
|
voList.add(vo);
|
|
});
|
|
pv.setRecordsTotal(page.getTotalElements());
|
|
pv.setData(voList);
|
|
return buildSuccess(pv);
|
|
}
|
|
|
|
/**
|
|
* IF-181:出库单明细接口
|
|
*/
|
|
@ApiOperation(value = "IF-181:出库单明细接口")
|
|
@GetMapping(value = "getDetail")
|
|
public Respond getDetail(String sporadicPickBillNumber) {
|
|
MmSporadicPickBill sporadicPickBill = repository.findBySporadicPickBillNumber(sporadicPickBillNumber);
|
|
|
|
List<MmSporadicPickBillDetail> detailList =
|
|
detailRepository.findAllBySporadicPickBillNumber(sporadicPickBillNumber);
|
|
List<SporadicPickBillDetailVo> voList = BeanUtil.copyProperties(detailList, SporadicPickBillDetailVo.class);
|
|
|
|
voListAdd(voList,sporadicPickBill);
|
|
|
|
return buildSuccess(voList);
|
|
}
|
|
|
|
public void voListAdd(List<SporadicPickBillDetailVo> voList,MmSporadicPickBill sporadicPickBill){
|
|
voList.forEach(vo -> {
|
|
if (vo.getDoneQty().compareTo(vo.getPlanQty()) < 0) {
|
|
// 还需要领取的数量
|
|
BigDecimal needQty = vo.getPlanQty().subtract(vo.getDoneQty());
|
|
|
|
List<MmStock> result =
|
|
mmStockRepository.findAllByWarehouseCodeAndMaterialCode(sporadicPickBill.getWarehouseCode(),
|
|
vo.getMaterialCode());
|
|
List<MmStockDto> stockDtoList = BeanUtil.copyProperties(result, MmStockDto.class);
|
|
|
|
if (stockDtoList.size() != 0) {
|
|
List<String> materialBarList = new ArrayList<>();
|
|
List<String> locationCodeList = new ArrayList<>();
|
|
|
|
for (MmStockDto stock : stockDtoList) {
|
|
materialBarList.add(stock.getMaterialBar());
|
|
locationCodeList.add(stock.getLocationCode());
|
|
if (needQty.compareTo(stock.getQty()) > 0) {
|
|
needQty = needQty.subtract(stock.getQty());
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
vo.setRecommendBar(String.join(",", materialBarList));
|
|
if (locationCodeList.size() > 0) {
|
|
// 库位去重
|
|
locationCodeList = locationCodeList.stream().distinct().collect(Collectors.toList());
|
|
vo.setRecommendLocation(String.join(",", locationCodeList));
|
|
}
|
|
}
|
|
}
|
|
// 查询相关领料记录
|
|
List<MmSporadicPickBillItem> items =
|
|
sporadicPickBillItemRepository.findAllBySporadicPickBillNumberAndMaterialCode(sporadicPickBillNumber, vo.getMaterialCode());
|
|
vo.setItems(items);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* IF-152:app领料单保存
|
|
*/
|
|
@ApiOperation(value = "IF-152:app领料单保存")
|
|
@PostMapping(value = "sporadicPickSave")
|
|
public Respond sporadicPickSave(@RequestBody SporadicPickSaveVo vo) {
|
|
MmMaterialBar mmMaterialBar = service.sporadicPickSave(vo.getSporadicPickBillNumber(), vo.getMaterialBar(), vo.getQty());
|
|
return buildSuccess(mmMaterialBar);
|
|
}
|
|
|
|
/**
|
|
* IF-152:app红字领料单保存
|
|
*/
|
|
@ApiOperation(value = "IF-152:app红字领料单保存")
|
|
@PostMapping(value = "sporadicRedPickSave")
|
|
public Respond sporadicRedPickSave(@RequestBody SporadicRedPickSaveVo vo) {
|
|
service.sporadicRedPickSave(vo);
|
|
return buildSuccess("保存成功");
|
|
}
|
|
|
|
/**
|
|
* IF-153:app零星出库选择库区
|
|
*/
|
|
@ApiOperation(value = "IF-153:app零星出库选择库区")
|
|
@PostMapping(value = "saveSporadicPickBill")
|
|
public Respond saveSporadicPickBill(@RequestBody MmSporadicPickBill mmSporadicPickBill) {
|
|
MmSporadicPickBill mmSporadicPickBill1 = BeanUtil.copyProperties(mmSporadicPickBill, MmSporadicPickBill.class);
|
|
mmSporadicPickBill1.setUpdatedBy(SecurityUtils.getUsername());
|
|
mmSporadicPickBill1.setUpdatedDt(DateUtil.getCurrentDate());
|
|
repository.save(mmSporadicPickBill1);
|
|
return buildSuccess("库区修改成功");
|
|
}
|
|
|
|
public Specification buildSpecifications(MmSporadicPickBillVo entity) {
|
|
String items = "items";
|
|
String createdDt = "createdDt";
|
|
return (Specification<MmPickBillVo>) (root, criteriaQuery, cb) -> {
|
|
List<Predicate> predicates = Lists.newArrayList();
|
|
if (StringUtils.isNotBlank(entity.getSporadicPickBillNumber())) {
|
|
predicates.add(cb.like(root.get(sporadicPickBillNumber).as(String.class),
|
|
"%" + entity.getSporadicPickBillNumber() + "%"));
|
|
}
|
|
if (entity.getDictStatusArr() != null) {
|
|
Path path;
|
|
Join join = root.join(items, JoinType.LEFT);
|
|
path = join.get("dictStatus");
|
|
CriteriaBuilder.In<Integer> in = cb.in(path);
|
|
for (Integer status : entity.getDictStatusArr()) {
|
|
in.value(status);
|
|
}
|
|
predicates.add(in);
|
|
}
|
|
if (StringUtils.isNotBlank(entity.getStartTime())) {
|
|
predicates.add(cb.greaterThanOrEqualTo(root.get(createdDt).as(String.class),
|
|
entity.getStartTime()));
|
|
}
|
|
if (StringUtils.isNotBlank(entity.getEndTime())) {
|
|
predicates.add(cb.lessThanOrEqualTo(root.get(createdDt).as(String.class), entity.getEndTime()));
|
|
}
|
|
if (StringUtils.isNotBlank(entity.getCustomerName())) {
|
|
predicates.add(cb.like(root.get("customerName").as(String.class),
|
|
"%" + entity.getCustomerName() + "%"));
|
|
}
|
|
if (StringUtils.isNotBlank(entity.getCustomerCode())) {
|
|
predicates.add(cb.like(root.get("customerCode").as(String.class), entity.getCustomerCode()));
|
|
}
|
|
if (StringUtils.isNotBlank(entity.getOrderProdNumber())) {
|
|
predicates.add(cb.like(root.get("orderProdNumber").as(String.class), entity.getOrderProdNumber()));
|
|
}
|
|
if (StringUtils.isNotBlank(entity.getOrderWorkNumber())) {
|
|
predicates.add(cb.like(root.get("orderWorkNumber").as(String.class), entity.getOrderWorkNumber()));
|
|
}
|
|
if (entity.getDictTypeArr() != null) {
|
|
CriteriaBuilder.In<Integer> in = cb.in(root.get("dictType").as(Integer.class));
|
|
for (Integer status : entity.getDictTypeArr()) {
|
|
in.value(status);
|
|
}
|
|
predicates.add(in);
|
|
}
|
|
if (entity.getOrderArr() != null) {
|
|
CriteriaBuilder.In<String> in = cb.in(root.get(sporadicPickBillNumber).as(String.class));
|
|
for (String status : entity.getOrderArr()) {
|
|
in.value(status);
|
|
}
|
|
predicates.add(in);
|
|
}
|
|
if (StringUtils.isNotBlank(entity.getMaterialCode())) {
|
|
Path path;
|
|
Join join = root.join(items, JoinType.LEFT);
|
|
path = join.get("materialCode");
|
|
predicates.add(cb.like(path, "%" + entity.getMaterialCode() + "%"));
|
|
}
|
|
if (StringUtils.isNotBlank(entity.getMaterialName())) {
|
|
Path path;
|
|
Join join = root.join(items, JoinType.LEFT);
|
|
path = join.get("materialName");
|
|
predicates.add(cb.like(path, "%" + entity.getMaterialName() + "%"));
|
|
}
|
|
if (StringUtils.isNotBlank(entity.getMaterialSpec())) {
|
|
Path path;
|
|
Join join = root.join(items, JoinType.LEFT);
|
|
path = join.get("materialSpec");
|
|
predicates.add(cb.like(path, "%" + entity.getMaterialSpec() + "%"));
|
|
}
|
|
if (StringUtils.isNotBlank(entity.getSourceWarehouseCode())) {
|
|
Path path;
|
|
Join join = root.join(items, JoinType.LEFT);
|
|
path = join.get("sourceWarehouseCode");
|
|
predicates.add(cb.equal(path, entity.getSourceWarehouseCode()));
|
|
}
|
|
if (StringUtils.isNotBlank(entity.getTargetWarehouseCode())) {
|
|
Path path;
|
|
Join join = root.join(items, JoinType.LEFT);
|
|
path = join.get("targetWarehouseCode");
|
|
predicates.add(cb.equal(path, entity.getTargetWarehouseCode()));
|
|
}
|
|
List<Order> orders = new ArrayList<>();
|
|
orders.add(cb.desc(root.get(createdDt)));
|
|
criteriaQuery.orderBy(orders);
|
|
criteriaQuery.distinct(true);
|
|
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
|
|
};
|
|
}
|
|
|
|
/**
|
|
* 领料亮灯推荐
|
|
*/
|
|
@ApiOperation(value = "领料亮灯推荐")
|
|
@GetMapping(value = "pickLightUp")
|
|
public Respond pickLightUp(String pickBillNumber) {
|
|
String color = service.pickLightUp(pickBillNumber);
|
|
return buildSuccess(color);
|
|
}
|
|
/**
|
|
* 红字货架熄灯
|
|
*/
|
|
@ApiOperation(value = "红字货架熄灯")
|
|
@GetMapping(value = "redOff")
|
|
public Respond redOff(String inputBillNumber) {
|
|
service.redOff(inputBillNumber);
|
|
return buildSuccess();
|
|
}
|
|
/**
|
|
* APP筛选
|
|
*/
|
|
@ApiOperation(value = "APP筛选")
|
|
@PostMapping(value = "findBySporadicPickBillList")
|
|
public Respond findBySporadicPickBillList(@RequestBody FndByPickNumberVo vo) {
|
|
List<SporadicPickBillDetailVo> voList = service.findBySporadicPickBillList(vo.getPickBillNumber(), vo.getDictStatus(), vo.getMaterialCode());
|
|
|
|
if (voList.size() > 0) {
|
|
return buildSuccess(voList.stream().sorted(
|
|
Comparator.comparing(SporadicPickBillDetailVo::getDictStatus)).collect(Collectors.toList()));
|
|
}
|
|
|
|
return buildSuccess(voList);
|
|
}
|
|
|
|
}
|