纪新园 1 год назад
Родитель
Сommit
0e89d8b1ba

+ 9 - 0
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/enums/OrderTypeEnum.java

@@ -214,6 +214,15 @@ public enum OrderTypeEnum {
 	 * 生产领料
 	 */
 	SCLL("SCLL"),
+
+	/**
+	 * 待领料
+	 */
+	STAY_PICKING("待领料"),
+	/**
+	 * 已领料
+	 */
+	STOP_PICKING("已领料"),
 	;
 
 	private final String type;

+ 10 - 0
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/produce/entity/ProductWorkmanshipItems.java

@@ -124,6 +124,16 @@ public class ProductWorkmanshipItems implements Serializable {
 	 */
 	@ApiModelProperty(value = "租户id")
 	private String tenantId;
+	/**
+	 * 预计时间
+	 */
+	@ApiModelProperty(value = "预计时间")
+	private String estimatedTime;
+	/**
+	 * 实际时间
+	 */
+	@ApiModelProperty(value = "实际时间")
+	private String actualTime;
 
 
 }

+ 1 - 3
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/controller/ShareSalesController.java

@@ -269,10 +269,8 @@ public class ShareSalesController {
 				item.setPaymentStatus("-");
 			}
 		}
-		if ("XS".equals(order.getBsType())) {
+		if ("GX".equals(order.getBsType())) {
 			ExcelUtil.export(response, "销售订单", "订单数据", list, PjOrderExportExcelXS.class);
-		} else {
-			ExcelUtil.export(response, "采购订单", "订单数据", BeanUtil.copy(pages, PjOrderExportExcelCG.class), PjOrderExportExcelCG.class);
 		}
 
 	}

+ 217 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/produce/controller/ProductionPickingController.java

@@ -0,0 +1,217 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.salesPart.produce.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiParam;
+import lombok.AllArgsConstructor;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.salesPart.entity.PjShip;
+import org.springblade.salesPart.entity.PjShipItems;
+import org.springblade.salesPart.ship.service.IShipItemsService;
+import org.springblade.salesPart.ship.service.IShipService;
+import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * 生成领料 控制器
+ *
+ * @author BladeX
+ * @since 2025-02-10
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/productionPicking")
+@Api(value = "生成领料", tags = "生成领料接口")
+public class ProductionPickingController extends BladeController {
+
+	private final IShipService shipService;
+
+	private final IShipItemsService shipItemsService;
+
+	private final IUserClient userClient;
+
+	/**
+	 * 详情
+	 */
+	@GetMapping("/detailPicking")
+	public R<PjShip> detailPicking(PjShip ship) {
+		PjShip detail = shipService.detailProduction(ship);
+		return R.data(detail);
+	}
+
+	/**
+	 * 分页 生成领料
+	 */
+	@GetMapping("/listPicking")
+	public R<IPage<PjShip>> listPicking(PjShip ship, Query query) {
+		LambdaQueryWrapper<PjShip> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.select(PjShip::getId, PjShip::getBillno, PjShip::getOrdNo, PjShip::getBizTypeName,
+				PjShip::getCustomerName, PjShip::getStorageName, PjShip::getStockClerkName, PjShip::getStockClerkId,
+				PjShip::getSendTotalNum, PjShip::getGoodsTotalNum, PjShip::getStatusName, PjShip::getBusinesDate,
+				PjShip::getCreateUser, PjShip::getContacts, PjShip::getRemarks, PjShip::getBusinesDate, PjShip::getGoodsName,
+				PjShip::getCompletedDate)
+			.eq(PjShip::getTenantId, AuthUtil.getTenantId())
+			.eq(PjShip::getIsDeleted, 0)
+			.like(ObjectUtil.isNotEmpty(ship.getOrdNo()), PjShip::getOrdNo, ship.getOrdNo())
+			.like(ObjectUtil.isNotEmpty(ship.getBillno()), PjShip::getBillno, ship.getBillno())
+			.eq(ObjectUtil.isNotEmpty(ship.getStorageId()), PjShip::getStorageId, ship.getStorageId())
+			.like(ObjectUtil.isNotEmpty(ship.getStorageName()), PjShip::getStorageName, ship.getStorageName())
+			.eq(ObjectUtil.isNotEmpty(ship.getGoodsId()), PjShip::getGoodsId, ship.getGoodsId())
+			.like(ObjectUtil.isNotEmpty(ship.getGoodsName()), PjShip::getGoodsName, ship.getGoodsName())
+			.eq(ObjectUtil.isNotEmpty(ship.getCustomerId()), PjShip::getCustomerId, ship.getCustomerId())
+			.eq(ObjectUtil.isNotEmpty(ship.getStatusName()), PjShip::getStatusName, ship.getStatusName())
+			.eq(ObjectUtil.isNotEmpty(ship.getStockClerkName()), PjShip::getStockClerkName, ship.getStockClerkName())
+			.eq(ObjectUtil.isNotEmpty(ship.getStockClerkId()), PjShip::getStockClerkId, ship.getStockClerkId())
+			.eq(ObjectUtil.isNotEmpty(ship.getBsType()), PjShip::getBsType, ship.getBsType())
+			.like(ObjectUtil.isNotEmpty(ship.getCustomerName()), PjShip::getCustomerName, ship.getCustomerName())
+			//单据类型
+			.apply(ObjectUtil.isNotEmpty(ship.getBizTypeName()), "find_in_set(biz_type_name,'" + ship.getBizTypeName() + "')");
+		if (ship.getBusinesDateList() != null && ship.getBusinesDateList().size() > 1) {
+			lambdaQueryWrapper.ge(PjShip::getBusinesDate, ship.getBusinesDateList().get(0));
+			lambdaQueryWrapper.le(PjShip::getBusinesDate, ship.getBusinesDateList().get(1));
+		}
+		if (ship.getCompletedDateList() != null && ship.getCompletedDateList().size() > 1) {
+			lambdaQueryWrapper.ge(PjShip::getCompletedDate, ship.getCompletedDateList().get(0));
+			lambdaQueryWrapper.le(PjShip::getCompletedDate, ship.getCompletedDateList().get(1));
+		}
+		lambdaQueryWrapper.orderByDesc(PjShip::getCreateTime);
+		if (!AuthUtil.getUserRole().contains("admin") && !AuthUtil.getUserRole().contains("老板")) {
+			if (AuthUtil.getUserRole().contains("库管")) {
+				lambdaQueryWrapper.and(i -> i.eq(PjShip::getStockClerkId, AuthUtil.getUserId()).or().isNull(PjShip::getStockClerkId));
+			}
+		}
+		IPage<PjShip> pages = shipService.page(Condition.getPage(query), lambdaQueryWrapper);
+		if (CollectionUtils.isNotEmpty(pages.getRecords())) {
+			List<Long> createUser = pages.getRecords().stream().map(PjShip::getCreateUser).filter(Objects::nonNull).distinct().collect(Collectors.toList());
+			StringBuilder user = new StringBuilder();
+			List<User> userList = new ArrayList<>();
+			for (Long item : createUser) {
+				user.append(item).append(",");
+			}
+			if (ObjectUtils.isNotNull(user.toString())) {
+				userList = userClient.selectUserList(user.substring(0, user.length() - 1));
+			}
+			List<Long> ids = pages.getRecords().stream().map(PjShip::getId).collect(Collectors.toList());
+			List<PjShipItems> pjOrderItemsList = shipItemsService.list(new LambdaQueryWrapper<PjShipItems>().eq(PjShipItems::getIsDeleted, 0)
+				.in(PjShipItems::getPid, ids));
+			for (PjShip item : pages.getRecords()) {
+				if (ObjectUtil.isNotEmpty(userList)) {
+					if (ObjectUtils.isNotNull(item.getCreateUser())) {
+						userList.stream().filter(e -> e.getId().equals(item.getCreateUser()))
+							.findFirst().ifPresent(users -> item.setCreateUserName(users.getRealName()));
+					}
+				}
+				if (!pjOrderItemsList.isEmpty()) {
+					item.setItem(pjOrderItemsList.stream().filter(e -> e.getPid().equals(item.getId())).count() + "");
+				}
+			}
+		}
+		return R.data(pages);
+	}
+
+	/**
+	 * 新增或修改 生成领料
+	 */
+	@PostMapping("/submitPicking")
+	public R submitPicking(@Valid @RequestBody PjShip ship) {
+		return shipService.submitProduction(ship);
+	}
+
+	/**
+	 * 删除 生成领料
+	 */
+	@PostMapping("/removePicking")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(shipService.removeByIds(Func.toLongList(ids)));
+	}
+
+	/**
+	 * 确认领料
+	 */
+	@PostMapping("/confirmPicking")
+	public R confirmPicking(@Valid @RequestBody PjShip ship) {
+		return shipService.confirmPicking(ship);
+	}
+
+	/**
+	 * 撤销领料
+	 */
+	@PostMapping("/revokePicking")
+	public R revokePicking(@Valid @RequestBody PjShip ship) {
+		return shipService.revokePicking(ship);
+	}
+
+	/**
+	 * 领料
+	 */
+	@PostMapping("/generatePicking")
+	public R generatePicking(@Valid @RequestBody PjShip ship) {
+		return shipService.generatePicking(ship);
+	}
+
+	/**
+	 * 查看领料
+	 */
+	@GetMapping("/selectPicking")
+	public R<IPage<PjShip>> selectPicking(PjShip ship, Query query) {
+		LambdaQueryWrapper<PjShip> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(PjShip::getTenantId, AuthUtil.getTenantId())
+			.eq(PjShip::getIsDeleted, 0)
+			.like(ObjectUtil.isNotEmpty(ship.getOrdNo()), PjShip::getOrdNo, ship.getOrdNo())
+			.like(ObjectUtil.isNotEmpty(ship.getBillno()), PjShip::getBillno, ship.getBillno())
+			.like(ObjectUtil.isNotEmpty(ship.getSrcOrdNo()), PjShip::getSrcOrdNo, ship.getSrcOrdNo())
+			.eq(ObjectUtil.isNotEmpty(ship.getStorageId()), PjShip::getStorageId, ship.getStorageId())
+			.like(ObjectUtil.isNotEmpty(ship.getStorageName()), PjShip::getStorageName, ship.getStorageName())
+			.eq(ObjectUtil.isNotEmpty(ship.getGoodsId()), PjShip::getGoodsId, ship.getGoodsId())
+			.like(ObjectUtil.isNotEmpty(ship.getGoodsName()), PjShip::getGoodsName, ship.getGoodsName())
+			.eq(ObjectUtil.isNotEmpty(ship.getCustomerId()), PjShip::getCustomerId, ship.getCustomerId())
+			.eq(ObjectUtil.isNotEmpty(ship.getStatusName()), PjShip::getStatusName, ship.getStatusName())
+			.eq(ObjectUtil.isNotEmpty(ship.getStockClerkName()), PjShip::getStockClerkName, ship.getStockClerkName())
+			.eq(ObjectUtil.isNotEmpty(ship.getStockClerkId()), PjShip::getStockClerkId, ship.getStockClerkId())
+			.eq(ObjectUtil.isNotEmpty(ship.getBsType()), PjShip::getBsType, ship.getBsType())
+			.like(ObjectUtil.isNotEmpty(ship.getCustomerName()), PjShip::getCustomerName, ship.getCustomerName())
+			.apply(ObjectUtil.isNotEmpty(ship.getBizTypeName()), "find_in_set(biz_type_name,'" + ship.getBizTypeName() + "')");
+		lambdaQueryWrapper.orderByDesc(PjShip::getCreateTime);
+		if (!AuthUtil.getUserRole().contains("admin") && !AuthUtil.getUserRole().contains("老板")) {
+			if (AuthUtil.getUserRole().contains("库管")) {
+				lambdaQueryWrapper.and(i -> i.eq(PjShip::getStockClerkId, AuthUtil.getUserId()).or().isNull(PjShip::getStockClerkId));
+			}
+		}
+		IPage<PjShip> pages = shipService.page(Condition.getPage(query), lambdaQueryWrapper);
+		return R.data(pages);
+	}
+
+
+}

+ 6 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/service/IShipService.java

@@ -191,4 +191,10 @@ public interface IShipService extends IService<PjShip> {
 	R completed(PjShip ship);
 
 	R revokeCompleted(PjShip ship);
+
+	R confirmPicking(PjShip ship);
+
+	R revokePicking(PjShip ship);
+
+	R generatePicking(PjShip ship);
 }

+ 629 - 4
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/service/impl/ShipServiceImpl.java

@@ -6257,7 +6257,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 			if (ship.getBizTypeName().equals(OrderTypeEnum.SCDD.getType())) {
 				ship.setStatusName(OrderTypeEnum.PRODUCTION_IN.getType());
 			} else if (ship.getBizTypeName().equals(OrderTypeEnum.SCLL.getType())) {
-				ship.setStatusName(OrderTypeEnum.TOBESHIPPEDOUT.getType());
+				ship.setStatusName(OrderTypeEnum.STAY_PICKING.getType());
 			}
 			ship.setBillno(billNo);
 			ship.setCreateTime(new Date());
@@ -6279,7 +6279,6 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 		List<PjShipItems> shipItemsList = new ArrayList<>();
 		if (CollectionUtils.isNotEmpty(ship.getShipItemsList())) {
 			ship.getShipItemsList().forEach(item -> {
-				item.setCostprie(item.getSendNum().multiply(item.getCostpriePrice()));
 				if (item.getId() == null) {
 					item.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
 					item.setCreateTime(new Date());
@@ -6363,12 +6362,638 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 
 	@Override
 	public R completed(PjShip ship) {
-		return null;
+		// 保存订单明细
+		List<PjShipItems> shipItemsList = new ArrayList<>();
+		List<PjStockDesc> pjStockDescArrayListSave = new ArrayList<>();
+		List<PjStockDesc> pjStockDescArrayListUpdate = new ArrayList<>();
+		List<PjProductLaunch> pjProductLaunchList = new ArrayList<>();
+		if (CollectionUtils.isNotEmpty(ship.getShipItemsList())) {
+			ship.setSendTotalNum(ship.getShipItemsList().stream().map(PjShipItems::getSendNum).reduce(BigDecimal.ZERO, BigDecimal::add));
+			List<Long> goodIds = ship.getShipItemsList().stream().map(PjShipItems::getGoodsId).distinct().collect(Collectors.toList());
+			List<PjGoodsDesc> pjGoodsDescList = goodsDescMapper.selectList(new LambdaQueryWrapper<PjGoodsDesc>()
+				.eq(PjGoodsDesc::getTenantId, AuthUtil.getTenantId())
+				.eq(PjGoodsDesc::getIsDeleted, 0)
+				.in(PjGoodsDesc::getId, goodIds));
+			//修改库存账
+			LambdaQueryWrapper<PjStockDesc> stockLambdaQueryWrapper = new LambdaQueryWrapper<>();
+			stockLambdaQueryWrapper
+				.eq(PjStockDesc::getTenantId, AuthUtil.getTenantId())
+				.eq(PjStockDesc::getIsDeleted, 0)
+				.eq(PjStockDesc::getSalesCompanyId, ship.getSalesCompanyId())
+				.in(PjStockDesc::getGoodsId, goodIds);
+			List<PjStockDesc> pjStockDescList = iStockDescService.list(stockLambdaQueryWrapper);
+			List<PjGoodsType> pjGoodsTypeList = goodsTypeMapper.selectList(new LambdaQueryWrapper<PjGoodsType>()
+				.eq(PjGoodsType::getTenantId, AuthUtil.getTenantId())
+				.eq(PjGoodsType::getIsDeleted, 0)
+				.in(PjGoodsType::getId, goodIds)
+			);
+			List<PjOrderItems> orderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>()
+				.eq(PjOrderItems::getTenantId, AuthUtil.getTenantId())
+				.eq(PjOrderItems::getIsDeleted, 0)
+				.eq(PjOrderItems::getBsType, "PD")
+				.ne(PjOrderItems::getStatus, "已确认")
+				.in(PjOrderItems::getGoodsId, goodIds)
+			);
+			StringBuilder msg1 = new StringBuilder();
+			//获得仓库
+			PjStorageDesc storageDesc = storageDescMapper.selectById(ship.getStorageId());
+			for (PjShipItems item : ship.getShipItemsList()) {
+				if (item.getId() == null) {
+					item.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+					item.setCreateTime(new Date());
+					item.setCreateUser(AuthUtil.getUserId());
+					item.setPid(ship.getId());
+					item.setTenantId(AuthUtil.getTenantId());
+				} else {
+					item.setUpdateTime(new Date());
+					item.setUpdateUser(AuthUtil.getUserId());
+					item.setPid(ship.getId());
+				}
+				item.setSendNum(item.getGoodsNum());
+				item.setSendNumHave(item.getGoodsNum());
+				List<PjOrderItems> pjOrderItemsList1 = orderItemsList.stream().filter(e -> e.getGoodsId().equals(item.getGoodsId())).collect(Collectors.toList());
+				if (!pjOrderItemsList1.isEmpty()) {
+					msg1.append(item.getGoodsName()).append(",");
+				}
+				//获得商品
+				PjGoodsDesc goodsDesc = pjGoodsDescList.stream().filter(e -> e.getId().equals(item.getGoodsId())).findFirst().orElse(null);
+				if (ObjectUtil.isEmpty(goodsDesc)) {
+					throw new RuntimeException("商品数据异常");
+				}
+				if ("1".equals(goodsDesc.getWhether()) && ObjectUtils.isNull(item.getDot())) {
+					throw new RuntimeException("商品:" + goodsDesc.getCname() + ",请选择批次号");
+				}
+				//生成库存账
+				PjStockDesc stockDesc = new PjStockDesc();
+				stockDesc.setSalesCompanyId(ship.getSalesCompanyId());
+				stockDesc.setSalesCompanyName(ship.getSalesCompanyName());
+				stockDesc.setGoodsTypeId(goodsDesc.getGoodsTypeId());
+				if (ObjectUtils.isNotNull(goodsDesc.getGoodsTypeId())) {
+					PjGoodsType goodsType = pjGoodsTypeList.stream().filter(e -> (e.getId() + "").equals(goodsDesc.getGoodsTypeId())).findFirst().orElse(null);
+					if (goodsType != null) {
+						stockDesc.setGoodsTypeName(goodsType.getCname());
+					}
+				}
+				stockDesc.setGoodsId(goodsDesc.getId());
+				stockDesc.setCode(item.getGoodsNo());
+				stockDesc.setCname(goodsDesc.getCname());
+				stockDesc.setInventoryAlert(goodsDesc.getInventoryAlert());
+				stockDesc.setBrandId(goodsDesc.getBrandId());
+				stockDesc.setBrandName(goodsDesc.getBrandName());
+				stockDesc.setTypeno(item.getPropertyName());
+				stockDesc.setBrandItem(item.getPattern());
+				stockDesc.setProductDescription(item.getGoodsDescription());
+				stockDesc.setDot(item.getDot());
+				stockDesc.setTenantId(AuthUtil.getTenantId());
+				stockDesc.setCnameInt(goodsDesc.getCnameInt());
+
+				//管理批次号
+				PjStockDesc stockOne;
+				if (ObjectUtil.isNotEmpty(goodsDesc.getWhether()) && "1".equals(goodsDesc.getWhether())) {
+					stockOne = pjStockDescList.stream()
+						.filter(e -> e.getGoodsId().equals(item.getGoodsId())
+							&& e.getStorageId().equals(ship.getStorageId())
+							&& e.getDot().equals(item.getDot())).findFirst().orElse(null);
+				} else {
+					stockOne = pjStockDescList.stream()
+						.filter(e -> e.getGoodsId().equals(item.getGoodsId())
+							&& e.getStorageId().equals(ship.getStorageId())
+							&& ObjectUtils.isNull(e.getDot())).findFirst().orElse(null);
+				}
+				if (stockOne == null) {
+					if (ObjectUtil.isNotEmpty(storageDesc)) {
+						stockDesc.setStorageId(storageDesc.getId());
+						stockDesc.setStorageName(storageDesc.getCname());
+					} else {
+						throw new RuntimeException("仓库数据异常");
+					}
+					stockDesc.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+					stockDesc.setCreateTime(new Date());
+					stockDesc.setCreateUser(AuthUtil.getUserId());
+					stockDesc.setBalanceQuantity(item.getSendNum());
+					stockDesc.setBalanceQuantityHave(item.getSendNum());
+					stockDesc.setStoreInventory(item.getSendNum());
+					stockDesc.setInventoryAmount(item.getSendNum().multiply(item.getPrice()));
+					stockDesc.setInventoryCostPrice(item.getPrice());
+					pjStockDescArrayListSave.add(stockDesc);
+				} else {
+					stockDesc.setId(stockOne.getId());
+					stockDesc.setUpdateTime(new Date());
+					stockDesc.setUpdateUser(AuthUtil.getUserId());
+					stockDesc.setBalanceQuantity(stockOne.getBalanceQuantity().add(item.getSendNum()));
+					stockDesc.setBalanceQuantityHave(stockOne.getBalanceQuantityHave().add(item.getSendNum()));
+					stockDesc.setStoreInventory(stockDesc.getBalanceQuantity());
+					stockDesc.setInventoryAmount(item.getSendNum().multiply(item.getPrice()));
+					stockDesc.setInventoryAmount(stockDesc.getInventoryAmount().add(stockOne.getInventoryAmount()));
+					if (stockDesc.getBalanceQuantity().compareTo(new BigDecimal("0")) != 0) {
+						stockDesc.setInventoryCostPrice(stockDesc.getInventoryAmount().divide(stockDesc.getBalanceQuantity(), MathContext.DECIMAL32).setScale(2, RoundingMode.HALF_UP));
+					}
+					stockDesc.setVersion(stockOne.getVersion());
+					pjStockDescArrayListUpdate.add(stockDesc);
+				}
+				shipItemsList.add(item);
+			}
+			if (msg1.length() > 0) {
+				throw new RuntimeException("商品:" + msg1 + "正在盘点中,操作失败");
+			}
+			shipItemsService.saveOrUpdateBatch(shipItemsList);
+			if (!pjStockDescArrayListSave.isEmpty()) {
+				iStockDescService.saveBatch(pjStockDescArrayListSave);
+			}
+			if (!pjStockDescArrayListUpdate.isEmpty()) {
+				iStockDescService.updateBatchById(pjStockDescArrayListUpdate);
+			}
+			//查询所有上架商品
+			LambdaQueryWrapper<PjProductLaunch> productLaunchQueryWrapper = new LambdaQueryWrapper<>();
+			productLaunchQueryWrapper.eq(PjProductLaunch::getTenantId, AuthUtil.getTenantId())
+				.eq(PjProductLaunch::getIsDeleted, 0)
+				.isNull(PjProductLaunch::getSourceId)
+				.eq(PjProductLaunch::getSalesCompanyId, ship.getSalesCompanyId())
+				.in(PjProductLaunch::getGoodsId, goodIds);
+			List<PjProductLaunch> productLaunch = productLaunchService.list(productLaunchQueryWrapper);
+			for (PjShipItems item : ship.getShipItemsList()) {
+				//获得商品
+				PjGoodsDesc goodsDesc = pjGoodsDescList.stream().filter(e -> e.getId().equals(item.getGoodsId())).findFirst().orElse(null);
+				if (ObjectUtil.isEmpty(goodsDesc)) {
+					throw new RuntimeException("商品数据异常");
+				}
+				PjProductLaunch pjProductLaunches = productLaunch.stream()
+					.filter(i -> i.getGoodsId().equals(goodsDesc.getId())).findFirst().orElse(null);
+				//修改上架数量
+				if (pjProductLaunches != null) {
+					if (ObjectUtils.isNotNull(pjProductLaunches.getInventory())) {
+						pjProductLaunches.setInventory(pjProductLaunches.getInventory().add(item.getSendNumHave()));
+					} else {
+						pjProductLaunches.setInventory(item.getSendNumHave());
+					}
+					pjProductLaunchList.add(pjProductLaunches);
+				}
+			}
+			R res = productLaunchService.updateBatchById(pjProductLaunchList);
+			if (!res.isSuccess()) {
+				throw new RuntimeException(res.getMsg());
+			}
+			ship.setShipItemsList(ship.getShipItemsList());
+			ship.setNumberRows(ship.getShipItemsList().size());
+		}
+		ship.setStatusName(OrderTypeEnum.PRODUCTION_COMPLETED.getType());
+		baseMapper.updateById(ship);
+		return R.data(ship);
 	}
 
 	@Override
 	public R revokeCompleted(PjShip ship) {
-		return null;
+		PjShip shipVersion = baseMapper.selectById(ship.getId());
+		if (shipVersion != null && !shipVersion.getVersion().equals(ship.getVersion())) {
+			throw new RuntimeException("数据已被修改,请返回列表重新操作!");
+		}
+		// 保存订单明细
+		List<PjShipItems> shipItemsList = new ArrayList<>();
+		if (CollectionUtils.isNotEmpty(ship.getShipItemsList())) {
+			List<Long> goodIds = ship.getShipItemsList().stream().map(PjShipItems::getGoodsId).distinct().collect(Collectors.toList());
+			List<PjGoodsDesc> pjGoodsDescList = goodsDescMapper.selectList(new LambdaQueryWrapper<PjGoodsDesc>()
+				.eq(PjGoodsDesc::getTenantId, AuthUtil.getTenantId())
+				.eq(PjGoodsDesc::getIsDeleted, 0)
+				.in(PjGoodsDesc::getId, goodIds));
+			//修改库存账
+			LambdaQueryWrapper<PjStockDesc> stockLambdaQueryWrapper = new LambdaQueryWrapper<>();
+			stockLambdaQueryWrapper
+				.eq(PjStockDesc::getTenantId, AuthUtil.getTenantId())
+				.eq(PjStockDesc::getIsDeleted, 0)
+				.eq(PjStockDesc::getSalesCompanyId, ship.getSalesCompanyId())
+				.in(PjStockDesc::getGoodsId, goodIds);
+			List<PjStockDesc> pjStockDescList = iStockDescService.list(stockLambdaQueryWrapper);
+			List<PjStockDesc> pjStockDescArrayList = new ArrayList<>();
+			List<PjStockDesc> pjStockDescArrayDelete = new ArrayList<>();
+			List<PjOrderItems> orderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>()
+				.eq(PjOrderItems::getTenantId, AuthUtil.getTenantId())
+				.eq(PjOrderItems::getIsDeleted, 0)
+				.eq(PjOrderItems::getBsType, "PD")
+				.ne(PjOrderItems::getStatus, "已确认")
+				.in(PjOrderItems::getGoodsId, goodIds)
+			);
+			StringBuilder msg1 = new StringBuilder();
+			for (PjShipItems item : ship.getShipItemsList()) {
+				item.setSendNumHave(item.getSendNum());
+				item.setSendNum(new BigDecimal("0"));
+				//获得商品
+				PjGoodsDesc goodsDesc = pjGoodsDescList.stream().filter(e -> e.getId().equals(item.getGoodsId())).findFirst().orElse(null);
+				if (ObjectUtil.isEmpty(goodsDesc)) {
+					throw new RuntimeException("商品数据异常");
+				}
+				List<PjOrderItems> pjOrderItemsList1 = orderItemsList.stream().filter(e -> e.getGoodsId().equals(item.getGoodsId())).collect(Collectors.toList());
+				if (!pjOrderItemsList1.isEmpty()) {
+					msg1.append(item.getGoodsName()).append(",");
+				}
+				//管理批次号
+				PjStockDesc stockOne;
+				if (ObjectUtil.isNotEmpty(goodsDesc.getWhether()) && "1".equals(goodsDesc.getWhether())) {
+					stockOne = pjStockDescList.stream()
+						.filter(e -> e.getGoodsId().equals(item.getGoodsId())
+							&& e.getStorageId().equals(ship.getStorageId())
+							&& e.getDot().equals(item.getDot())).findFirst().orElse(null);
+				} else {
+					stockOne = pjStockDescList.stream()
+						.filter(e -> e.getGoodsId().equals(item.getGoodsId())
+							&& e.getStorageId().equals(ship.getStorageId())
+							&& ObjectUtils.isNull(e.getDot())).findFirst().orElse(null);
+				}
+				if (stockOne != null) {
+					if (stockOne.getBalanceQuantity().compareTo(item.getSendNum()) < 0) {
+						throw new RuntimeException(goodsDesc.getCname() + "库存不足,禁止撤销");
+					}
+					stockOne.setUpdateTime(new Date());
+					stockOne.setUpdateUser(AuthUtil.getUserId());
+					stockOne.setBalanceQuantity(stockOne.getBalanceQuantity().subtract(item.getSendNum()));
+					if (stockOne.getBalanceQuantityHave().compareTo(item.getSendNum()) < 0) {
+						throw new RuntimeException("库存不足");
+					}
+					stockOne.setBalanceQuantityHave(stockOne.getBalanceQuantityHave().subtract(item.getSendNum()));
+					stockOne.setStoreInventory(stockOne.getBalanceQuantity());
+					BigDecimal inventoryAmount = item.getSendNum().multiply(item.getPrice());
+					stockOne.setInventoryAmount(stockOne.getInventoryAmount().subtract(inventoryAmount));
+					if (new BigDecimal("0.00").compareTo(stockOne.getInventoryAmount()) == 0 || new BigDecimal("0.00").compareTo(stockOne.getBalanceQuantity()) == 0) {
+						stockOne.setInventoryCostPrice(new BigDecimal("0.00"));
+					} else {
+						stockOne.setInventoryCostPrice(stockOne.getInventoryAmount().divide(stockOne.getBalanceQuantity(), MathContext.DECIMAL32).setScale(2, RoundingMode.HALF_UP));
+					}
+					stockOne.setVersion(stockOne.getVersion());
+					if (new BigDecimal("0.00").compareTo(stockOne.getBalanceQuantity()) == 0
+						&& new BigDecimal("0.00").compareTo(stockOne.getBalanceQuantityHave()) == 0
+						&& 1 == stockOne.getVersion()) {
+						pjStockDescArrayDelete.add(stockOne);
+					} else {
+						pjStockDescArrayList.add(stockOne);
+					}
+				} else {
+					throw new RuntimeException("未查到库存数据");
+				}
+				shipItemsList.add(item);
+			}
+			if (msg1.length() > 0) {
+				throw new RuntimeException("商品:" + msg1 + "正在盘点中,操作失败");
+			}
+			shipItemsService.saveOrUpdateBatch(shipItemsList);
+			if (!pjStockDescArrayList.isEmpty()) {
+				iStockDescService.updateBatchByIdNew(pjStockDescArrayList);
+			}
+			if (!pjStockDescArrayDelete.isEmpty()) {
+				iStockDescService.removeByIds(pjStockDescArrayDelete.stream().map(PjStockDesc::getId).collect(Collectors.toList()));
+			}
+			List<PjProductLaunch> pjProductLaunchList = new ArrayList<>();
+			//查询所有上架商品
+			LambdaQueryWrapper<PjProductLaunch> productLaunchQueryWrapper = new LambdaQueryWrapper<>();
+			productLaunchQueryWrapper.eq(PjProductLaunch::getTenantId, AuthUtil.getTenantId())
+				.eq(PjProductLaunch::getIsDeleted, 0)
+				.isNull(PjProductLaunch::getSourceId)
+				.eq(PjProductLaunch::getSalesCompanyId, ship.getSalesCompanyId())
+				.in(PjProductLaunch::getGoodsId, goodIds);
+			List<PjProductLaunch> productLaunch = productLaunchService.list(productLaunchQueryWrapper);
+			for (PjShipItems item : ship.getShipItemsList()) {
+				PjProductLaunch pjProductLaunches = productLaunch.stream()
+					.filter(i -> i.getGoodsId().equals(item.getGoodsId())).findFirst().orElse(null);
+				//修改上架数量
+				if (pjProductLaunches != null) {
+					pjProductLaunches.setInventory(pjProductLaunches.getInventory().subtract(item.getSendNumHave()));
+					pjProductLaunchList.add(pjProductLaunches);
+				}
+			}
+			R res = productLaunchService.updateBatchById(pjProductLaunchList);
+			if (!res.isSuccess()) {
+				throw new RuntimeException(res.getMsg());
+			}
+			ship.setShipItemsList(ship.getShipItemsList());
+			ship.setNumberRows(ship.getShipItemsList().size());
+		}
+		ship.setStatusName(OrderTypeEnum.PRODUCTION_IN.getType());
+		baseMapper.updateById(ship);
+		return R.data(ship);
+	}
+
+	@Override
+	public R confirmPicking(PjShip ship) {
+		ship.setStatusName(OrderTypeEnum.STOP_PICKING.getType());
+		if (ObjectUtils.isNull(ship.getStorageId())) {
+			throw new RuntimeException("请先选择仓库");
+		}
+		ship.setGoodsTotalNum(ship.getShipItemsList().stream().map(PjShipItems::getGoodsNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+		if (ship.getId() == null) {
+			// 获取系统编号
+			String billNo = serialService.getBillNo(OrderTypeEnum.FHGD.getType(), OrderTypeEnum.FHGD.getType(), OrderTypeEnum.FHGD.getType());
+			if (ObjectUtils.isNull(billNo)) {
+				TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+				return R.fail(500, "生成系统编号失败");
+			}
+			ship.setBillno(billNo);
+			ship.setCreateTime(new Date());
+			ship.setCreateUser(AuthUtil.getUserId());
+			ship.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+			ship.setTenantId(AuthUtil.getTenantId());
+			baseMapper.insert(ship);
+		} else {
+			ship.setVersion(ship.getVersion() + 1);
+			ship.setUpdateUser(AuthUtil.getUserId());
+			ship.setUpdateTime(new Date());
+			ship.setStorageName(storageDescMapper.selectById(ship.getStorageId()).getCname());
+			baseMapper.updateById(ship);
+		}
+		// 保存订单明细
+		List<PjShipItems> shipItemsList = new ArrayList<>();
+		List<PjStockDesc> pjStockDescArrayList = new ArrayList<>();
+		if (CollectionUtils.isNotEmpty(ship.getShipItemsList())) {
+			List<Long> goodIds = ship.getShipItemsList().stream().map(PjShipItems::getGoodsId).distinct().collect(Collectors.toList());
+			List<PjGoodsDesc> pjGoodsDescList = goodsDescMapper.selectList(new LambdaQueryWrapper<PjGoodsDesc>()
+				.eq(PjGoodsDesc::getTenantId, AuthUtil.getTenantId())
+				.eq(PjGoodsDesc::getIsDeleted, 0)
+				.in(PjGoodsDesc::getId, goodIds));
+			//修改库存账
+			LambdaQueryWrapper<PjStockDesc> stockLambdaQueryWrapper = new LambdaQueryWrapper<>();
+			stockLambdaQueryWrapper
+				.eq(PjStockDesc::getTenantId, AuthUtil.getTenantId())
+				.eq(PjStockDesc::getIsDeleted, 0)
+				.eq(PjStockDesc::getStorageId, ship.getStorageId())
+				.eq(PjStockDesc::getSalesCompanyId, ship.getSalesCompanyId())
+				.in(PjStockDesc::getGoodsId, goodIds);
+			List<PjStockDesc> pjStockDescList = iStockDescService.list(stockLambdaQueryWrapper);
+			String msg = "";
+			List<PjOrderItems> orderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>()
+				.eq(PjOrderItems::getTenantId, AuthUtil.getTenantId())
+				.eq(PjOrderItems::getIsDeleted, 0)
+				.eq(PjOrderItems::getBsType, "PD")
+				.ne(PjOrderItems::getStatus, "已确认")
+				.in(PjOrderItems::getGoodsId, goodIds)
+			);
+			StringBuilder msg1 = new StringBuilder();
+			for (PjShipItems item : ship.getShipItemsList()) {
+				item.setSendNum(item.getGoodsNum());
+				if (item.getId() == null) {
+					item.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+					item.setCreateTime(new Date());
+					item.setCreateUser(AuthUtil.getUserId());
+					item.setPid(ship.getId());
+					item.setTenantId(AuthUtil.getTenantId());
+				} else {
+					item.setUpdateTime(new Date());
+					item.setUpdateUser(AuthUtil.getUserId());
+					item.setPid(ship.getId());
+				}
+				//获得商品
+				List<PjOrderItems> pjOrderItemsList1 = orderItemsList.stream().filter(e -> e.getGoodsId().equals(item.getGoodsId())).collect(Collectors.toList());
+				if (!pjOrderItemsList1.isEmpty()) {
+					msg1.append(item.getGoodsName()).append(",");
+				}
+				PjGoodsDesc goodsDesc = pjGoodsDescList.stream().filter(e -> e.getId().equals(item.getGoodsId())).findFirst().orElse(null);
+				if (ObjectUtil.isEmpty(goodsDesc)) {
+					throw new RuntimeException("商品数据异常");
+				}
+				if ("1".equals(goodsDesc.getWhether()) && ObjectUtils.isNull(item.getDot())) {
+					throw new RuntimeException("商品:" + goodsDesc.getCname() + ",请选择批次号");
+				}
+				//管理批次号
+				PjStockDesc stockOne = null;
+				if (ObjectUtil.isNotEmpty(goodsDesc.getWhether()) && "1".equals(goodsDesc.getWhether())) {
+					stockOne = pjStockDescList.stream()
+						.filter(e -> e.getGoodsId().equals(item.getGoodsId())
+							&& e.getDot().equals(item.getDot())).findFirst().orElse(null);
+				} else {
+					stockOne = pjStockDescList.stream()
+						.filter(e -> e.getGoodsId().equals(item.getGoodsId())
+							&& ObjectUtils.isNull(e.getDot())).findFirst().orElse(null);
+				}
+				if (stockOne != null) {
+					if (stockOne.getBalanceQuantity().compareTo(item.getSendNum()) < 0) {
+						msg += goodsDesc.getCname() + ",";
+					} else {
+						stockOne.setBalanceQuantity(stockOne.getBalanceQuantity().subtract(item.getSendNum()));
+						if (stockOne.getBalanceQuantityHave().compareTo(item.getSendNum()) < 0) {
+							throw new RuntimeException("商品:" + goodsDesc.getCname() + "库存不足,出库失败");
+						}
+						stockOne.setBalanceQuantityHave(stockOne.getBalanceQuantityHave().subtract(item.getSendNum()));
+						item.setSendNumHave(item.getSendNum());
+					}
+					stockOne.setStoreInventory(stockOne.getBalanceQuantity());
+					BigDecimal inventoryAmount = item.getSendNum().multiply(stockOne.getInventoryCostPrice());
+					stockOne.setInventoryAmount(stockOne.getInventoryAmount().subtract(inventoryAmount));
+					stockOne.setVersion(stockOne.getVersion());
+					pjStockDescArrayList.add(stockOne);
+					item.setCostprie(item.getSendNum().multiply(stockOne.getInventoryCostPrice()));
+					item.setCostpriePrice(stockOne.getInventoryCostPrice());
+					item.setProfit(item.getSubTotalMoney().subtract(item.getCostprie()));
+				} else {
+					throw new RuntimeException("商品:" + goodsDesc.getCname() + "未查到库存账");
+				}
+				shipItemsList.add(item);
+			}
+			if (!msg.isEmpty()) {
+				throw new RuntimeException("商品:" + msg + "库存不足,出库失败");
+			}
+			if (msg1.length() > 0) {
+				throw new RuntimeException("商品:" + msg1 + "正在盘点中,操作失败");
+			}
+			R res = iStockDescService.updateBatchByIdNew(pjStockDescArrayList);
+			if (!res.isSuccess()) {
+				throw new RuntimeException(res.getMsg());
+			}
+			List<PjProductLaunch> pjProductLaunchList = new ArrayList<>();
+			//查询所有上架商品
+			LambdaQueryWrapper<PjProductLaunch> productLaunchQueryWrapper = new LambdaQueryWrapper<>();
+			productLaunchQueryWrapper.eq(PjProductLaunch::getTenantId, AuthUtil.getTenantId())
+				.eq(PjProductLaunch::getIsDeleted, 0)
+				.isNull(PjProductLaunch::getSourceId)
+				.eq(PjProductLaunch::getSalesCompanyId, ship.getSalesCompanyId())
+				.in(PjProductLaunch::getGoodsId, goodIds);
+			List<PjProductLaunch> productLaunch = productLaunchService.list(productLaunchQueryWrapper);
+			for (PjShipItems item : ship.getShipItemsList()) {
+				PjProductLaunch pjProductLaunches = productLaunch.stream()
+					.filter(i -> i.getGoodsId().equals(item.getGoodsId())).findFirst().orElse(null);
+				//修改上架数量
+				if (pjProductLaunches != null) {
+					pjProductLaunches.setInventory(pjProductLaunches.getInventory().subtract(item.getSendNumHave()));
+					pjProductLaunchList.add(pjProductLaunches);
+				}
+			}
+			R res1 = productLaunchService.updateBatchById(pjProductLaunchList);
+			if (!res1.isSuccess()) {
+				throw new RuntimeException(res.getMsg());
+			}
+			ship.setShipItemsList(ship.getShipItemsList());
+			ship.setNumberRows(ship.getShipItemsList().size());
+			ship.setSendTotalNum(ship.getShipItemsList().stream().map(PjShipItems::getSendNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+		} else {
+			throw new RuntimeException("出库明细不能为空");
+		}
+		shipItemsService.saveOrUpdateBatch(shipItemsList);
+		return R.data(ship);
+	}
+
+	@Override
+	public R revokePicking(PjShip ship) {
+		ship.setStatusName(OrderTypeEnum.STAY_PICKING.getType());
+		ship.setUpdateUser(AuthUtil.getUserId());
+		ship.setUpdateTime(new Date());
+		PjShip shipVersion = baseMapper.selectById(ship.getId());
+		if (shipVersion != null && !shipVersion.getVersion().equals(ship.getVersion())) {
+			throw new RuntimeException("数据已被修改,请返回列表重新操作!");
+		}
+		baseMapper.updateById(ship);
+		// 保存订单明细
+		List<PjShipItems> itemsList = new ArrayList<>();
+		List<PjStockDesc> pjStockDescArrayList = new ArrayList<>();
+		if (CollectionUtils.isNotEmpty(ship.getShipItemsList())) {
+			List<Long> goodIds = ship.getShipItemsList().stream().map(PjShipItems::getGoodsId).distinct().collect(Collectors.toList());
+			List<PjGoodsDesc> pjGoodsDescList = goodsDescMapper.selectList(new LambdaQueryWrapper<PjGoodsDesc>()
+				.eq(PjGoodsDesc::getTenantId, AuthUtil.getTenantId())
+				.eq(PjGoodsDesc::getIsDeleted, 0)
+				.in(PjGoodsDesc::getId, goodIds));
+			//修改库存账
+			LambdaQueryWrapper<PjStockDesc> stockLambdaQueryWrapper = new LambdaQueryWrapper<>();
+			stockLambdaQueryWrapper
+				.eq(PjStockDesc::getTenantId, AuthUtil.getTenantId())
+				.eq(PjStockDesc::getIsDeleted, 0)
+				.eq(PjStockDesc::getStorageId, ship.getStorageId())
+				.eq(PjStockDesc::getSalesCompanyId, ship.getSalesCompanyId())
+				.in(PjStockDesc::getGoodsId, goodIds);
+			List<PjStockDesc> pjStockDescList = iStockDescService.list(stockLambdaQueryWrapper);
+			List<PjOrderItems> orderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>()
+				.eq(PjOrderItems::getTenantId, AuthUtil.getTenantId())
+				.eq(PjOrderItems::getIsDeleted, 0)
+				.eq(PjOrderItems::getBsType, "PD")
+				.ne(PjOrderItems::getStatus, "已确认")
+				.in(PjOrderItems::getGoodsId, goodIds)
+			);
+			StringBuilder msg1 = new StringBuilder();
+			for (PjShipItems item : ship.getShipItemsList()) {
+				item.setSendNumHave(item.getSendNum());
+				item.setSendNum(new BigDecimal("0"));
+				//获得商品
+				PjGoodsDesc goodsDesc = pjGoodsDescList.stream().filter(e -> e.getId().equals(item.getGoodsId())).findFirst().orElse(null);
+				if (ObjectUtil.isEmpty(goodsDesc)) {
+					throw new RuntimeException("商品数据异常");
+				}
+				List<PjOrderItems> pjOrderItemsList1 = orderItemsList.stream().filter(e -> e.getGoodsId().equals(item.getGoodsId())).collect(Collectors.toList());
+				if (!pjOrderItemsList1.isEmpty()) {
+					msg1.append(item.getGoodsName()).append(",");
+				}
+				//管理批次号
+				PjStockDesc stockOne;
+				if (ObjectUtil.isNotEmpty(goodsDesc.getWhether()) && "1".equals(goodsDesc.getWhether())) {
+					stockOne = pjStockDescList.stream()
+						.filter(e -> e.getGoodsId().equals(item.getGoodsId())
+							&& e.getDot().equals(item.getDot())).findFirst().orElse(null);
+				} else {
+					stockOne = pjStockDescList.stream()
+						.filter(e -> e.getGoodsId().equals(item.getGoodsId())
+							&& ObjectUtils.isNull(e.getDot())).findFirst().orElse(null);
+				}
+				if (stockOne != null) {
+					stockOne.setBalanceQuantity(stockOne.getBalanceQuantity().add(item.getSendNum()));
+					stockOne.setBalanceQuantityHave(stockOne.getBalanceQuantityHave().add(item.getSendNumHave()));
+					stockOne.setStoreInventory(stockOne.getBalanceQuantity());
+					BigDecimal inventoryAmount = item.getSendNum().multiply(stockOne.getInventoryCostPrice());
+					stockOne.setInventoryAmount(stockOne.getInventoryAmount().add(inventoryAmount));
+					stockOne.setVersion(stockOne.getVersion());
+					pjStockDescArrayList.add(stockOne);
+				} else {
+					throw new RuntimeException("未查到库存账");
+				}
+				itemsList.add(item);
+			}
+			if (msg1.length() > 0) {
+				throw new RuntimeException("商品:" + msg1 + "正在盘点中,操作失败");
+			}
+			R res = iStockDescService.updateBatchByIdNew(pjStockDescArrayList);
+			if (!res.isSuccess()) {
+				throw new RuntimeException(res.getMsg());
+			}
+			shipItemsService.updateBatchById(itemsList);
+			//查询所有上架商品
+			LambdaQueryWrapper<PjProductLaunch> productLaunchQueryWrapper = new LambdaQueryWrapper<>();
+			productLaunchQueryWrapper.eq(PjProductLaunch::getTenantId, AuthUtil.getTenantId())
+				.eq(PjProductLaunch::getIsDeleted, 0)
+				.isNull(PjProductLaunch::getSourceId)
+				.eq(PjProductLaunch::getSalesCompanyId, ship.getSalesCompanyId())
+				.in(PjProductLaunch::getGoodsId, goodIds);
+			List<PjProductLaunch> productLaunch = productLaunchService.list(productLaunchQueryWrapper);
+			List<PjProductLaunch> pjProductLaunchList = new ArrayList<>();
+			for (PjShipItems item : ship.getShipItemsList()) {
+				//获得商品
+				PjGoodsDesc goodsDesc = pjGoodsDescList.stream().filter(e -> e.getId().equals(item.getGoodsId())).findFirst().orElse(null);
+				if (ObjectUtil.isEmpty(goodsDesc)) {
+					throw new RuntimeException("商品数据异常");
+				}
+				PjProductLaunch pjProductLaunches = productLaunch.stream()
+					.filter(i -> i.getGoodsId().equals(goodsDesc.getId())).findFirst().orElse(null);
+				//修改上架数量
+				if (pjProductLaunches != null) {
+					if (ObjectUtils.isNotNull(pjProductLaunches.getInventory())) {
+						pjProductLaunches.setInventory(pjProductLaunches.getInventory().add(item.getSendNumHave()));
+					} else {
+						pjProductLaunches.setInventory(item.getSendNumHave());
+					}
+					pjProductLaunchList.add(pjProductLaunches);
+				}
+			}
+			R res1 = productLaunchService.updateBatchById(pjProductLaunchList);
+			if (!res1.isSuccess()) {
+				throw new RuntimeException(res1.getMsg());
+			}
+			ship.setShipItemsList(ship.getShipItemsList());
+			ship.setNumberRows(ship.getShipItemsList().size());
+		} else {
+			throw new RuntimeException("出库明细不能为空");
+		}
+		return R.data(ship);
+	}
+
+	@Override
+	public R generatePicking(PjShip ship) {
+		PjShip picking = new PjShip();
+		PjShip detail = baseMapper.selectById(ship.getId());
+		BeanUtil.copyProperties(detail, picking);
+		//明细
+		LambdaQueryWrapper<PjShipItems> itemsLambdaQueryWrapper = new LambdaQueryWrapper<>();
+		itemsLambdaQueryWrapper.eq(PjShipItems::getTenantId, AuthUtil.getTenantId())
+			.eq(PjShipItems::getIsDeleted, 0)
+			.eq(PjShipItems::getPid, detail.getId());
+		List<PjShipItems> shipItemsList = shipItemsService.list(itemsLambdaQueryWrapper);
+		picking.setSalesCompanyId(detail.getSalesCompanyId());
+		picking.setSalesCompanyName(detail.getSalesCompanyName());
+		// 获取系统编号
+		String billNo = serialService.getBillNo(OrderTypeEnum.SCLL.getType(), OrderTypeEnum.SCLL.getType(), OrderTypeEnum.SCLL.getType());
+		if (ObjectUtils.isNull(billNo)) {
+			TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+			return R.fail(500, "生成系统编号失败");
+		}
+		picking.setStatusName(OrderTypeEnum.STAY_PICKING.getType());
+		picking.setId(null);
+		picking.setBillno(billNo);
+		picking.setBizTypeName(OrderTypeEnum.SCLL.getType());
+		picking.setSrcOrdNo(detail.getOrdNo());
+		picking.setCreateTime(new Date());
+		picking.setCreateUser(AuthUtil.getUserId());
+		picking.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+		picking.setTenantId(AuthUtil.getTenantId());
+		picking.setUpdateTime(null);
+		picking.setUpdateUser(null);
+		baseMapper.insert(picking);
+		// 保存订单明细
+		List<PjShipItems> shipItemsListNew = new ArrayList<>();
+		if (CollectionUtils.isNotEmpty(shipItemsList)) {
+			shipItemsList.forEach(item -> {
+				item.setId(null);
+				item.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+				item.setCreateTime(new Date());
+				item.setCreateUser(AuthUtil.getUserId());
+				item.setPid(picking.getId());
+				item.setTenantId(AuthUtil.getTenantId());
+				item.setUpdateTime(null);
+				item.setUpdateUser(null);
+				shipItemsListNew.add(item);
+			});
+			shipItemsService.saveOrUpdateBatch(shipItemsListNew);
+		}
+		picking.setShipItemsList(shipItemsListNew);
+		return R.data(picking);
 	}
 
 }

+ 16 - 32
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/statistics/service/impl/StatisticsServiceImpl.java

@@ -588,10 +588,7 @@ public class StatisticsServiceImpl implements IStatisticsService {
 				List<SaleDetailDto> saleDetailDtoList1 = saleDetailDtoIPage.getRecords().stream()
 					.filter(e -> e.getOrdNo().equals(item.getOrdNo())).collect(Collectors.toList());
 				if (!saleDetailDtoList1.isEmpty()) {
-					BigDecimal returnsAmount = pjOrderItemsList.stream().filter(e -> e.getPid().equals(item.getId())
-							&& !"线下退款".equals(e.getRefundType())).map(PjOrderItems::getReturnsAmount)
-						.reduce(BigDecimal.ZERO, BigDecimal::add);
-					BigDecimal amount = item.getPaymentAmountTl().subtract(returnsAmount);
+					BigDecimal amount = item.getPaymentAmountTl();
 					amount = amount.abs();
 					for (SaleDetailDto items : saleDetailDtoList1) {
 						items.setRemarks(item.getRemarks());
@@ -620,20 +617,8 @@ public class StatisticsServiceImpl implements IStatisticsService {
 						}
 						if ("已取消".equals(items.getStatus())) {
 							items.setBalanceAmount(new BigDecimal("0.00"));
-//							items.setGoodsNum(new BigDecimal("0.00"));
-//							items.setProfit(new BigDecimal("0.00"));
-//							items.setSubTotalMoney(new BigDecimal("0.00"));
-//							items.setFreight(new BigDecimal("0.00"));
-//							items.setCostprie(new BigDecimal("0.00"));
 						} else {
 							if ("TKXS".equals(item.getBsType()) || "TKCG".equals(item.getBsType())) {
-								if (amount.compareTo(items.getSubTotalMoney().abs()) >= 0) {
-									items.setBalanceAmount(new BigDecimal("0.00"));
-									amount = amount.subtract(items.getSubTotalMoney().abs());
-								} else {
-									items.setBalanceAmount(new BigDecimal("0.00").subtract(items.getSubTotalMoney().abs().subtract(amount)));
-									amount = new BigDecimal("0.00");
-								}
 								items.setGoodsNum(new BigDecimal("0.00").subtract(items.getReturnsNumber()));
 								items.setSubTotalMoney(new BigDecimal("0.00").subtract(items.getReturnsAmount()).subtract(item.getFreight()));
 								items.setFreight(new BigDecimal("0.00").subtract(items.getFreight()));
@@ -641,6 +626,13 @@ public class StatisticsServiceImpl implements IStatisticsService {
 								BigDecimal profit = items.getSubTotalMoney().abs().subtract(costprie);
 								items.setProfit(new BigDecimal("0.00").subtract(profit));
 								items.setCostprie(new BigDecimal("0.00").subtract(costprie));
+								if (amount.compareTo(items.getSubTotalMoney().abs()) >= 0) {
+									items.setBalanceAmount(new BigDecimal("0.00"));
+									amount = amount.subtract(items.getSubTotalMoney().abs());
+								} else {
+									items.setBalanceAmount(new BigDecimal("0.00").subtract(items.getSubTotalMoney().abs().subtract(amount)));
+									amount = new BigDecimal("0.00");
+								}
 							} else {
 								if (amount.compareTo(items.getSubTotalMoney()) >= 0) {
 									items.setBalanceAmount(new BigDecimal("0.00"));
@@ -1058,10 +1050,7 @@ public class StatisticsServiceImpl implements IStatisticsService {
 				List<SaleDetailDto> saleDetailDtoList1 = saleDetailDtoIPage.stream()
 					.filter(e -> e.getOrdNo().equals(item.getOrdNo())).collect(Collectors.toList());
 				if (!saleDetailDtoList1.isEmpty()) {
-					BigDecimal returnsAmount = pjOrderItemsList.stream().filter(e -> e.getPid().equals(item.getId())
-							&& !"线下退款".equals(e.getRefundType())).map(PjOrderItems::getReturnsAmount)
-						.reduce(BigDecimal.ZERO, BigDecimal::add);
-					BigDecimal amount = item.getPaymentAmountTl().subtract(returnsAmount);
+					BigDecimal amount = item.getPaymentAmountTl();
 					amount = amount.abs();
 					for (SaleDetailDto items : saleDetailDtoList1) {
 						items.setRemarks(item.getRemarks());
@@ -1090,20 +1079,8 @@ public class StatisticsServiceImpl implements IStatisticsService {
 						}
 						if ("已取消".equals(items.getStatus())) {
 							items.setBalanceAmount(new BigDecimal("0.00"));
-//							items.setGoodsNum(new BigDecimal("0.00"));
-//							items.setProfit(new BigDecimal("0.00"));
-//							items.setSubTotalMoney(new BigDecimal("0.00"));
-//							items.setFreight(new BigDecimal("0.00"));
-//							items.setCostprie(new BigDecimal("0.00"));
 						} else {
 							if ("TKXS".equals(item.getBsType()) || "TKCG".equals(item.getBsType())) {
-								if (amount.compareTo(items.getSubTotalMoney().abs()) >= 0) {
-									items.setBalanceAmount(new BigDecimal("0.00"));
-									amount = amount.subtract(items.getSubTotalMoney().abs());
-								} else {
-									items.setBalanceAmount(new BigDecimal("0.00").subtract(items.getSubTotalMoney().abs().subtract(amount)));
-									amount = new BigDecimal("0.00");
-								}
 								items.setGoodsNum(new BigDecimal("0.00").subtract(items.getReturnsNumber()));
 								items.setSubTotalMoney(new BigDecimal("0.00").subtract(items.getReturnsAmount()).subtract(item.getFreight()));
 								items.setFreight(new BigDecimal("0.00").subtract(items.getFreight()));
@@ -1111,6 +1088,13 @@ public class StatisticsServiceImpl implements IStatisticsService {
 								BigDecimal profit = items.getSubTotalMoney().abs().subtract(costprie);
 								items.setProfit(new BigDecimal("0.00").subtract(profit));
 								items.setCostprie(new BigDecimal("0.00").subtract(costprie));
+								if (amount.compareTo(items.getSubTotalMoney().abs()) >= 0) {
+									items.setBalanceAmount(new BigDecimal("0.00"));
+									amount = amount.subtract(items.getSubTotalMoney().abs());
+								} else {
+									items.setBalanceAmount(new BigDecimal("0.00").subtract(items.getSubTotalMoney().abs().subtract(amount)));
+									amount = new BigDecimal("0.00");
+								}
 							} else {
 								if (amount.compareTo(items.getSubTotalMoney()) >= 0) {
 									items.setBalanceAmount(new BigDecimal("0.00"));