init commit

This commit is contained in:
2025-07-03 10:34:04 +08:00
commit 95877f3592
6545 changed files with 889190 additions and 0 deletions

View File

@ -0,0 +1,391 @@
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);
}
}