Explorar o código

1.轮胎-敏轮销售订单分库区(未联调)
2.调拨销售(未联调)

纪新园 hai 1 día
pai
achega
d0d8fc5da1

+ 35 - 0
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/entity/PjOrder.java

@@ -126,6 +126,7 @@ public class PjOrder implements Serializable {
 	 * TKXS 退款销售
 	 * TKCG 退款采购
 	 * JF 积分订单
+	 * DBXS 调拨销售
 	 */
 	@ApiModelProperty(value = "业务类型")
 	private String bsType;
@@ -560,6 +561,40 @@ public class PjOrder implements Serializable {
 	private BigDecimal rebateAmount;
 
 	/**
+	 * 调入仓库id
+	 */
+	@ApiModelProperty(value = "调入仓库id")
+	private Long callInStorageId;
+	/**
+	 * 调入仓库名称
+	 */
+	@ApiModelProperty(value = "调入仓库名称")
+	private String callInStorageName;
+
+	/**
+	 * 调拨销售id
+	 */
+	@ApiModelProperty(value = "调拨销售id")
+	private Long transferSalesId;
+	/**
+	 * 调拨销售单号
+	 */
+	@ApiModelProperty(value = "调拨销售单号")
+	private String transferSalesNo;
+
+	/**
+	 * 销售状态
+	 */
+	@ApiModelProperty(value = "销售状态")
+	private String xsStatus;
+
+	/**
+	 * 采购状态
+	 */
+	@ApiModelProperty(value = "采购状态")
+	private String cgStatus;
+
+	/**
 	 * 红包金额
 	 */
 	private BigDecimal redPacketAmount;

+ 11 - 0
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/entity/PjOrderItems.java

@@ -374,6 +374,17 @@ public class PjOrderItems implements Serializable {
 	private String whether;
 
 	/**
+	 * 库区id
+	 */
+	@ApiModelProperty(value = "库区id")
+	private Long reservoirAreaId;
+	/**
+	 * 库区名称
+	 */
+	@ApiModelProperty(value = "库区名称")
+	private String reservoirAreaName;
+
+	/**
 	 * 附件
 	 */
 	@TableField(exist = false)

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

@@ -131,6 +131,10 @@ public enum OrderTypeEnum {
 	 * 内部销售
 	 */
 	WEB("内部销售"),
+	/**
+	 * 调拨销售
+	 */
+	DBXS("调拨销售"),
 
 	/**
 	 * 出库工单状态已出库

+ 216 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/controller/TransferSalesController.java

@@ -0,0 +1,216 @@
+/*
+ *      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.order.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 com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.common.annotation.RepeatSubmit;
+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.BladeUser;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.salesPart.annotation.VersionControl;
+import org.springblade.salesPart.entity.PjOrder;
+import org.springblade.salesPart.entity.PjOrderItems;
+import org.springblade.salesPart.entity.PjShip;
+import org.springblade.salesPart.order.service.IOrderItemsService;
+import org.springblade.salesPart.order.service.IOrderService;
+import org.springblade.salesPart.order.service.ITransferSalesService;
+import org.springblade.salesPart.util.ParameterUtils;
+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 2023-04-21
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/transferSales")
+@Api(value = "调拨销售表", tags = "调拨销售表接口")
+public class TransferSalesController extends BladeController {
+
+	private final IOrderService orderService;
+	private final ITransferSalesService transferSalesService;
+	private final IUserClient userClient;
+	private final IOrderItemsService orderItemsService;
+
+	/**
+	 * 详情
+	 */
+	@GetMapping("/detail")
+	public R<PjOrder> detail(PjOrder order) {
+		if (order.getId() == null) {
+			throw new RuntimeException("缺少必要参数");
+		}
+		PjOrder detail = orderService.getById(order.getId());
+		if (detail != null) {
+			List<PjOrderItems> orderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>()
+				.eq(PjOrderItems::getIsDeleted, 0)
+				.eq(PjOrderItems::getTenantId, AuthUtil.getTenantId())
+				.eq(PjOrderItems::getPid, order.getId()));
+			detail.setOrderItemsList(orderItemsList.isEmpty() ? new ArrayList<>() : orderItemsList);
+		}
+		return R.data(detail);
+	}
+
+	/**
+	 * 分页列表
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入order")
+	public R<IPage<PjOrder>> list(PjOrder order, Query query) {
+		BladeUser selectedUser = AuthUtil.getUser();
+		LambdaQueryWrapper<PjOrder> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(PjOrder::getTenantId, selectedUser.getTenantId())
+			.eq(PjOrder::getIsDeleted, 0)
+			.eq(PjOrder::getBsType, "DBXS")
+			.eq(PjOrder::getSalesCompanyId, selectedUser.getDeptId())//公司
+			.eq(ObjectUtils.isNotEmpty(order.getBillType()), PjOrder::getBillType, order.getBillType())
+			.eq(ObjectUtils.isNotEmpty(order.getStorageName()), PjOrder::getStorageName, order.getStorageName())
+			.like(ObjectUtils.isNotEmpty(order.getSalerName()), PjOrder::getSalerName, order.getSalerName())
+			.eq(ObjectUtils.isNotEmpty(order.getCustomerId()), PjOrder::getCustomerId, order.getCustomerId())
+			.eq(ObjectUtils.isNotEmpty(order.getSalerId()), PjOrder::getSalerId, order.getSalerId())
+			.like(ObjectUtils.isNotEmpty(order.getCustomerName()), PjOrder::getCustomerName, order.getCustomerName())
+			.like(ObjectUtils.isNotEmpty(order.getSrcOrdNo()), PjOrder::getSrcOrdNo, order.getSrcOrdNo())
+			.like(ObjectUtils.isNotEmpty(order.getOrdNo()), PjOrder::getOrdNo, order.getOrdNo())
+			.like(ObjectUtils.isNotEmpty(order.getGoodsNameJoin()), PjOrder::getGoodsNameJoin, order.getGoodsNameJoin());
+		if (order.getBusinesDateList() != null && order.getBusinesDateList().size() > 1) {//业务日期
+			lambdaQueryWrapper.ge(PjOrder::getBusinesDate, order.getBusinesDateList().get(0));
+			lambdaQueryWrapper.le(PjOrder::getBusinesDate, order.getBusinesDateList().get(1));
+		}
+		if (ObjectUtils.isNull(order.getNotComplete())) {
+			lambdaQueryWrapper.apply("not find_in_set(status,'确认调拨')");
+		} else {
+			lambdaQueryWrapper.apply(ObjectUtils.isNotEmpty(order.getStatus()), "find_in_set(status,'" + order.getStatus() + "')");
+		}
+		lambdaQueryWrapper.orderByDesc(PjOrder::getCreateTime);
+		String userStorageId = ParameterUtils.getStorageId();
+		boolean whetherDatabaseSharding = ParameterUtils.whetherDatabaseSharding();
+		// selectedUser
+		String userRole = AuthUtil.getUserRole();
+		if (!userRole.contains("admin") && !userRole.contains("老板") && !userRole.contains("客服")) {
+			if (userRole.contains("业务员")) {
+				lambdaQueryWrapper.eq(PjOrder::getSalerId, selectedUser.getUserId());
+			} else if (userRole.contains("客户")) {
+				lambdaQueryWrapper.eq(PjOrder::getCreateUser, selectedUser.getUserId());
+			}
+		}
+		if (ObjectUtils.isNotNull(userStorageId) && whetherDatabaseSharding) {
+			lambdaQueryWrapper.apply("find_in_set(storage_id,'" + ParameterUtils.getStorageId() + "')");
+		}
+		lambdaQueryWrapper.eq(ObjectUtils.isNotNull(order.getStorageId()), PjOrder::getStorageId, order.getStorageId());
+		IPage<PjOrder> pages = orderService.page(Condition.getPage(query), lambdaQueryWrapper);
+		if (CollectionUtils.isNotEmpty(pages.getRecords())) {
+			List<Long> userIds = new ArrayList<>();
+			List<Long> createUser = pages.getRecords().stream().map(PjOrder::getCreateUser).filter(Objects::nonNull).distinct().collect(Collectors.toList());
+			if (!createUser.isEmpty()) {
+				userIds.addAll(createUser);
+			}
+			List<Long> updateUser = pages.getRecords().stream().map(PjOrder::getUpdateUser).filter(Objects::nonNull).filter(id -> !userIds.contains(id)).collect(Collectors.toList());
+			if (!updateUser.isEmpty()) {
+				userIds.addAll(updateUser);
+			}
+			StringBuilder user = new StringBuilder();
+			List<User> userList = new ArrayList<>();
+			for (Long item : userIds) {
+				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(PjOrder::getId).collect(Collectors.toList());
+			List<PjOrderItems> pjOrderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>().eq(PjOrderItems::getIsDeleted, 0)
+				.in(PjOrderItems::getPid, ids));
+			for (PjOrder item : pages.getRecords()) {
+				if (ObjectUtil.isNotEmpty(userList)) {
+					if (ObjectUtils.isNotNull(item.getUpdateUser())) {
+						userList.stream().filter(e -> e.getId().equals(item.getUpdateUser()))
+							.findFirst().ifPresent(users -> item.setUpdateUserName(users.getRealName()));
+					}
+					if (ObjectUtils.isNotNull(item.getCreateUser())) {
+						userList.stream().filter(e -> e.getId().equals(item.getCreateUser()))
+							.findFirst().ifPresent(users -> item.setCreateUserName(users.getRealName()));
+					}
+
+				}
+				if (!pjOrderItemsList.isEmpty()) {
+					long count = pjOrderItemsList.stream().filter(e -> e.getPid().equals(item.getId())).count();
+					item.setItem(count + "");
+					item.setNumberRows((int) count);
+				}
+			}
+		}
+
+		return R.data(pages);
+	}
+
+	/**
+	 * 新增或修改
+	 */
+	@PostMapping("/submit")
+	@RepeatSubmit
+	@VersionControl("orderServiceImpl")
+	public R submit(@Valid @RequestBody PjOrder order) {
+		return transferSalesService.submitTransferSales(order);
+	}
+
+	/**
+	 * 生成单据
+	 */
+	@PostMapping("/generateDocument")
+	@RepeatSubmit
+	public R generateDocument(@Valid @RequestBody PjOrder order) {
+		if (order.getId() == null) {
+			throw new RuntimeException("来源信息错误");
+		}
+		return transferSalesService.generateDocument(order);
+	}
+
+	/**
+	 * 撤销生成单据
+	 */
+	@PostMapping("/revokeGenerateDocument")
+	@RepeatSubmit
+	public R revokeGenerateDocument(@Valid @RequestBody PjOrder order) {
+		if (order.getId() == null) {
+			throw new RuntimeException("来源信息错误");
+		}
+		return transferSalesService.revokeGenerateDocument(order);
+	}
+
+}

+ 34 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/ITransferSalesService.java

@@ -0,0 +1,34 @@
+/*
+ *      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.order.service;
+
+import org.springblade.core.tool.api.R;
+import org.springblade.salesPart.entity.PjOrder;
+
+/**
+ * 配件销售采购表 服务类
+ *
+ * @author BladeX
+ * @since 2023-04-21
+ */
+public interface ITransferSalesService {
+	R submitTransferSales(PjOrder order);
+
+	R generateDocument(PjOrder order);
+
+	R revokeGenerateDocument(PjOrder order);
+}

+ 41 - 1
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/impl/OrderServiceImpl.java

@@ -5375,6 +5375,10 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 						}
 					}
 				}*/
+				String reservoirArea = sysClient.getParamServiceDWT("reservoir.area", AuthUtil.getTenantId());
+				int count = 1;
+				StringBuilder text = new StringBuilder();
+				List<PjHistory> historyList = new ArrayList<>();
 				for (PjOrderItems item : order.getOrderItemsList()) {
 					BigDecimal balanceQuantity = new BigDecimal("0.00");
 					BigDecimal inventoryAmount = new BigDecimal("0.00");
@@ -5396,7 +5400,6 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 						item.setUpdateUser(AuthUtil.getUserId());
 						item.setPid(order.getId());
 					}
-
 					//计算小计
 					item.setSubTotalMoney(item.getGoodsNum().multiply(item.getPrice()));
 					if (ObjectUtils.isNull(order.getStatus()) || "录入".equals(order.getStatus())) {
@@ -5468,6 +5471,43 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 						}
 					}
 					orderItemsService.saveOrUpdate(item);
+					if ("1".equals(reservoirArea)) {
+						if (ObjectUtils.isNotNull(item.getHistoryList()) && !item.getHistoryList().isEmpty()) {
+							item.setReservoirAreaName(item.getHistoryList().stream().map(PjHistory::getReservoirAreaName).collect(Collectors.joining(",")));
+							for (PjHistory history : item.getHistoryList()) {
+								if (ObjectUtils.isNull(history.getReservoirAreaId())) {
+									text.append("第").append(count).append("行商品:").append(item.getGoodsName()).append(" 库区,");
+								}
+								if (ObjectUtils.isNull(history.getQuantity()) || history.getQuantity().compareTo(new BigDecimal("0.00")) == 0) {
+									text.append("第").append(count).append("行商品:").append(item.getGoodsName()).append(" 本次数量,");
+								}
+								history.setType(1);
+								history.setDot(item.getDot());
+								history.setGoodsNo(item.getGoodsNo());
+								history.setGoodsName(item.getGoodsName());
+								history.setGoodsId(item.getGoodsId());
+								history.setBrandId(item.getBrandId());
+								history.setBrandName(item.getBrandName());
+								history.setTypeno(item.getPropertyName());
+								history.setBrandItem(item.getPattern());
+								if (history.getId() == null) {
+									history.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+									history.setCreateTime(new Date());
+									history.setCreateUser(AuthUtil.getUserId());
+									history.setPid(order.getId());
+									history.setSrcItemId(item.getId());
+									history.setTenantId(AuthUtil.getTenantId());
+								} else {
+									history.setUpdateTime(new Date());
+									history.setUpdateUser(AuthUtil.getUserId());
+								}
+								historyList.add(history);
+							}
+						}
+					}
+				}
+				if (!historyList.isEmpty()) {
+					historyService.saveOrUpdateBatch(historyList);
 				}
 				if (goodsName.length() > 0) {
 					order.setGoodsNameJoin(goodsName.substring(0, goodsName.length() - 1));

+ 345 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/impl/TransferSalesServiceImpl.java

@@ -0,0 +1,345 @@
+package org.springblade.salesPart.order.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import lombok.AllArgsConstructor;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.salesPart.corps.mapper.CorpsDescMapper;
+import org.springblade.salesPart.entity.*;
+import org.springblade.salesPart.enums.OrderTypeEnum;
+import org.springblade.salesPart.goods.mapper.GoodsDescMapper;
+import org.springblade.salesPart.order.service.IOrderItemsService;
+import org.springblade.salesPart.order.service.IOrderService;
+import org.springblade.salesPart.order.service.ITransferSalesService;
+import org.springblade.salesPart.serial.service.IPjpfSerialService;
+import org.springblade.salesPart.stock.service.IStockDescService;
+import org.springblade.system.entity.Dept;
+import org.springblade.system.feign.ISysClient;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * 配件销售采购表 服务实现类
+ *
+ * @author BladeX
+ * @since 2023-04-21
+ */
+@Service
+@AllArgsConstructor
+public class TransferSalesServiceImpl implements ITransferSalesService {
+
+	/**
+	 * 生成系统编号
+	 */
+	private final IPjpfSerialService serialService;
+	private final IOrderService orderService;
+	private final IOrderItemsService orderItemsService;
+	private final CorpsDescMapper corpsDescMapper;
+	private final IStockDescService stockDescService;
+	private final GoodsDescMapper goodsDescMapper;
+	private final ISysClient sysClient;
+
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public R submitTransferSales(PjOrder order) {
+		//客户名称
+		PjCorpsDesc corpsDesc = corpsDescMapper.selectById(order.getCustomerId());
+		order.setCustomerName(corpsDesc.getCname());
+
+		// 获取系统编号
+		String billNo = serialService.getBillNo("DBXS", "DBXS", "DBXS");
+		if (ObjectUtils.isNull(billNo)) {
+			TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+			return R.fail(500, "生成系统编号失败");
+		}
+		if (order.getId() == null) {
+			order.setOrdNo(billNo);
+			order.setBsType("DBXS");
+			order.setSrcOrdNo(billNo);
+			order.setCreateTime(new Date());
+			order.setCreateUser(AuthUtil.getUserId());
+			order.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+			order.setTenantId(AuthUtil.getTenantId());
+			order.setStatus(OrderTypeEnum.XSLR.getType());
+			order.setBusinessSource(OrderTypeEnum.DBXS.getType());
+			order.setVersion(1);
+			orderService.save(order);
+		} else {
+			PjOrder orderVersion = orderService.getById(order.getId());
+			if (orderVersion != null && !orderVersion.getVersion().equals(order.getVersion())) {
+				throw new RuntimeException("订单数据已被修改,请返回列表重新操作!");
+			}
+			order.setVersion(order.getVersion() + 1);
+			order.setUpdateUser(AuthUtil.getUserId());
+			order.setUpdateTime(new Date());
+			orderService.updateById(order);
+		}
+		// 保存订单明细
+		if (CollectionUtils.isNotEmpty(order.getOrderItemsList())) {
+			//所属公司
+			R<Dept> dept = sysClient.getDept(Long.valueOf(AuthUtil.getDeptId()));
+			if (ObjectUtil.isNotEmpty(dept)) {
+				order.setSalesCompanyId(dept.getData().getId());
+				order.setSalesCompanyName(dept.getData().getFullName());
+			} else {
+				throw new SecurityException("未维护所属公司");
+			}
+			StringBuilder goodsName = new StringBuilder();
+			StringBuilder retrieval = new StringBuilder();
+			List<Long> goodsId = order.getOrderItemsList().stream().map(PjOrderItems::getGoodsId).distinct().collect(Collectors.toList());
+			List<String> goodsNames = order.getOrderItemsList().stream().map(PjOrderItems::getGoodsName).distinct().collect(Collectors.toList());
+			if (goodsId.size() != order.getOrderItemsList().size()) {
+				throw new RuntimeException("明细存在重复商品,请修改明细数据");
+			}
+			LambdaQueryWrapper<PjStockDesc> stockLambdaQueryWrapper = new LambdaQueryWrapper<>();
+			stockLambdaQueryWrapper.eq(ObjectUtils.isNotNull(order.getStorageId()), PjStockDesc::getStorageId, order.getStorageId())
+				.eq(PjStockDesc::getTenantId, AuthUtil.getTenantId())
+				.eq(PjStockDesc::getIsDeleted, 0)
+				.in(PjStockDesc::getGoodsId, goodsId);
+			List<PjStockDesc> pjStockDescList = stockDescService.list(stockLambdaQueryWrapper);
+			if (ObjectUtils.isNotNull(order.getStorageId())) {
+				if (goodsId.size() != pjStockDescList.size()) {
+					List<PjStockDesc> difference = pjStockDescList.stream().filter(e -> !goodsId.contains(e.getGoodsId())).collect(Collectors.toList());
+					if (!difference.isEmpty()) {
+						String name = difference.stream().map(PjStockDesc::getCname).collect(Collectors.joining(","));
+						throw new RuntimeException(name + "未查到库存,请修改");
+					}
+				}
+			}
+			if (goodsId.size() != goodsNames.size()) {
+				throw new RuntimeException("明细数据存在改名并重名商品,请联系管理员处理");
+			}
+			for (PjOrderItems item : order.getOrderItemsList()) {
+				item.setSendNum(new BigDecimal("0.00"));
+				if (new BigDecimal("0.00").compareTo(item.getPrice()) == 0) {
+					throw new RuntimeException("商品:" + item.getGoodsName() + "单价为零");
+				}
+				item.setBizType(order.getBsType());
+				item.setBillNo(order.getOrdNo());
+				if (item.getId() == null) {
+					item.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+					item.setCreateTime(new Date());
+					item.setCreateUser(AuthUtil.getUserId());
+					item.setPid(order.getId());
+					item.setTenantId(AuthUtil.getTenantId());
+				} else {
+					item.setUpdateTime(new Date());
+					item.setUpdateUser(AuthUtil.getUserId());
+					item.setPid(order.getId());
+				}
+				//计算小计
+				item.setSubTotalMoney(item.getGoodsNum().multiply(item.getPrice()));
+				if (ObjectUtils.isNull(order.getStatus()) || "录入".equals(order.getStatus())) {
+					item.setPrimaryGoodsTotalNum(item.getGoodsNum());
+				}
+				//获得商品
+				PjGoodsDesc goodsDesc = goodsDescMapper.selectById(item.getGoodsId());
+				if (ObjectUtil.isEmpty(goodsDesc)) {
+					throw new RuntimeException("商品数据异常");
+				}
+				item.setBrandId(goodsDesc.getBrandId());
+				item.setBrandName(goodsDesc.getBrandName());
+				if (!pjStockDescList.isEmpty()) {
+					//管理批次号
+					PjStockDesc stockOne;
+					if (ObjectUtil.isNotEmpty(goodsDesc.getWhether()) && "1".equals(goodsDesc.getWhether())) {
+						stockOne = pjStockDescList.stream()
+							.filter(e -> e.getGoodsId().equals(item.getGoodsId())
+								&& ObjectUtils.isNotNull(e.getDot()) && 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) {
+						item.setInventory(stockOne.getBalanceQuantity());
+						item.setInventoryFinancing(stockOne.getBalanceQuantityFinancing());
+						item.setInventoryHave(stockOne.getBalanceQuantityHave());
+						item.setCostprie(item.getGoodsNum().multiply(stockOne.getInventoryCostPrice()));
+						item.setCostpriePrice(stockOne.getInventoryCostPrice());
+						item.setRebateCostprie(item.getGoodsNum().multiply(stockOne.getRebatePrice()));
+						//计算毛利
+						item.setGrossProfit(item.getSubTotalMoney().subtract(item.getCostprie()));
+						item.setRebateProfit(item.getSubTotalMoney().subtract(item.getRebateCostprie()));
+					}
+				}
+				//计算成本
+				goodsName.append(goodsDesc.getCname()).append(",");
+				retrieval.append(goodsDesc.getCnameInt()).append(",");
+				if (ObjectUtils.isNull(item.getSendNum())) {
+					item.setSendNum(new BigDecimal("0.00"));
+				}
+				orderItemsService.saveOrUpdate(item);
+			}
+			if (goodsName.length() > 0) {
+				order.setGoodsNameJoin(goodsName.substring(0, goodsName.length() - 1));
+			}
+			if (retrieval.length() > 0) {
+				order.setShortcutJoin(retrieval.substring(0, retrieval.length() - 1));
+			}
+			order.setNumberRows(order.getOrderItemsList().size());//行数
+			//总数量
+			order.setGoodsTotalNum(order.getOrderItemsList().stream().map(PjOrderItems::getGoodsNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+			//总已发数量
+			order.setGoodsTotalShipNum(order.getOrderItemsList().stream().map(PjOrderItems::getSendNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+			//实际金额
+			order.setGoodsTotalShipAmount(order.getOrderItemsList().stream().map(PjOrderItems::getGoodsTotalShipAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+			//总金额
+			BigDecimal totalMoney = order.getOrderItemsList().stream().reduce(BigDecimal.ZERO, (x, y) -> x.add(y.getGoodsNum().multiply(y.getPrice())), BigDecimal::add)
+				.setScale(2, RoundingMode.HALF_UP);
+			order.setSalesAmount(totalMoney);
+			order.setTotalMoney(totalMoney);
+			//毛利
+			order.setGrossProfit(order.getOrderItemsList().stream().map(PjOrderItems::getGrossProfit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+			//成本
+			order.setCost(order.getOrderItemsList().stream().map(PjOrderItems::getCostprie).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+			order.setRebateGrossProfit(order.getOrderItemsList().stream().map(PjOrderItems::getRebateProfit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+			//成本
+			order.setRebateCost(order.getOrderItemsList().stream().map(PjOrderItems::getRebateCostprie).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+		} else {
+			order.setNumberRows(0);//行数
+			//总数量
+			order.setGoodsTotalNum(new BigDecimal("0"));
+			order.setSalesAmount(new BigDecimal("0.00"));
+			order.setTotalMoney(new BigDecimal("0.00"));
+		}
+		orderService.updateById(order);
+		return R.data(order);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public R generateDocument(PjOrder orderData) {
+		PjOrder pjOrder = orderService.getById(orderData.getId());
+		if (pjOrder == null) {
+			throw new RuntimeException("未查到单据信息");
+		}
+		List<PjOrderItems> orderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>()
+			.eq(PjOrderItems::getIsDeleted, 0)
+			.eq(PjOrderItems::getTenantId, AuthUtil.getTenantId())
+			.eq(PjOrderItems::getPid, orderData.getId()));
+		if (orderItemsList.isEmpty()) {
+			throw new RuntimeException("未查到单据明细信息");
+		}
+		// 获取系统编号
+		String billNo = serialService.getBillNo(orderData.getBsType(), orderData.getBsType(), orderData.getBsType());
+		if (ObjectUtils.isNull(billNo)) {
+			TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+			return R.fail(500, "生成系统编号失败");
+		}
+		PjOrder order = new PjOrder();
+		BeanUtil.copyProperties(pjOrder, order);
+		order.setTransferSalesNo(pjOrder.getOrdNo());
+		order.setTransferSalesId(pjOrder.getId());
+		order.setId(null);
+		order.setOrdNo(billNo);
+		order.setSrcOrdNo(billNo);
+		order.setCreateTime(new Date());
+		order.setCreateUser(AuthUtil.getUserId());
+		order.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+		order.setUpdateUser(null);
+		order.setUpdateTime(null);
+		order.setStatus(OrderTypeEnum.XSLR.getType());
+		order.setXcxStatus(OrderTypeEnum.XSLR.getType());
+		order.setBsType(orderData.getBsType());
+		order.setVersion(1);
+		order.setDueDate(new Date());
+		order.setBusinessSource(OrderTypeEnum.WEB.getType());
+		if ("CG".equals(order.getBsType())) {
+			order.setStorageId(pjOrder.getCallInStorageId());
+			order.setStorageName(pjOrder.getCallInStorageName());
+		}
+		orderService.save(order);
+		List<PjOrderItems> orderItems = new ArrayList<>();
+		for (PjOrderItems item : orderItemsList) {
+			item.setBizType(order.getBsType());
+			item.setBillNo(order.getOrdNo());
+			item.setCreateDept(order.getCreateDept());
+			item.setCreateTime(new Date());
+			item.setCreateUser(AuthUtil.getUserId());
+			item.setPid(order.getId());
+			item.setUpdateTime(null);
+			item.setUpdateUser(null);
+			item.setId(null);
+			if ("CG".equals(order.getBsType())) {
+				item.setCostpriePrice(item.getPrice());
+				item.setCostprie(item.getTotalAmount());
+				item.setRebatePrice(item.getPrice());
+				item.setRebateCostprie(item.getTotalAmount());
+				item.setRebateProfit(new BigDecimal("0.00"));
+				item.setGrossProfit(new BigDecimal("0.00"));
+				item.setProfit(new BigDecimal("0.00"));
+			}
+			orderItems.add(item);
+		}
+		if (!orderItems.isEmpty()) {
+			orderItemsService.saveBatch(orderItems);
+		}
+		pjOrder.setUpdateUser(AuthUtil.getUserId());
+		pjOrder.setUpdateTime(new Date());
+		pjOrder.setVersion(pjOrder.getVersion() + 1);
+		if ("CG".equals(order.getBsType())) {
+			order.setRebateGrossProfit(orderItems.stream().map(PjOrderItems::getRebateProfit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+			//成本
+			order.setRebateCost(orderItems.stream().map(PjOrderItems::getRebateCostprie).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+			orderService.updateById(order);
+			pjOrder.setCgStatus("1");
+		} else {
+			pjOrder.setXsStatus("1");
+		}
+		orderService.updateById(pjOrder);
+		return R.data(pjOrder);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public R revokeGenerateDocument(PjOrder orderData) {
+		PjOrder pjOrder = orderService.getById(orderData.getId());
+		if (pjOrder == null) {
+			throw new RuntimeException("未查到单据信息");
+		}
+		pjOrder.setUpdateUser(AuthUtil.getUserId());
+		pjOrder.setUpdateTime(new Date());
+		pjOrder.setVersion(pjOrder.getVersion() + 1);
+		if ("CG".equals(orderData.getBsType())) {
+			pjOrder.setCgStatus("1");
+		} else {
+			pjOrder.setXsStatus("1");
+		}
+		orderService.updateById(pjOrder);
+		PjOrder order = orderService.getOne(new LambdaQueryWrapper<PjOrder>()
+			.eq(PjOrder::getIsDeleted, 0)
+			.eq(PjOrder::getTenantId, AuthUtil.getTenantId())
+			.eq(PjOrder::getBsType, orderData.getBsType())
+			.eq(PjOrder::getTransferSalesId, pjOrder.getId())
+			.eq(PjOrder::getTransferSalesNo, pjOrder.getOrdNo()));
+		if (order == null) {
+			throw new RuntimeException("未查到生成的单据");
+		}
+		List<PjOrderItems> orderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>()
+			.eq(PjOrderItems::getTenantId, AuthUtil.getTenantId())
+			.eq(PjOrderItems::getIsDeleted, 0)
+			.eq(PjOrderItems::getPid, order.getId()));
+		if (!orderItemsList.isEmpty()) {
+			orderItemsService.removeByIds(orderItemsList.stream().map(PjOrderItems::getId).collect(Collectors.toList()));
+		}
+		orderService.removeById(order.getId());
+		return R.data(pjOrder);
+	}
+
+
+}

+ 12 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/controller/ShipController.java

@@ -315,6 +315,18 @@ public class ShipController extends BladeController {
 	}
 
 	/**
+	 * 生成工单提示是否存在
+	 */
+	@PostMapping("/generatePrompt")
+	@RepeatSubmit
+	public R generatePrompt(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		if (ObjectUtil.isEmpty(ids)) {
+			throw new RuntimeException("缺少必要参数");
+		}
+		return shipService.generatePrompt(ids);
+	}
+
+	/**
 	 * 出库完成
 	 */
 	@PostMapping("/outboundCompleted")

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

@@ -191,4 +191,6 @@ public interface IShipService extends IService<PjShip> {
 	R<List<PjHistory>> selectShipItemRecord(ReservoirAreaRecordVO reservoirAreaRecord);
 
 	R<List<ReservoirAreaRecordItem>> selectReservoirAreaRecordItem(ReservoirAreaRecordItem item);
+
+	R generatePrompt(String ids);
 }

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

@@ -156,13 +156,14 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 			.eq(PjShipItems::getPid, detail.getId());
 		List<PjShipItems> shipItemsList = shipItemsService.list(itemsLambdaQueryWrapper);
 		if (!shipItemsList.isEmpty()) {
-			List<ShipItemsRecord> recordList = shipItemsRecordService.list(new LambdaQueryWrapper<ShipItemsRecord>()
-				.eq(ShipItemsRecord::getTenantId, AuthUtil.getTenantId())
-				.eq(ShipItemsRecord::getIsDeleted, 0)
-				.eq(ShipItemsRecord::getPid, ship.getId()));
 			String reservoirArea = sysClient.getParamServiceDWT("reservoir.area", AuthUtil.getTenantId());
 			List<PjHistory> historyList = new ArrayList<>();
+			List<ShipItemsRecord> recordList = new ArrayList<>();
 			if ("1".equals(reservoirArea)) {
+				recordList = shipItemsRecordService.list(new LambdaQueryWrapper<ShipItemsRecord>()
+					.eq(ShipItemsRecord::getTenantId, AuthUtil.getTenantId())
+					.eq(ShipItemsRecord::getIsDeleted, 0)
+					.eq(ShipItemsRecord::getPid, ship.getId()));
 				//历史记录
 				LambdaQueryWrapper<PjHistory> historyLambdaQueryWrapper = new LambdaQueryWrapper<>();
 				historyLambdaQueryWrapper.eq(PjHistory::getTenantId, AuthUtil.getTenantId())
@@ -776,6 +777,20 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 			}
 			List<Long> itemId = pjShipList.stream().map(PjShip::getId).collect(Collectors.toList());
 			baseMapper.deleteBatchIds(itemId);
+			List<PjShipItems> shipItemsList = shipItemsService.list(new LambdaQueryWrapper<PjShipItems>()
+				.eq(PjShipItems::getTenantId, AuthUtil.getTenantId())
+				.eq(PjShipItems::getIsDeleted, 0)
+				.in(PjShipItems::getPid, itemId));
+			if (!shipItemsList.isEmpty()) {
+				shipItemsService.removeByIds(shipItemsList.stream().map(PjShipItems::getId).collect(Collectors.toList()));
+			}
+			List<PjHistory> historyList = historyService.list(new LambdaQueryWrapper<PjHistory>()
+				.eq(PjHistory::getTenantId, AuthUtil.getTenantId())
+				.eq(PjHistory::getIsDeleted, 0)
+				.in(PjHistory::getPid, itemId));
+			if (!historyList.isEmpty()) {
+				historyService.removeByIds(historyList.stream().map(PjHistory::getId).collect(Collectors.toList()));
+			}
 			PjShip rwShip = new PjShip();
 			//修改出库任务状态
 			rwShip.setStatusName("未完成");
@@ -1215,12 +1230,12 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 								continue;
 							}
 							List<PjOrderItems> orderItemList = new ArrayList<>();
-							if(ObjectUtils.isNotNull(shipItems.getDot())){
-								orderItemList= orderItemsList.stream().filter(e -> e.getGoodsId().equals(shipItems.getGoodsId()) &&
+							if (ObjectUtils.isNotNull(shipItems.getDot())) {
+								orderItemList = orderItemsList.stream().filter(e -> e.getGoodsId().equals(shipItems.getGoodsId()) &&
 										e.getDot().equals(shipItems.getDot())).sorted(Comparator.comparing(PjOrderItems::getCreateTime))
 									.collect(Collectors.toList());
-							}else{
-								orderItemList= orderItemsList.stream().filter(e -> e.getGoodsId().equals(shipItems.getGoodsId()))
+							} else {
+								orderItemList = orderItemsList.stream().filter(e -> e.getGoodsId().equals(shipItems.getGoodsId()))
 									.sorted(Comparator.comparing(PjOrderItems::getCreateTime)).collect(Collectors.toList());
 							}
 							if (orderItemList.isEmpty()) {
@@ -2972,7 +2987,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 						}
 					}
 				} else {
-					throw new RuntimeException("未查到库存数据");
+					throw new RuntimeException("商品:" + goodsDesc.getCname() + "未查到库存数据");
 				}
 				shipItemsList.add(item);
 			}
@@ -3673,8 +3688,8 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 						}
 						stockOneC.setBalanceQuantityHave(stockOneC.getBalanceQuantityHave().subtract(orderItems.getGoodsNum()));
 					} else {
-						if(orderItems.getSendNumHave().compareTo(new BigDecimal("0.00")) == 0 &&
-							orderItems.getSendNumFinancing().compareTo(new BigDecimal("0.00")) == 0){
+						if (orderItems.getSendNumHave().compareTo(new BigDecimal("0.00")) == 0 &&
+							orderItems.getSendNumFinancing().compareTo(new BigDecimal("0.00")) == 0) {
 							throw new RuntimeException("第" + count + "行,商品:" + goodsDesc.getCname() + "调拨数量有误请联系管理员");
 						}
 						if (orderItems.getSendNumFinancing().compareTo(stockOneC.getBalanceQuantityFinancing()) > 0) {
@@ -3787,8 +3802,8 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 					if (!"1".equals(status)) {
 						stockOneR.setBalanceQuantityHave(stockOneR.getBalanceQuantityHave().add(orderItems.getGoodsNum()));
 					} else {
-						if(orderItems.getSendNumHave().compareTo(new BigDecimal("0.00")) == 0 &&
-							orderItems.getSendNumFinancing().compareTo(new BigDecimal("0.00")) == 0){
+						if (orderItems.getSendNumHave().compareTo(new BigDecimal("0.00")) == 0 &&
+							orderItems.getSendNumFinancing().compareTo(new BigDecimal("0.00")) == 0) {
 							throw new RuntimeException("第" + count + "行,商品:" + goodsDesc.getCname() + "调拨数量有误请联系管理员");
 						}
 						stockOneR.setBalanceQuantityFinancing(stockOneR.getBalanceQuantityFinancing().add(orderItems.getSendNumFinancing()));
@@ -4092,8 +4107,8 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 					if (!"1".equals(status)) {
 						stockOneC.setBalanceQuantityHave(stockOneC.getBalanceQuantityHave().add(orderItems.getGoodsNum()));
 					} else {
-						if(orderItems.getSendNumHave().compareTo(new BigDecimal("0.00")) == 0 &&
-							orderItems.getSendNumFinancing().compareTo(new BigDecimal("0.00")) == 0){
+						if (orderItems.getSendNumHave().compareTo(new BigDecimal("0.00")) == 0 &&
+							orderItems.getSendNumFinancing().compareTo(new BigDecimal("0.00")) == 0) {
 							throw new RuntimeException("第" + count + "行,商品:" + goodsDesc.getCname() + "调拨数量有误请联系管理员");
 						}
 						stockOneC.setBalanceQuantityFinancing(stockOneC.getBalanceQuantityFinancing().add(orderItems.getSendNumFinancing()));
@@ -4162,8 +4177,8 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 						}
 						stockOneR.setBalanceQuantityHave(stockOneR.getBalanceQuantityHave().subtract(orderItems.getGoodsNum()));
 					} else {
-						if(orderItems.getSendNumHave().compareTo(new BigDecimal("0.00")) == 0 &&
-							orderItems.getSendNumFinancing().compareTo(new BigDecimal("0.00")) == 0){
+						if (orderItems.getSendNumHave().compareTo(new BigDecimal("0.00")) == 0 &&
+							orderItems.getSendNumFinancing().compareTo(new BigDecimal("0.00")) == 0) {
 							throw new RuntimeException("第" + count + "行,商品:" + goodsDesc.getCname() + "调拨数量有误请联系管理员");
 						}
 						if (orderItems.getSendNumFinancing().compareTo(stockOneR.getBalanceQuantityFinancing()) > 0) {
@@ -6765,6 +6780,8 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 				.apply("goods_num != send_num")
 				.eq("tenant_id", nowOutBoundWorkUser.getTenantId()));
 		}
+		List<PjHistory> historyList = new ArrayList<>();
+		String reservoirArea = sysClient.getParamServiceDWT("reservoir.area", AuthUtil.getTenantId());
 		if (!pjOrderItemsList.isEmpty()) {
 			List<Long> goodsId = pjOrderItemsList.stream().map(PjOrderItems::getGoodsId).filter(Objects::nonNull).collect(Collectors.toList());
 			if (!goodsId.isEmpty() && !storageId.isEmpty()) {
@@ -6774,6 +6791,15 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 					.in(PjStockDesc::getGoodsId, goodsId)
 					.in(PjStockDesc::getStorageId, storageId));
 			}
+			if ("1".equals(reservoirArea)) {
+				//历史记录
+				LambdaQueryWrapper<PjHistory> historyLambdaQueryWrapper = new LambdaQueryWrapper<>();
+				historyLambdaQueryWrapper.eq(PjHistory::getTenantId, AuthUtil.getTenantId())
+					.eq(PjHistory::getIsDeleted, 0)
+					.eq(PjHistory::getType, 1)
+					.eq(PjHistory::getPid, pjOrderItemsList.get(0).getPid());
+				historyList = historyService.list(historyLambdaQueryWrapper);
+			}
 		}
 		for (Long id : shipIds) {
 			//获得出库任务数据
@@ -7014,6 +7040,33 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 		}
 		this.saveOrUpdateBatch(rwShipList);
 		shipItemsService.saveOrUpdateBatch(shipItemsList);
+		if ("1".equals(reservoirArea) && !historyList.isEmpty()) {
+			List<PjHistory> historyNewList = new ArrayList<>();
+			for (PjShipItems item : shipItemsList) {
+				List<PjHistory> histories = historyList.stream().filter(e -> e.getSrcItemId().equals(item.getSrcItemId()))
+					.collect(Collectors.toList());
+				for (PjHistory history : histories) {
+					PjHistory pjHistory = new PjHistory();
+					BeanUtil.copyProperties(history, pjHistory);
+					pjHistory.setId(null);
+					pjHistory.setCreateUser(AuthUtil.getUserId());
+					pjHistory.setCreateTime(new Date());
+					pjHistory.setUpdateUser(null);
+					pjHistory.setUpdateTime(null);
+					pjHistory.setStatus(null);
+					pjHistory.setPid(item.getPid());
+					pjHistory.setOperatorId(null);
+					pjHistory.setOperatorName(null);
+					pjHistory.setOperateStatus(null);
+					pjHistory.setOperateTime(null);
+					pjHistory.setSrcItemId(item.getId());
+					historyNewList.add(pjHistory);
+				}
+			}
+			if (!historyNewList.isEmpty()) {
+				historyService.saveBatch(historyNewList);
+			}
+		}
 		return R.success("操作成功");
 	}
 
@@ -7246,4 +7299,16 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 		return R.data(list);
 	}
 
+	@Override
+	public R generatePrompt(String ids) {
+		List<PjShip> shipList = baseMapper.selectList(new LambdaQueryWrapper<PjShip>()
+			.eq(PjShip::getTenantId, AuthUtil.getTenantId())
+			.eq(PjShip::getIsDeleted, 0)
+			.in(PjShip::getTaskId, Func.toLongList(ids)));
+		if (!shipList.isEmpty()) {
+			throw new RuntimeException("已生成工单是否重复生成");
+		}
+		return R.success("操作成功");
+	}
+
 }