637 lines
28 KiB
Plaintext
637 lines
28 KiB
Plaintext
package com.cmeim.biz.controller;
|
||
|
||
import com.cmeim.basic.api.dto.MaterialDto;
|
||
import com.cmeim.basic.api.enums.BaNumberRuleCode;
|
||
import com.cmeim.biz.po.MmMaterialBar;
|
||
import com.cmeim.biz.po.MmOtherInputBill;
|
||
import com.cmeim.biz.po.MmPickBill;
|
||
import com.cmeim.biz.po.MmProdInBill;
|
||
import com.cmeim.biz.po.MmProdInBillDetail;
|
||
import com.cmeim.biz.repository.MmMaterialBarRepository;
|
||
import com.cmeim.biz.repository.MmPickBillRepository;
|
||
import com.cmeim.biz.repository.MmProdInBillDetailRepository;
|
||
import com.cmeim.biz.repository.MmProdInBillRepository;
|
||
import com.cmeim.biz.service.*;
|
||
import com.cmeim.biz.vo.*;
|
||
import com.cmeim.common.core.domain.R;
|
||
import com.cmeim.common.core.exception.ServiceException;
|
||
import com.cmeim.common.core.utils.BeanUtil;
|
||
import com.cmeim.common.core.utils.DateUtil;
|
||
import com.cmeim.common.core.utils.ExcelExportUtil;
|
||
import com.cmeim.common.core.web.controller.GenericController;
|
||
import com.cmeim.common.core.web.domain.Respond;
|
||
import com.cmeim.common.core.web.domain.RespondEnum;
|
||
import com.cmeim.common.core.web.domain.TUserInfo;
|
||
import com.cmeim.common.core.web.page.PageVo;
|
||
import com.cmeim.exec.api.dto.InspectionDto;
|
||
import com.cmeim.plan.api.dto.OrderProdDto;
|
||
import com.cmeim.plan.api.dto.OrderWorkDto;
|
||
import com.cmeim.plan.api.dto.OrderWorkPbmDto;
|
||
import com.cmeim.plan.api.dto.ReWriteProductQtyDto;
|
||
import com.cmeim.stock.dto.MmStockDto;
|
||
import com.cmeim.stock.dto.ProStockDto;
|
||
import com.cmeim.stock.dto.WarehouseDto;
|
||
import com.cmeim.stock.po.BaWarehouse;
|
||
import com.cmeim.stock.po.MmStockArea;
|
||
import com.cmeim.stock.repository.BaWareHouseRepository;
|
||
import com.cmeim.stock.repository.MmStockAreaRepository;
|
||
import com.cmeim.stock.service.api.MaterialBarService;
|
||
import com.cmeim.system.api.domain.SysDept;
|
||
import com.cmeim.system.api.domain.SysUser;
|
||
import com.google.common.collect.Lists;
|
||
import io.swagger.annotations.Api;
|
||
import io.swagger.annotations.ApiOperation;
|
||
import lombok.extern.slf4j.Slf4j;
|
||
import org.apache.commons.lang3.StringUtils;
|
||
import org.apache.poi.xssf.streaming.SXSSFSheet;
|
||
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
|
||
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.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.Path;
|
||
import javax.persistence.criteria.Predicate;
|
||
import javax.persistence.criteria.Root;
|
||
import javax.servlet.http.HttpServletResponse;
|
||
import java.math.BigDecimal;
|
||
import java.text.SimpleDateFormat;
|
||
import java.util.ArrayList;
|
||
import java.util.Date;
|
||
import java.util.List;
|
||
import java.util.Optional;
|
||
import java.util.stream.Collectors;
|
||
|
||
/**
|
||
* 作者:李俊辉
|
||
* date: 2021/9/18
|
||
*/
|
||
@Api(value = "prodIn", tags = "成品入库单")
|
||
@RestController
|
||
@Slf4j
|
||
@RequestMapping(value = "input/prodIn")
|
||
public class ProdInController extends GenericController {
|
||
@Autowired
|
||
private ProdInBillService prodInBillService;
|
||
@Autowired
|
||
private MmProdInBillRepository prodInBillRepository;
|
||
@Autowired
|
||
private MmProdInBillDetailRepository prodInBillDetailRepository;
|
||
@Autowired
|
||
private InputRemoteService remoteService;
|
||
@Autowired
|
||
private InputActService actService;
|
||
@Autowired
|
||
private BaWareHouseRepository baWareHouseRepository;
|
||
@Autowired
|
||
private MmStockAreaRepository stockAreaRepository;
|
||
@Autowired
|
||
private PickBillService pickBillService;
|
||
@Autowired
|
||
private MmPickBillRepository mmPickBillRepository;
|
||
@Autowired
|
||
private MmMaterialBarRepository materialBarRepository;
|
||
@Autowired
|
||
private MaterialBarService materialBarService;
|
||
@Autowired
|
||
private SyncEdgeService syncEdgeService;
|
||
|
||
@ApiOperation(value = "成品入库单列表")
|
||
@GetMapping(value = "list")
|
||
public Respond list(PageVo pv, ProdInVo query) {
|
||
PageRequest pageRequest = PageRequest.of(pv.getPageNo() - 1, pv.getPageSize(),
|
||
Sort.by(sortOrder(pv.getOrders())));
|
||
Page page = prodInBillRepository.findAll(buildSpecification(query), pageRequest);
|
||
pv.setRecordsTotal(page.getTotalElements());
|
||
pv.setData(page.getContent());
|
||
return buildSuccess(pv);
|
||
}
|
||
|
||
@ApiOperation(value = "入库单创建时间更改")
|
||
@PostMapping(value = "updateCreateTime")
|
||
@Transactional
|
||
public Respond updateCreateTime(@RequestBody List<String> ids) {
|
||
ids.forEach(id -> {
|
||
final MmProdInBill mmInputBill = prodInBillRepository.findById(Long.parseLong(id.split(";")[0])).get();
|
||
mmInputBill.setCreatedDt(id.split(";")[1]);
|
||
final List<MmProdInBillDetail> byProdInBillNumber =
|
||
prodInBillDetailRepository.findByProdInBillNumber(mmInputBill.getProdInBillNumber());
|
||
byProdInBillNumber.forEach(e -> {
|
||
e.setCreatedDt(id.split(";")[1]);
|
||
});
|
||
prodInBillDetailRepository.saveAll(byProdInBillNumber);
|
||
prodInBillRepository.save(mmInputBill);
|
||
|
||
});
|
||
return buildSuccess();
|
||
}
|
||
|
||
@ApiOperation(value = "成品入库单明细列表")
|
||
@GetMapping(value = "detailList")
|
||
public Respond detailList(String prodInBillNumber) {
|
||
List<MmProdInBillDetail> mmProdInBillDetailList =
|
||
prodInBillDetailRepository.findByProdInBillNumberOrderByMaterialCodeAsc(prodInBillNumber);
|
||
return buildSuccess(mmProdInBillDetailList);
|
||
}
|
||
|
||
/**
|
||
* 成品入库单打印明细列表
|
||
*
|
||
* @param ids 成品入库单id
|
||
* @return 查询结果
|
||
*/
|
||
@ApiOperation(value = "成品入库单打印明细列表")
|
||
@GetMapping(value = "printList")
|
||
public Respond printList(String ids) {
|
||
String[] strings = ids.split(",");
|
||
List<MmProdInBill> mmProdInBillList = new ArrayList<>();
|
||
for (int i = 0; i < strings.length; i++) {
|
||
MmProdInBill mmProdInBill = new MmProdInBill();
|
||
Optional<MmProdInBill> byId = prodInBillRepository.findById(Long.valueOf(strings[i]));
|
||
if (byId.isPresent()) {
|
||
mmProdInBill = byId.get();
|
||
}
|
||
List<MmProdInBillDetail> mmProdInBillDetailList =
|
||
prodInBillDetailRepository.findByProdInBillNumberOrderByMaterialCodeAsc(mmProdInBill.getProdInBillNumber());
|
||
mmProdInBill.setItems(mmProdInBillDetailList);
|
||
mmProdInBillList.add(mmProdInBill);
|
||
}
|
||
return buildSuccess(mmProdInBillList);
|
||
}
|
||
|
||
private Specification buildSpecification(final ProdInVo prodInVo) {
|
||
Specification<ProdInVo> specification = new Specification<ProdInVo>() {
|
||
@Override
|
||
public Predicate toPredicate(Root<ProdInVo> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
|
||
List<Predicate> predicates = Lists.newArrayList();
|
||
if (StringUtils.isNotBlank(prodInVo.getProdInBillNumber())) {
|
||
predicates.add(cb.like(root.get("prodInBillNumber").as(String.class),
|
||
"%" + prodInVo.getProdInBillNumber() + "%"));
|
||
}
|
||
if (StringUtils.isNotBlank(prodInVo.getErpNumber())) {
|
||
predicates.add(cb.like(root.get("erpNumber").as(String.class),
|
||
"%" + prodInVo.getErpNumber() + "%"));
|
||
}
|
||
if (StringUtils.isNotBlank(prodInVo.getInStockWarehouseName())) {
|
||
predicates.add(cb.like(root.get("inStockWarehouseName").as(String.class),
|
||
"%" + prodInVo.getInStockWarehouseName() + "%"));
|
||
}
|
||
if (StringUtils.isNotBlank(prodInVo.getOrderWorkNumber())) {
|
||
predicates.add(cb.like(root.get("orderWorkNumber").as(String.class),
|
||
"%" + prodInVo.getOrderWorkNumber() + "%"));
|
||
}
|
||
if (StringUtils.isNotBlank(prodInVo.getInStockWarehouseNumber())) {
|
||
predicates.add(cb.equal(root.get("inStockWarehouseNumber").as(String.class),
|
||
prodInVo.getInStockWarehouseNumber()));
|
||
}
|
||
if (StringUtils.isNotBlank(prodInVo.getOpTimeStart())) {
|
||
predicates.add(cb.greaterThanOrEqualTo(root.get("opTime").as(String.class),
|
||
prodInVo.getOpTimeStart()));
|
||
}
|
||
if (StringUtils.isNotBlank(prodInVo.getOpTimeEnd())) {
|
||
predicates.add(cb.lessThanOrEqualTo(root.get("opTime").as(String.class), prodInVo.getOpTimeEnd()));
|
||
}
|
||
if (prodInVo.getStatus() != null) {
|
||
predicates.add(cb.equal(root.get("status").as(Integer.class), prodInVo.getStatus()));
|
||
}
|
||
if (null != prodInVo.getNumberArr() && prodInVo.getNumberArr().length > 0) {
|
||
Path<String> path = root.get("prodInBillNumber");
|
||
CriteriaBuilder.In<String> in = cb.in(path);
|
||
for (String number : prodInVo.getNumberArr()) {
|
||
in.value(number.trim());
|
||
}
|
||
predicates.add(in);
|
||
}
|
||
criteriaQuery.distinct(true);
|
||
|
||
if (null != prodInVo.getMaterialCode()) {
|
||
predicates.add(cb.like(root.get("materialCode").as(String.class), "%" + prodInVo.getMaterialCode() + "%"));
|
||
}
|
||
if (null != prodInVo.getMaterialName()) {
|
||
predicates.add(cb.like(root.get("materialName").as(String.class), "%" + prodInVo.getMaterialName() + "%"));
|
||
}
|
||
if (null != prodInVo.getMaterialSpec()) {
|
||
predicates.add(cb.like(root.get("materialSpec").as(String.class), "%" + prodInVo.getMaterialSpec() + "%"));
|
||
}
|
||
if (null != prodInVo.getInStockQty()) {
|
||
predicates.add(cb.equal(root.get("inStockQty").as(BigDecimal.class), prodInVo.getInStockQty() ));
|
||
}
|
||
if (null != prodInVo.getInStockType()) {
|
||
predicates.add(cb.equal(root.get("inStockType").as(Integer.class), prodInVo.getInStockType() ));
|
||
}
|
||
if (null != prodInVo.getInStockWarehouseName()) {
|
||
predicates.add(cb.like(root.get("inStockWarehouseName").as(String.class), "%" + prodInVo.getInStockWarehouseName() + "%"));
|
||
}
|
||
if (null != prodInVo.getLineStockName()) {
|
||
predicates.add(cb.like(root.get("lineStockName").as(String.class), "%" + prodInVo.getLineStockName() + "%"));
|
||
}
|
||
if (null != prodInVo.getDeptName()) {
|
||
predicates.add(cb.like(root.get("deptName").as(String.class), "%" + prodInVo.getDeptName() + "%"));
|
||
}
|
||
if (null != prodInVo.getErpNumber()) {
|
||
predicates.add(cb.like(root.get("erpNumber").as(String.class), "%" + prodInVo.getErpNumber() + "%"));
|
||
}
|
||
if (null != prodInVo.getErpJson()) {
|
||
predicates.add(cb.like(root.get("erpJson").as(String.class), "%" + prodInVo.getErpJson() + "%"));
|
||
}
|
||
if (null != prodInVo.getOpUser()) {
|
||
predicates.add(cb.like(root.get("opUser").as(String.class), "%" + prodInVo.getOpUser() + "%"));
|
||
}
|
||
if (null != prodInVo.getMemo()) {
|
||
predicates.add(cb.like(root.get("memo").as(String.class), "%" + prodInVo.getMemo() + "%"));
|
||
}
|
||
|
||
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
|
||
}
|
||
};
|
||
return specification;
|
||
}
|
||
|
||
/**
|
||
* 查询该工单的入库数量之和
|
||
*
|
||
* @param orderWorkNumber 工单号
|
||
* @return 查询结果
|
||
*/
|
||
@ApiOperation(value = "查询该工单的入库数量之和")
|
||
@GetMapping(value = "findTotalQty")
|
||
public Respond findTotalQty(String orderWorkNumber) {
|
||
List<MmProdInBill> mmProdInBillList = prodInBillRepository.findByOrderWorkNumber(orderWorkNumber);
|
||
BigDecimal totalQty = BigDecimal.valueOf(0);
|
||
if (mmProdInBillList.size() > 0) {
|
||
totalQty = mmProdInBillList.stream().map(MmProdInBill::getInStockQty).reduce(BigDecimal.ZERO, BigDecimal::add);
|
||
}
|
||
return buildSuccess(totalQty);
|
||
}
|
||
|
||
/**
|
||
* 仓库列表
|
||
*
|
||
* @param warehouseDto 仓库结合
|
||
* @return 查询结果
|
||
*/
|
||
@ApiOperation(value = "仓库列表")
|
||
@PostMapping(value = "warehouseList")
|
||
public Respond warehouseList(WarehouseDto warehouseDto) {
|
||
BaWarehouse baWarehouse = BeanUtil.copyProperties(warehouseDto, BaWarehouse.class);
|
||
List<BaWarehouse> warehouseList = baWareHouseRepository.findAll(buildSpecification2(baWarehouse));
|
||
List<WarehouseDto> warehouseDtoList = BeanUtil.copyProperties(warehouseList, BaWarehouse.class);
|
||
return buildSuccess(warehouseDtoList);
|
||
}
|
||
|
||
private Specification buildSpecification2(BaWarehouse baWarehouse) {
|
||
Specification<BaWarehouse> specification = new Specification<BaWarehouse>() {
|
||
@Override
|
||
public Predicate toPredicate(Root<BaWarehouse> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
|
||
List<Predicate> predicates = Lists.newArrayList();
|
||
if (baWarehouse.getWarehouseCode() != null) {
|
||
predicates.add(cb.like(root.get("warehouseCode").as(String.class),
|
||
"%" + baWarehouse.getWarehouseCode() + "%"));
|
||
}
|
||
if (baWarehouse.getWarehouseName() != null) {
|
||
predicates.add(cb.like(root.get("warehouseName").as(String.class),
|
||
"%" + baWarehouse.getWarehouseName() + "%"));
|
||
}
|
||
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
|
||
}
|
||
};
|
||
return specification;
|
||
}
|
||
|
||
/**
|
||
* 工单列表
|
||
*
|
||
* @param orderWorkDto 工单集合
|
||
* @return 查询结果
|
||
*/
|
||
@ApiOperation(value = "工单列表")
|
||
@PostMapping(value = "orderWorkList")
|
||
public Respond orderWorkList(OrderWorkDto orderWorkDto) {
|
||
List<OrderWorkDto> orderWorkDtoList = remoteService.queryOrderWork(orderWorkDto);
|
||
return buildSuccess(orderWorkDtoList);
|
||
}
|
||
|
||
/**
|
||
* 工单的用料清单列表
|
||
*
|
||
* @param orderWorkPbmDto 工单查询参数集合
|
||
* @return 查询结果
|
||
*/
|
||
@ApiOperation(value = "工单的用料清单列表")
|
||
@PostMapping(value = "orderWorkPbmList")
|
||
public Respond orderWorkPbmList(OrderWorkPbmDto orderWorkPbmDto) {
|
||
List<OrderWorkPbmDto> orderWorkDtoList = remoteService.queryOrderWorkPbm(orderWorkPbmDto);
|
||
return buildSuccess(orderWorkDtoList);
|
||
}
|
||
|
||
/**
|
||
* 订单列表
|
||
*
|
||
* @param orderProdDto 订单查询集合
|
||
* @return 查询结果
|
||
*/
|
||
@ApiOperation(value = "订单列表")
|
||
@PostMapping(value = "orderProdList")
|
||
public Respond orderProdList(OrderProdDto orderProdDto) {
|
||
List<OrderProdDto> orderProdDtoList = remoteService.queryOrderProd(orderProdDto);
|
||
return buildSuccess(orderProdDtoList);
|
||
}
|
||
|
||
/**
|
||
* 交检检验记录列表
|
||
*
|
||
* @param inspectionDto 交检查询参数集合
|
||
* @return 查询结果
|
||
*/
|
||
@ApiOperation(value = "交检检验记录列表")
|
||
@PostMapping(value = "inspectionList")
|
||
public Respond inspectionList(InspectionDto inspectionDto) {
|
||
List<InspectionDto> inspectionDtoList = remoteService.findByOrderWorkNumber(inspectionDto);
|
||
return buildSuccess(inspectionDtoList);
|
||
}
|
||
|
||
/**
|
||
* 库存列表
|
||
*
|
||
* @param dto 库存查询参数
|
||
* @return 查询结果
|
||
*/
|
||
@ApiOperation(value = "库存列表")
|
||
@PostMapping(value = "stockList")
|
||
public Respond stockList(@RequestBody ProStockDto dto) {
|
||
String orderWorkNumbers = dto.getOrderWorkNumbers();
|
||
|
||
List<MmPickBill> pickBillList = mmPickBillRepository.findByOrderWorkNumbersLike("%" + orderWorkNumbers + "%");
|
||
log.info("pickBillList库存:" + pickBillList);
|
||
List<MmStockArea> mmStockList = BeanUtil.copyProperties(dto.getStockDtoList(), MmStockArea.class);
|
||
List<MmStockArea> stockList = new ArrayList<>();
|
||
|
||
if (pickBillList != null && pickBillList.size() > 0) {
|
||
String[] billIdArr = new String[pickBillList.size()];
|
||
for (int i = 0; i < pickBillList.size(); i++) {
|
||
billIdArr[i] = pickBillList.get(i).getPickBillNumber();
|
||
}
|
||
for (MmStockArea mmStock : mmStockList) {
|
||
BigDecimal qty = new BigDecimal(0);
|
||
final List<MmStockArea> mmStockAreaList = stockAreaRepository
|
||
.findByWarehouseCodeAndMaterialIdAndBillNumberIn(mmStock.getWarehouseCode(),
|
||
mmStock.getMaterialId(), billIdArr);
|
||
for (MmStockArea mmStockArea : mmStockAreaList) {
|
||
if (mmStockArea.getBackflushedQty() != null) {
|
||
qty = qty.add(mmStockArea.getQty()).subtract(mmStockArea.getBackflushedQty());
|
||
} else {
|
||
qty = qty.add(mmStockArea.getQty());
|
||
}
|
||
}
|
||
mmStock.setQty(qty);
|
||
stockList.add(mmStock);
|
||
mmStockAreaList.clear();
|
||
}
|
||
} else {
|
||
for (MmStockArea mmStock : mmStockList) {
|
||
BigDecimal qty = new BigDecimal(0);
|
||
mmStock.setQty(qty);
|
||
stockList.add(mmStock);
|
||
}
|
||
}
|
||
List<MmStockDto> stockDtos = BeanUtil.copyProperties(stockList, MmStockDto.class);
|
||
//查询ERP库存
|
||
for (MmStockDto mmStockDto : stockDtos) {
|
||
com.cmeim.kafka.api.dto.stock.MmStockDto kafkaDto = new com.cmeim.kafka.api.dto.stock.MmStockDto();
|
||
MaterialDto materialDto = remoteService.findByMaterialId(mmStockDto.getMaterialId());
|
||
if (materialDto != null) {
|
||
kafkaDto.setMaterialCode(materialDto.getMaterialCode());
|
||
}
|
||
kafkaDto.setWarehouseCode(mmStockDto.getWarehouseCode());
|
||
log.info("kafkaDto:" + kafkaDto);
|
||
R respond = syncEdgeService.queryStockBycMaterialCodeAndWarehouseCode(kafkaDto);
|
||
if (respond.getCode() == 200) {
|
||
String iQuantity = respond.getData().toString();
|
||
log.info("查询ERP库存:" + mmStockDto.getMaterialCode() + "," + respond);
|
||
mmStockDto.setErpQty(new BigDecimal(iQuantity));
|
||
}
|
||
}
|
||
return buildSuccess(stockDtos);
|
||
}
|
||
|
||
/**
|
||
* 成品入库单新增
|
||
*
|
||
* @param vo 入库参数
|
||
* @return 操作结果
|
||
*/
|
||
@ApiOperation(value = "成品入库单新增")
|
||
@PostMapping(value = "add")
|
||
@Transactional
|
||
public Respond add(@RequestBody ProdInBillVo vo) {
|
||
final Boolean aBoolean = prodInBillService.judgeProdQty(vo.getMmProdInBill().getOrderWorkNumber(),
|
||
vo.getMmProdInBill().getInStockQty());
|
||
if (!aBoolean) {
|
||
throw new ServiceException(RespondEnum.FAILURE, "入库数量大于应入库数量");
|
||
}
|
||
MmProdInBill mmProdInBill = vo.getMmProdInBill();
|
||
|
||
TUserInfo userInfo = getCurrentUser();
|
||
String datetime = DateUtil.getCurrentDate();
|
||
|
||
|
||
List<SysUser> sysUserList = new ArrayList<SysUser>();
|
||
ArrayList<Long> userIds = new ArrayList<Long>();
|
||
userIds.add(userInfo.getUserId());
|
||
R<List<SysUser>> listR = remoteService.queryUser(userIds);
|
||
SysDept sysDept = new SysDept();
|
||
sysDept.setDeptId(listR.getData().get(0).getDeptId());
|
||
List<SysDept> sysDeptList = remoteService.queryDept(sysDept);
|
||
String deptName = sysDeptList.get(0).getDeptName();
|
||
mmProdInBill.setCreatedDt(datetime);
|
||
if (userInfo != null) {
|
||
mmProdInBill.setCreatedBy(userInfo.getUserName());
|
||
mmProdInBill.setDeptName(deptName);
|
||
mmProdInBill.setDeptNumber(sysDeptList.get(0).getPhone());
|
||
}
|
||
log.info("开始生成单据");
|
||
mmProdInBill.setProdInBillNumber(remoteService.getByCode(BaNumberRuleCode.CPRK));
|
||
mmProdInBill.setStatus(5);
|
||
MmProdInBill prodInBill = prodInBillRepository.save(mmProdInBill);
|
||
|
||
log.info("成品入库单主表:"+prodInBill);
|
||
|
||
//生成成品条码
|
||
Date date = new Date();
|
||
String timestamp = String.valueOf(date.getTime());
|
||
MmMaterialBar materialBar = new MmMaterialBar();
|
||
String dateBar = remoteService.getByCode(BaNumberRuleCode.PRODLNBAR);
|
||
String bar = mmProdInBill.getMaterialCode()+dateBar;
|
||
materialBar.setMaterialBar(bar);
|
||
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
|
||
String format = sdf.format(new Date());
|
||
log.info("成品入库单条码:"+timestamp+"批次:"+format);
|
||
materialBar.setBatchNo(format.replace("-", ""));
|
||
materialBar.setMaterialId(mmProdInBill.getMaterialId());
|
||
materialBar.setMaterialCode(mmProdInBill.getMaterialCode());
|
||
materialBar.setMaterialName(mmProdInBill.getMaterialName());
|
||
materialBar.setMaterialSpec(mmProdInBill.getMaterialSpec());
|
||
materialBar.setMaterialQty(mmProdInBill.getInStockQty());
|
||
materialBar.setCreatedDt(DateUtil.getCurrentDate());
|
||
materialBar.setInputBillId(mmProdInBill.getId());
|
||
materialBar.setInputBillNumber(mmProdInBill.getProdInBillNumber());
|
||
MmMaterialBar newBar = materialBarService.createNewBar(materialBar);
|
||
log.info("生成的成品条码:"+newBar);
|
||
for (MmProdInBillDetail detail : vo.getMmProdInBillDetailList()) {
|
||
detail.setProdInBillNumber(prodInBill.getProdInBillNumber());
|
||
detail.setCreatedBy(userInfo.getUserName());
|
||
detail.setCreatedDt(datetime);
|
||
}
|
||
saveDetails(vo.getMmProdInBillDetailList());
|
||
log.info("反写检验记录");
|
||
remoteService.prodInStock(vo.getInspectionDtoList());
|
||
List<ReWriteProductQtyDto> dto = new ArrayList<>();
|
||
ReWriteProductQtyDto reWriteProductQtyDto = new ReWriteProductQtyDto();
|
||
reWriteProductQtyDto.setOrderWorkNumber(mmProdInBill.getOrderWorkNumber());
|
||
reWriteProductQtyDto.setInStockQty(mmProdInBill.getInStockQty());
|
||
reWriteProductQtyDto.setDeliverQty(BigDecimal.ZERO);
|
||
dto.add(reWriteProductQtyDto);
|
||
log.info("反写订单数量");
|
||
log.info(String.valueOf(dto));
|
||
R r = remoteService.reWriteQty(dto);
|
||
if (r.getCode() != R.SUCCESS) {
|
||
throw new ServiceException(RespondEnum.PARAMETER_ERROR, "反写订单数量失败");
|
||
}
|
||
log.info(String.valueOf(r.getCode()));
|
||
return buildSuccess(prodInBill);
|
||
}
|
||
|
||
private void saveDetails(List<MmProdInBillDetail> detailList) {
|
||
|
||
List<MmProdInBillDetail> mmProdInBillDetails = prodInBillDetailRepository.saveAll(detailList);
|
||
log.info("成品入库单明细表:"+mmProdInBillDetails);
|
||
}
|
||
|
||
/**
|
||
* 成品入库单删除
|
||
*
|
||
* @param ids 单据id
|
||
* @return 操作结果
|
||
*/
|
||
@ApiOperation(value = "成品入库单删除")
|
||
@PostMapping(value = "delete")
|
||
@Transactional
|
||
public Respond delete(String ids) {
|
||
String[] strings = ids.split(",");
|
||
for (int i = 0; i < strings.length; i++) {
|
||
MmProdInBill mmProdInBill = prodInBillRepository.findById(Long.valueOf(strings[i])).get();
|
||
if (StringUtils.isNotBlank(mmProdInBill.getErpNumber())) {
|
||
throw new ServiceException(
|
||
RespondEnum.PARAMETER_ERROR, "单据【" + mmProdInBill.getProdInBillNumber() + "】已上传erp,不能删除");
|
||
}
|
||
}
|
||
return buildSuccess(prodInBillService.delete(ids));
|
||
}
|
||
|
||
/**
|
||
* web端手动推送ERP
|
||
*
|
||
* @param billNumber 入库单号
|
||
* @return 操作结果
|
||
*/
|
||
@ApiOperation(value = "web端手动推送ERP")
|
||
@GetMapping(value = "pushErp")
|
||
@Transactional
|
||
public Respond pushErp(String billNumber) {
|
||
prodInBillService.finishProduckByWeb(billNumber);
|
||
return buildSuccess();
|
||
}
|
||
|
||
@ApiOperation(value = "打印条码")
|
||
@GetMapping(value = "printBars")
|
||
public Respond printBars(String prodInBillNumber) {
|
||
return buildSuccess(prodInBillService.printBars(prodInBillNumber));
|
||
}
|
||
|
||
/**
|
||
* 获取相关物料条码
|
||
*
|
||
* @param idsVo 其他入库单id集合
|
||
* @return 查询结果
|
||
*/
|
||
@ApiOperation(value = "获取相关物料条码")
|
||
@PostMapping(value = "getMaterialBar")
|
||
public Respond getMaterialBar(@RequestBody IdsVo idsVo) {
|
||
ProdInputBarVo vo = new ProdInputBarVo();
|
||
|
||
List<MmProdInBill> allById = prodInBillRepository.findAllById(idsVo.getIds());
|
||
vo.setMmProdInBillList(allById);
|
||
|
||
List<String> inputBillNumbers =
|
||
allById.stream().map(MmProdInBill::getProdInBillNumber).collect(Collectors.toList());
|
||
log.info("inputBillNumbers:" + inputBillNumbers);
|
||
List<MmMaterialBar> materialBars = materialBarRepository.findAllByInputBillNumberIn(inputBillNumbers);
|
||
for (MmMaterialBar mmMaterialBar : materialBars) {
|
||
|
||
if (com.cmeim.common.core.utils.StringUtils.isNotBlank(mmMaterialBar.getInputBillNumber())) {
|
||
MmMaterialBar materialBarSplit = getMaterialBarSplit(mmMaterialBar);
|
||
if (com.cmeim.common.core.utils.StringUtils.isNotBlank(materialBarSplit.getCustomerAbbreviation())) {
|
||
continue;
|
||
}
|
||
}
|
||
|
||
if (com.cmeim.common.core.utils.StringUtils.isNotBlank(mmMaterialBar.getWarehouseCode())) {
|
||
BaWarehouse baWarehouse = baWareHouseRepository.findByWarehouseCode(mmMaterialBar.getWarehouseCode());
|
||
if (com.cmeim.common.core.utils.StringUtils.isNotBlank(baWarehouse.getCustomerAbbreviation())) {
|
||
mmMaterialBar.setCustomerAbbreviation(baWarehouse.getCustomerAbbreviation());
|
||
}
|
||
}
|
||
}
|
||
vo.setMaterialBars(materialBars);
|
||
return buildSuccess(vo);
|
||
}
|
||
public MmMaterialBar getMaterialBarSplit(MmMaterialBar mmMaterialBar) {
|
||
MmProdInBill byInputBillNumber = prodInBillRepository.findByProdInBillNumber(
|
||
mmMaterialBar.getInputBillNumber());
|
||
if (byInputBillNumber != null) {
|
||
BaWarehouse baWarehouse = baWareHouseRepository.findByWarehouseCode(byInputBillNumber.getInStockWarehouseNumber());
|
||
if (com.cmeim.common.core.utils.StringUtils.isNotBlank(baWarehouse.getCustomerAbbreviation())) {
|
||
mmMaterialBar.setCustomerAbbreviation(baWarehouse.getCustomerAbbreviation());
|
||
}
|
||
}
|
||
return mmMaterialBar;
|
||
}
|
||
|
||
/**
|
||
* 导出成品入库单列表
|
||
*/
|
||
@ApiOperation(value = "导出成品入库单列表")
|
||
@GetMapping(value = "exportExcel")
|
||
public void exportExcel(ProdInVo prodInVo, HttpServletResponse response) throws Exception {
|
||
SXSSFWorkbook workbook = new SXSSFWorkbook();
|
||
SXSSFSheet sheet = workbook.createSheet("生产领料单");
|
||
List<MmProdInBill> list = prodInBillRepository.findAll(buildSpecification(prodInVo));
|
||
String[] cloumns = new String[]{"序号", "成品入库单号", "入库状态", "制单人", "制单时间",
|
||
"入库类别", "工单号", "转入仓库", "转出仓库", "数量",
|
||
"产品编码", "产品名称", "产品规格", "备注", "ERP单号"};
|
||
|
||
List<Object[]> datalist = prodInBillService.initPrintData(list, cloumns);
|
||
ExcelExportUtil.getExportWorkbook(workbook, sheet, cloumns, datalist);
|
||
ExcelExportUtil.sendHttpResponse(response, "prodInBill", workbook);
|
||
}
|
||
|
||
|
||
@ApiOperation(value = "撤回上传到erp")
|
||
@GetMapping(value = "cancelPushErp")
|
||
@Transactional
|
||
public Respond cancelPushErp(String billNumber) {
|
||
prodInBillService.cancelPushErp(billNumber, this.getCurrentUser());
|
||
return buildSuccess();
|
||
}
|
||
|
||
}
|