package com.huaheng.mobile.shipment; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.huaheng.api.general.domain.ReceiptDomain; import com.huaheng.api.general.domain.ShipmentDomain; import com.huaheng.common.constant.QuantityConstant; import com.huaheng.common.exception.BusinessException; import com.huaheng.common.utils.StringUtils; import com.huaheng.common.utils.security.ShiroUtils; import com.huaheng.framework.aspectj.lang.annotation.Log; import com.huaheng.framework.aspectj.lang.constant.BusinessType; import com.huaheng.framework.web.controller.BaseController; import com.huaheng.framework.web.domain.AjaxResult; import com.huaheng.mobile.invenory.TaskIds; import com.huaheng.mobile.receipt.ReceiptBill; import com.huaheng.pc.config.company.domain.Company; import com.huaheng.pc.config.company.service.CompanyService; import com.huaheng.pc.config.material.domain.Material; import com.huaheng.pc.config.material.service.MaterialService; import com.huaheng.pc.config.receiptType.domain.ReceiptType; import com.huaheng.pc.config.shipmentType.domain.ShipmentType; import com.huaheng.pc.config.shipmentType.service.ShipmentTypeService; import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail; import com.huaheng.pc.inventory.inventoryDetail.service.InventoryDetailService; import com.huaheng.pc.inventory.inventoryHeader.service.InventoryHeaderService; import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail; import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader; import com.huaheng.pc.shipment.shipmentContainerHeader.domain.ShipmentCombinationModel; import com.huaheng.pc.shipment.shipmentContainerHeader.domain.ShipmentContainerHeader; import com.huaheng.pc.shipment.shipmentContainerHeader.service.ShipmentContainerHeaderService; import com.huaheng.pc.shipment.shipmentDetail.domain.ShipmentDetail; import com.huaheng.pc.shipment.shipmentDetail.service.ShipmentDetailService; import com.huaheng.pc.shipment.shipmentHeader.domain.ShipmentHeader; import com.huaheng.pc.shipment.shipmentHeader.mapper.ShipmentHeaderMapper; import com.huaheng.pc.shipment.shipmentHeader.service.ShipmentHeaderService; import com.huaheng.pc.task.taskHeader.domain.ShipmentTaskCreateModel; import com.huaheng.pc.task.taskHeader.service.ShipmentTaskService; import com.huaheng.pc.task.taskHeader.service.TaskHeaderService; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; /** * @author mahua * @ClassName MobileShipmentController * @projectName wms_xinyi * @description: TODO * @date 2020/2/1115:29 */ @RestController @RequestMapping("/mobile/shipment") public class MobileShipmentController extends BaseController { @Resource private ShipmentHeaderService shipmentHeaderService; @Resource private ShipmentDetailService shipmentDetailService; @Resource private ShipmentContainerHeaderService shipmentContainerHeaderService; @Resource private ShipmentTaskService shipmentTaskService; @Resource private ShipmentTypeService shipmentTypeService; @Resource private InventoryDetailService inventoryDetailService; @Resource private ShipmentHeaderMapper shipmentHeaderMapper; @Resource private MaterialService materialService; /** * 自动组盘 * @param * @return */ @PostMapping("/autoCombination") @ResponseBody public AjaxResult autoCombination(@RequestBody Map<String, String> param){ String shipmentCode = param.get("shipmentCode"); AjaxResult ajaxResult = shipmentContainerHeaderService.autoCombination(shipmentCode); return ajaxResult; } /** * 手动组盘 * @param * @return */ @PostMapping("/combination") @ResponseBody public AjaxResult combination(@RequestBody List<ShipmentMaterial> shipmentMaterials){ if(shipmentMaterials == null || shipmentMaterials.size() <= 0) { return AjaxResult.error("组盘信息为空"); } List<Integer> taskIds = new ArrayList<>(); for(ShipmentMaterial shipmentMaterial : shipmentMaterials) { if(shipmentMaterial.getQty() == 0) { continue; } ShipmentCombinationModel shipmentCombination = new ShipmentCombinationModel(); String containerCode = shipmentMaterial.getContainerCode(); String locationCode = shipmentMaterial.getLocaitonCode(); shipmentCombination.setShipQty(new BigDecimal(shipmentMaterial.getQty())); shipmentCombination.setTaskType(QuantityConstant.TASK_TYPE_SORTINGSHIPMENT); shipmentCombination.setCompanyCode(shipmentMaterial.getCompanyCode()); shipmentCombination.setShipmentDetailId(shipmentMaterial.getShipmentDetailId()); LambdaQueryWrapper<InventoryDetail> lambdaQueryWrapper = Wrappers.lambdaQuery(); lambdaQueryWrapper.eq(InventoryDetail::getWarehouseCode, ShiroUtils.getWarehouseCode()) .eq(StringUtils.isNotEmpty(containerCode), InventoryDetail::getContainerCode, containerCode) .eq(StringUtils.isNotEmpty(locationCode), InventoryDetail::getLocationCode, locationCode) .eq(InventoryDetail::getMaterialCode, shipmentMaterial.getMaterialCode()); InventoryDetail inventoryDetail = inventoryDetailService.getOne(lambdaQueryWrapper); int qty = inventoryDetail.getQty().subtract(inventoryDetail.getTaskQty()).intValue(); if(shipmentMaterial.getQty() > qty) { return AjaxResult.error("出库数量必须小于库存数量"); } shipmentCombination.setInventoryDetailId(inventoryDetail.getId()); ShipmentContainerHeader shipmentContainerHeader = shipmentContainerHeaderService.combination(shipmentCombination); taskIds.add(shipmentContainerHeader.getId()); } if(taskIds.size() > 0) { return AjaxResult.success(taskIds); } else { return AjaxResult.error("组盘失败"); } } /** * 查询出库单主列表 */ @Log(title = "出库-出库单", operating="查看出库主单", action = BusinessType.GRANT) @PostMapping("/list") public AjaxResult list(@RequestBody @ApiParam(value = "出库单号-referCode、货主编码-companyCode、出库单类型-shipmentType") Map<String, String> param) { if (StringUtils.isEmpty(param.get("companyCode"))) { return AjaxResult.error("上游系统单号为空"); } else if (StringUtils.isEmpty(param.get("shipmentType"))) { return AjaxResult.error("类型为空"); } else if (StringUtils.isEmpty(param.get("referCode"))) { return AjaxResult.error("上游系统单号为空"); } LambdaQueryWrapper<ShipmentHeader> lambdaQueryWrapper = Wrappers.lambdaQuery(); lambdaQueryWrapper.eq(ShipmentHeader::getWarehouseCode, ShiroUtils.getWarehouseCode()) .eq(ShipmentHeader::getDeleted,false) .in(ShipmentHeader::getCompanyCode, param.get("companyCode")) .eq(ShipmentHeader::getShipmentType,param.get("shipmentType")) .eq(ShipmentHeader::getReferCode, param.get("referCode")) .orderByDesc(ShipmentHeader::getId); ShipmentHeader shipmentHeader = shipmentHeaderService.getOne(lambdaQueryWrapper); if (shipmentHeader == null) { return AjaxResult.error("没有找到出库单"); } LambdaQueryWrapper<ShipmentDetail> detailLambdaQueryWrapper = Wrappers.lambdaQuery(); detailLambdaQueryWrapper.eq(ShipmentDetail::getShipmentId, shipmentHeader.getId()); Shipment shipment = new Shipment(); shipment.setShipmentHeader(shipmentHeader); List<ShipmentDetail> shipmentDetailList = shipmentDetailService.list(detailLambdaQueryWrapper); shipment.setShipmentDetailList(shipmentDetailList); return AjaxResult.success(shipment); } /** * 根据出库单号生成出库任务 */ @PostMapping("/createShipmentTask") @ResponseBody @Transactional(rollbackFor = Exception.class) public AjaxResult createShipmentTask(@RequestBody List<TaskIds> taskDetails){ List<Integer> ids = new ArrayList<>(); for (TaskIds task : taskDetails) { ids.add(task.getTaskId()); } List<Integer> listWithoutDuplicates = ids.stream().distinct().collect(Collectors.toList()); ShipmentTaskCreateModel shipmentTask = new ShipmentTaskCreateModel(); List<Integer> taskIds = new ArrayList<>(); for (Integer id : listWithoutDuplicates) { shipmentTask.setShipmentContainerHeaderIds(id); AjaxResult ajaxResult = shipmentTaskService.createTaskFromShipmentContainers(shipmentTask); if(ajaxResult.hasErr()){ return ajaxResult; } Integer taskId = (Integer)ajaxResult.getData(); taskIds.add(taskId); } return AjaxResult.success(taskIds); } @PostMapping("/findShipment") @ApiOperation("移动端查询出库单") @Log(title = "移动端查询出库单", action = BusinessType.OTHER) public AjaxResult findShipment(@RequestBody @ApiParam(value = "物料号") Map<String, String> param){ String shipmentCode = param.get("shipmentCode"); String companyCode = param.get("companyCode"); if (StringUtils.isNull(shipmentCode)){ return AjaxResult.error("上游系统关联单号为空"); } else if (StringUtils.isNull(companyCode)){ return AjaxResult.error("公司编码为空"); } /* 查询入库单,如果数据库中不存在,则调用ERP接口拉取单据,成功后再次查询返回结果*/ LambdaQueryWrapper<ShipmentHeader> shipmentLambdaQueryWrapper = Wrappers.lambdaQuery(); shipmentLambdaQueryWrapper.eq(ShipmentHeader::getCode, shipmentCode) .eq(ShipmentHeader::getCompanyCode, companyCode); ShipmentHeader shipmentHeader = shipmentHeaderService.getOne(shipmentLambdaQueryWrapper); if(shipmentHeader == null) { return AjaxResult.error("没有找到出库单"); } ShipmentDomain shipment = new ShipmentDomain(); shipment.setShipmentHeader(shipmentHeader); LambdaQueryWrapper<ShipmentDetail> shipmentDetailQueryWrapper = Wrappers.lambdaQuery(); shipmentDetailQueryWrapper.eq(ShipmentDetail::getShipmentId, shipmentHeader.getId()); List<ShipmentDetail> shipmentDetailList = shipmentDetailService.list(shipmentDetailQueryWrapper); shipment.setShipmentDetails(shipmentDetailList); return AjaxResult.success(shipment); } @PostMapping("/searchShipment") @ApiOperation("移动端查询出库单") @Log(title = "移动端查询出库单", action = BusinessType.OTHER) public AjaxResult searchShipment(@RequestBody @ApiParam(value = "物料号") Map<String, String> param){ String companyCode = param.get("companyCode"); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String now = df.format(new Date()); Calendar c = Calendar.getInstance(); c.setTime(new Date()); c.add(Calendar.DATE, -7); Date first = c.getTime(); String start = df.format(first);//前一天 LambdaQueryWrapper<ShipmentHeader> shipmentHeaderQueryWrapper = Wrappers.lambdaQuery(); shipmentHeaderQueryWrapper.eq(ShipmentHeader::getCompanyCode, companyCode) .eq(ShipmentHeader::getWarehouseCode, ShiroUtils.getWarehouseCode()) .le(ShipmentHeader::getCreated, now) .gt(ShipmentHeader::getCreated, start) .orderByDesc(ShipmentHeader::getCreated); List<ShipmentHeader> receiptHeaderList = shipmentHeaderService.list(shipmentHeaderQueryWrapper); return AjaxResult.success(receiptHeaderList); } @PostMapping("/searchShipmentInCondition") @ApiOperation("移动端查询出库单") @Log(title = "移动端查询出库单", action = BusinessType.OTHER) public AjaxResult searchShipmentInCondition(@RequestBody @ApiParam(value = "物料号") Map<String, String> param){ String companyCode = param.get("companyCode"); String code = param.get("code"); String shipmentType = param.get("shipmentType"); String lastStatus = param.get("lastStatus"); String startTime = param.get("startTime"); String endTime = param.get("endTime"); LambdaQueryWrapper<ShipmentHeader> shipmentQueryWrapper = Wrappers.lambdaQuery(); shipmentQueryWrapper.eq(ShipmentHeader::getCompanyCode, companyCode) .eq(ShipmentHeader::getWarehouseCode, ShiroUtils.getWarehouseCode()) .like(StringUtils.isNotEmpty(code), ShipmentHeader::getCode, code) .eq(StringUtils.isNotEmpty(shipmentType), ShipmentHeader::getShipmentType, shipmentType) .eq(StringUtils.isNotEmpty(lastStatus), ShipmentHeader::getLastStatus, lastStatus) .gt(StringUtils.isNotEmpty(startTime), ShipmentHeader::getCreated, startTime) .le(StringUtils.isNotEmpty(endTime), ShipmentHeader::getCreated, endTime) .orderByDesc(ShipmentHeader::getCreated); List<ShipmentHeader> shipmentHeaderList = shipmentHeaderService.list(shipmentQueryWrapper); return AjaxResult.success(shipmentHeaderList); } @PostMapping("/getShipmentType") @ApiOperation("移动端查询入库类型") @Log(title = "移动端查询字典信息", action = BusinessType.OTHER) public AjaxResult getShipmentType(@RequestBody @ApiParam(value = "物料号") Map<String, String> param){ LambdaQueryWrapper<ShipmentType> shipmentTypeLambda = Wrappers.lambdaQuery(); List<ShipmentType> shipmentTypes = shipmentTypeService.list(shipmentTypeLambda); return AjaxResult.success(shipmentTypes); } @PostMapping("/createShipmentCode") @ApiOperation("移动端创建出库单号") @Log(title = "移动端创建出库单号", action = BusinessType.OTHER) public AjaxResult createShipmentCode(@RequestBody @ApiParam(value = "物料号") Map<String, String> param){ String shipmentType = "ELO"; String code = null; Date now = new Date(); SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd"); String maxCode = shipmentHeaderMapper.createCode(shipmentType); //如果指定类型的最后的code存在,并且日期一致。那么 code = 入库单类型 + 年月日 + (排序号 + 1) if (maxCode != null && maxCode.substring(maxCode.length() - 11, maxCode.length() - 3).equals(df.format(now))) { Integer Count = Integer.valueOf(maxCode.substring(maxCode.length() - 3, maxCode.length())); code = shipmentType + df.format(now) + String.format("%03d", Count + 1); } else { code = shipmentType + df.format(now) + "001"; } return AjaxResult.success().setData(code); } @PostMapping("/createShipment") @ApiOperation("移动端创建出库单") @Log(title = "移动端创建出库单", action = BusinessType.OTHER) @Transactional(rollbackFor = Exception.class) public AjaxResult createShipment(@RequestBody @ApiParam(value = "物料号")List<ShipmentBill> shipmentBills){ String companyCode = shipmentBills.get(0).getCompanyCode(); String shipmentCode = shipmentBills.get(0).getShipmentCode(); String shipmentType = "ELO"; ShipmentHeader shipmentHeader = new ShipmentHeader(); shipmentHeader.setId(null); shipmentHeader.setCode(shipmentCode); shipmentHeader.setShipmentType(shipmentType); shipmentHeader.setWarehouseCode(ShiroUtils.getWarehouseCode()); shipmentHeader.setCreatedBy(ShiroUtils.getLoginName()); shipmentHeader.setLastUpdatedBy(ShiroUtils.getLoginName()); shipmentHeader.setFirstStatus(200); shipmentHeader.setLastStatus(200); shipmentHeader.setCompanyCode(companyCode); shipmentHeaderService.save(shipmentHeader); List<Integer> shipmentdetailIds = insertTodayShipmentDetail(shipmentHeader.getId(), shipmentBills, false, companyCode); shipmentDetailService.updateShipmentHeader(shipmentHeader); if(shipmentdetailIds != null && shipmentdetailIds.size() > 0) { return AjaxResult.success("创建出库单成功"); } return AjaxResult.error("创建出库单失败"); } public List<Integer> insertTodayShipmentDetail(int headerId, List<ShipmentBill> shipmentBills, boolean isCompletedQty, String companyCode) { List<Integer> mShipmentDetailIds = new ArrayList<>(); ShipmentHeader shipmentHeader = shipmentHeaderService.getById(headerId); for (ShipmentBill shipmentBill : shipmentBills) { ShipmentDetail shipmentDetail = new ShipmentDetail(); shipmentDetail.setId(null); shipmentDetail.setWarehouseCode(ShiroUtils.getWarehouseCode()); shipmentDetail.setCompanyCode(companyCode); shipmentDetail.setShipmentId(headerId); shipmentDetail.setShipmentCode(shipmentHeader.getCode()); shipmentDetail.setMaterialCode(shipmentBill.getMaterialCode()); LambdaQueryWrapper<Material> lambdaQueryWrapper = Wrappers.lambdaQuery(); lambdaQueryWrapper.eq(Material::getCode, shipmentBill.getMaterialCode()) .eq(Material::getWarehouseCode, ShiroUtils.getWarehouseCode()); Material material = materialService.getOne(lambdaQueryWrapper); shipmentDetail.setMaterialName(material.getName()); shipmentDetail.setMaterialUnit(material.getUnit()); shipmentDetail.setInventorySts("good"); shipmentDetail.setShipQty(shipmentBill.getQty()); shipmentDetailService.save(shipmentDetail); mShipmentDetailIds.add(shipmentDetail.getId()); } return mShipmentDetailIds; } }