Browse Source

2025年2月10日17:10:58

纪新园 11 months ago
parent
commit
f3f541e4ec

+ 39 - 1
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/entity/PjShip.java

@@ -23,6 +23,7 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.salesPart.produce.entity.ProductWorkmanshipItems;
 import org.springblade.salesPart.vo.ShipVO;
 import org.springframework.format.annotation.DateTimeFormat;
 
@@ -202,7 +203,7 @@ public class PjShip implements Serializable {
 	/**
 	 * 业务日期
 	 */
-	@ApiModelProperty(value = "应结日期")
+	@ApiModelProperty(value = "业务日期")
 	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
 	@DateTimeFormat(pattern = "yyyy-MM-dd")
 	private Date businesDate;
@@ -350,4 +351,41 @@ public class PjShip implements Serializable {
 	 */
 	@TableField(exist = false)
 	private String date;
+
+	/**
+	 * 产品id
+	 */
+	@ApiModelProperty(value = "产品id")
+	private Long goodsId;
+	/**
+	 * 产品名称
+	 */
+	@ApiModelProperty(value = "产品名称")
+	private String goodsName;
+
+	/**
+	 * 完工时间
+	 */
+	@ApiModelProperty(value = "完工时间")
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	private Date completedDate;
+
+
+	/**
+	 * 完工时间
+	 */
+	@TableField(exist = false)
+	private List<String> completedDateList;
+	/**
+	 * 属性明细
+	 */
+	@TableField(exist = false)
+	private List<ProductWorkmanshipItems> attributeItemsList;
+
+	/**
+	 * 工艺明细
+	 */
+	@TableField(exist = false)
+	private List<ProductWorkmanshipItems> craftItemsList;
 }

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

@@ -195,6 +195,25 @@ public enum OrderTypeEnum {
 	 * 收款
 	 */
 	PAYMENT("FK"),
+
+	/**
+	 * 生产订单
+	 */
+	SCDD("SCDD"),
+
+	/**
+	 * 生产中
+	 */
+	PRODUCTION_IN("生产中"),
+	/**
+	 * 生产完成
+	 */
+	PRODUCTION_COMPLETED("生产完成"),
+
+	/**
+	 * 生产领料
+	 */
+	SCLL("SCLL"),
 	;
 
 	private final String type;

+ 96 - 38
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/produce/controller/ProductionOrderController.java

@@ -18,10 +18,9 @@ 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 com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.AllArgsConstructor;
 import org.springblade.core.boot.ctrl.BladeController;
@@ -30,17 +29,19 @@ 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.salesPart.produce.entity.ProductWorkmanship;
-import org.springblade.salesPart.produce.entity.ProductWorkmanshipItems;
-import org.springblade.salesPart.produce.service.IProductWorkmanshipItemsService;
-import org.springblade.salesPart.produce.service.IProductWorkmanshipService;
-import org.springblade.salesPart.produce.vo.ProductWorkmanshipVO;
+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;
 
 /**
@@ -55,45 +56,86 @@ import java.util.stream.Collectors;
 @Api(value = "生成订单", tags = "生成订单接口")
 public class ProductionOrderController extends BladeController {
 
-	private final IProductWorkmanshipService productWorkmanshipService;
-
-	private final IProductWorkmanshipItemsService productWorkmanshipItemsService;
-
 	private final IShipService shipService;
 
 	private final IShipItemsService shipItemsService;
 
+	private final IUserClient userClient;
+
 	/**
 	 * 详情
 	 */
-	@GetMapping("/detail")
-	public R<ProductWorkmanship> detail(ProductWorkmanship productWorkmanship) {
-		ProductWorkmanship detail = productWorkmanshipService.detail(productWorkmanship);
+	@GetMapping("/detailProduction")
+	public R<PjShip> detailProduction(PjShip ship) {
+		PjShip detail = shipService.detailProduction(ship);
 		return R.data(detail);
 	}
 
 	/**
 	 * 分页 生成订单
 	 */
-	@GetMapping("/list")
-	public R<IPage<ProductWorkmanship>> list(ProductWorkmanship productWorkmanship, Query query) {
-		LambdaQueryWrapper<ProductWorkmanship> lambdaQueryWrapper = new LambdaQueryWrapper<>();
-		lambdaQueryWrapper.eq(ProductWorkmanship::getTenantId, AuthUtil.getTenantId())
-			.eq(ProductWorkmanship::getIsDeleted, 0)
-			.like(ObjectUtils.isNotNull(productWorkmanship.getGoodsName()), ProductWorkmanship::getGoodsName, productWorkmanship.getGoodsName())
-			.orderByDesc(ProductWorkmanship::getCreateTime);
-		IPage<ProductWorkmanship> pages = productWorkmanshipService.page(Condition.getPage(query), lambdaQueryWrapper);
-		if (!pages.getRecords().isEmpty()) {
-			List<Long> ids = pages.getRecords().stream().map(ProductWorkmanship::getId).collect(Collectors.toList());
-			List<ProductWorkmanshipItems> attributeItemsList = productWorkmanshipItemsService.list(new LambdaQueryWrapper<ProductWorkmanshipItems>()
-				.eq(ProductWorkmanshipItems::getTenantId, AuthUtil.getTenantId())
-				.eq(ProductWorkmanshipItems::getIsDeleted, 0)
-				.in(ProductWorkmanshipItems::getPid, ids));
-			for (ProductWorkmanship item : pages.getRecords()) {
-				if (!attributeItemsList.isEmpty()) {
-					item.setCount(attributeItemsList.stream().filter(e -> e.getPid().equals(item.getId())).count());
-				} else {
-					item.setCount(0L);
+	@GetMapping("/listProduction")
+	public R<IPage<PjShip>> listProduction(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() + "");
 				}
 			}
 		}
@@ -103,18 +145,34 @@ public class ProductionOrderController extends BladeController {
 	/**
 	 * 新增或修改 生成订单
 	 */
-	@PostMapping("/submit")
-	public R submit(@Valid @RequestBody ProductWorkmanship productWorkmanship) {
-		return productWorkmanshipService.submit(productWorkmanship);
+	@PostMapping("/submitProduction")
+	public R submitProduction(@Valid @RequestBody PjShip ship) {
+		return shipService.submitProduction(ship);
 	}
 
 
 	/**
 	 * 删除 生成订单
 	 */
-	@PostMapping("/remove")
+	@PostMapping("/removeProduction")
 	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
-		return R.status(productWorkmanshipService.removeByIds(Func.toLongList(ids)));
+		return R.status(shipService.removeByIds(Func.toLongList(ids)));
+	}
+
+	/**
+	 * 完工
+	 */
+	@PostMapping("/completed")
+	public R completed(@Valid @RequestBody PjShip ship) {
+		return shipService.completed(ship);
+	}
+
+	/**
+	 * 撤销完工
+	 */
+	@PostMapping("/revokeCompleted")
+	public R revokeCompleted(@Valid @RequestBody PjShip ship) {
+		return shipService.revokeCompleted(ship);
 	}
 
 

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

@@ -183,4 +183,12 @@ public interface IShipService extends IService<PjShip> {
 	R shippingNotice(PjShip ship);
 
 	R outboundWorkOrderV1(String ids);
+
+    PjShip detailProduction(PjShip ship);
+
+	R submitProduction(PjShip ship);
+
+	R completed(PjShip ship);
+
+	R revokeCompleted(PjShip ship);
 }

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

@@ -58,6 +58,8 @@ import org.springblade.salesPart.history.mapper.HistoryMapper;
 import org.springblade.salesPart.order.mapper.OrderMapper;
 import org.springblade.salesPart.order.service.IOrderItemsService;
 import org.springblade.salesPart.order.service.IOrderRecordService;
+import org.springblade.salesPart.produce.entity.ProductWorkmanshipItems;
+import org.springblade.salesPart.produce.service.IProductWorkmanshipItemsService;
 import org.springblade.salesPart.productLaunch.service.IProductLaunchService;
 import org.springblade.salesPart.serial.service.IPjpfSerialService;
 import org.springblade.salesPart.ship.mapper.ShipMapper;
@@ -130,6 +132,8 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 
 	private final ITongLianPaymentClient parametersService;
 
+	private final IProductWorkmanshipItemsService productWorkmanshipItemsService;
+
 	/**
 	 * 获取收发货订单详情
 	 *
@@ -139,7 +143,6 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 	@Override
 	public PjShip getMessageById(PjShip ship) {
 		PjShip detail = baseMapper.selectById(ship.getId());
-
 		//明细
 		LambdaQueryWrapper<PjShipItems> itemsLambdaQueryWrapper = new LambdaQueryWrapper<>();
 		itemsLambdaQueryWrapper.eq(PjShipItems::getTenantId, AuthUtil.getTenantId())
@@ -6191,28 +6194,181 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 					}
 				}
 			}
-			/*// 创建线程池
-			ExecutorService executor = Executors.newSingleThreadExecutor();
-			// 启动任务并提交给线程池
-			executor.submit(() -> {
-				try {
-					this.sendMessage(rwShip, item, goodsNames, 1);
-				} catch (Exception e) {
-					System.out.println("业务处理成功,发送消息异常,时间:" + new Date());
-					System.out.println(e.getMessage());
-					// 关闭线程池
-					executor.shutdown();
-				} finally {
-					// 关闭线程池
-					executor.shutdown();
-				}
-			});
-			// 关闭线程池
-			executor.shutdown();*/
 		}
 		this.saveOrUpdateBatch(rwShipList);
 		shipItemsService.saveOrUpdateBatch(shipItemsList);
 		return R.success("操作成功");
 	}
 
+	@Override
+	public PjShip detailProduction(PjShip ship) {
+		PjShip detail = baseMapper.selectById(ship.getId());
+		//明细
+		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);
+		detail.setShipItemsList(shipItemsList.isEmpty() ? new ArrayList<>() : shipItemsList);
+		List<ProductWorkmanshipItems> attributeItemsList = productWorkmanshipItemsService.list(new LambdaQueryWrapper<ProductWorkmanshipItems>()
+			.eq(ProductWorkmanshipItems::getTenantId, AuthUtil.getTenantId())
+			.eq(ProductWorkmanshipItems::getIsDeleted, 0)
+			.eq(ProductWorkmanshipItems::getPid, ship.getId())
+			.eq(ProductWorkmanshipItems::getType, "1"));
+		detail.setAttributeItemsList(attributeItemsList != null ? attributeItemsList : new ArrayList<>());
+		List<ProductWorkmanshipItems> craftItemsList = productWorkmanshipItemsService.list(new LambdaQueryWrapper<ProductWorkmanshipItems>()
+			.eq(ProductWorkmanshipItems::getTenantId, AuthUtil.getTenantId())
+			.eq(ProductWorkmanshipItems::getIsDeleted, 0)
+			.eq(ProductWorkmanshipItems::getPid, ship.getId())
+			.eq(ProductWorkmanshipItems::getType, "2"));
+		detail.setCraftItemsList(craftItemsList != null ? craftItemsList : new ArrayList<>());
+		return detail;
+	}
+
+	@Override
+	public R submitProduction(PjShip ship) {
+		//获得所属公司
+		R<Dept> dept = sysClient.getDept(Long.valueOf(AuthUtil.getDeptId()));
+		if (ObjectUtil.isNotEmpty(dept)) {
+			ship.setSalesCompanyId(dept.getData().getId());
+			ship.setSalesCompanyName(dept.getData().getFullName());
+		} else {
+			throw new SecurityException("请选择所属公司");
+		}
+		//库管员名称
+		if (ObjectUtils.isNotNull(ship.getStockClerkId())) {
+			if (ObjectUtils.isNull(ship.getStockClerkName())) {
+				ship.setStockClerkName(userClient.userInfoById(ship.getStockClerkId()).getData().getRealName());
+
+			}
+		}
+		if (ObjectUtils.isNotNull(ship.getStorageId())) {
+			if (ObjectUtils.isNull(ship.getStorageName())) {
+				ship.setStorageName(storageDescMapper.selectById(ship.getStorageId()).getCname());
+			}
+		}
+		if (ship.getId() == null) {
+			// 获取系统编号
+			String billNo = serialService.getBillNo(ship.getBizTypeName(), ship.getBizTypeName(), ship.getBizTypeName());
+			if (ObjectUtils.isNull(billNo)) {
+				TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+				return R.fail(500, "生成系统编号失败");
+			}
+			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.setBillno(billNo);
+			ship.setCreateTime(new Date());
+			ship.setCreateUser(AuthUtil.getUserId());
+			ship.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+			ship.setTenantId(AuthUtil.getTenantId());
+			baseMapper.insert(ship);
+		} else {
+			PjShip shipVersion = baseMapper.selectById(ship.getId());
+			if (shipVersion != null && !shipVersion.getVersion().equals(ship.getVersion())) {
+				throw new RuntimeException("数据已被修改,请返回列表重新操作!");
+			}
+			ship.setVersion(ship.getVersion() + 1);
+			ship.setUpdateUser(AuthUtil.getUserId());
+			ship.setUpdateTime(new Date());
+			baseMapper.updateById(ship);
+		}
+		// 保存订单明细
+		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());
+					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());
+				}
+				shipItemsList.add(item);
+			});
+			shipItemsService.saveOrUpdateBatch(shipItemsList);
+		} else {
+			PjShipItems pjShipItems = new PjShipItems();
+			pjShipItems.setPid(ship.getId());
+			pjShipItems.setCreateUser(AuthUtil.getUserId());
+			pjShipItems.setCreateTime(new Date());
+			pjShipItems.setSalesCompanyId(ship.getSalesCompanyId());
+			pjShipItems.setSalesCompanyName(ship.getSalesCompanyName());
+			pjShipItems.setGoodsNum(ship.getGoodsTotalNum());
+			PjGoodsDesc goodsDesc = goodsDescMapper.selectById(ship.getGoodsId());
+			if (goodsDesc != null) {
+				pjShipItems.setGoodsNo(goodsDesc.getCode());
+				pjShipItems.setGoodsName(goodsDesc.getCname());
+				pjShipItems.setGoodsId(goodsDesc.getId());
+				pjShipItems.setBrandId(goodsDesc.getBrandId());
+				pjShipItems.setBrandName(goodsDesc.getBrandName());
+				pjShipItems.setPropertyName(goodsDesc.getSpecificationAndModel());
+				pjShipItems.setPattern(goodsDesc.getBrandItem());
+				pjShipItems.setGoodsDescription(goodsDesc.getGoodsDescription());
+				pjShipItems.setUnits(goodsDesc.getUnit());
+				shipItemsService.save(pjShipItems);
+				shipItemsList.add(pjShipItems);
+			} else {
+				throw new RuntimeException("产品不存");
+			}
+		}
+		ship.setShipItemsList(shipItemsList);
+		List<ProductWorkmanshipItems> productWorkmanshipItemsList = new ArrayList<>();
+		if (CollectionUtils.isNotEmpty(ship.getAttributeItemsList())) {
+			ship.getAttributeItemsList().forEach(item -> {
+				item.setPid(ship.getId());
+				item.setType("1");
+				if (item.getId() == null) {
+					item.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+					item.setCreateTime(new Date());
+					item.setCreateUser(AuthUtil.getUserId());
+					item.setTenantId(AuthUtil.getTenantId());
+				} else {
+					item.setUpdateTime(new Date());
+					item.setUpdateUser(AuthUtil.getUserId());
+					item.setPid(ship.getId());
+				}
+			});
+			productWorkmanshipItemsList.addAll(ship.getAttributeItemsList());
+		}
+		if (CollectionUtils.isNotEmpty(ship.getCraftItemsList())) {
+			ship.getCraftItemsList().forEach(item -> {
+				item.setPid(ship.getId());
+				item.setType("2");
+				if (item.getId() == null) {
+					item.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+					item.setCreateTime(new Date());
+					item.setCreateUser(AuthUtil.getUserId());
+					item.setTenantId(AuthUtil.getTenantId());
+				} else {
+					item.setUpdateTime(new Date());
+					item.setUpdateUser(AuthUtil.getUserId());
+					item.setPid(ship.getId());
+				}
+			});
+			productWorkmanshipItemsList.addAll(ship.getCraftItemsList());
+		}
+		if (!productWorkmanshipItemsList.isEmpty()) {
+			productWorkmanshipItemsService.saveOrUpdateBatch(productWorkmanshipItemsList);
+		}
+		return R.data(ship);
+	}
+
+	@Override
+	public R completed(PjShip ship) {
+		return null;
+	}
+
+	@Override
+	public R revokeCompleted(PjShip ship) {
+		return null;
+	}
+
 }