Browse Source

2023年11月20日17:51:07

纪新园 2 years ago
parent
commit
34cc40aed8

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

@@ -54,7 +54,7 @@ public class PjShip implements Serializable {
 	 */
 	@ApiModelProperty(value = "租户id")
 	private String tenantId = AuthUtil.getTenantId();
-	;
+
 	/**
 	 * 单据编号(任务不显示,工单显示)
 	 */
@@ -318,4 +318,15 @@ public class PjShip implements Serializable {
 	 */
 	@TableField(exist = false)
 	private String date;
+
+	/**
+	 * 调入仓库id
+	 */
+	@ApiModelProperty(value = "调入仓库id")
+	private Long callInStorageId;
+	/**
+	 * 调入仓库名称
+	 */
+	@ApiModelProperty(value = "调入仓库名称")
+	private String callInStorageName;
 }

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

@@ -200,5 +200,11 @@ public class PjShipItems implements Serializable {
 	@ApiModelProperty(value = "所属公司名称")
 	private String salesCompanyName;
 
+	/**
+	 * 参考库存
+	 */
+	@ApiModelProperty(value = "参考库存")
+	private BigDecimal inventory;
+
 
 }

+ 17 - 0
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/excel/PjShipStockDetails.java

@@ -77,6 +77,18 @@ public class PjShipStockDetails implements Serializable {
 	private BigDecimal SubSendTotalNum;
 
 	/**
+	 * 调拨
+	 */
+	@ApiModelProperty(value = "调拨")
+	private BigDecimal transferAllocateNum;
+
+	/**
+	 * 原库存
+	 */
+	@ApiModelProperty(value = "原库存")
+	private BigDecimal totalNum;
+
+	/**
 	 * 业务日期
 	 */
 	@ApiModelProperty(value = "业务日期")
@@ -101,6 +113,11 @@ public class PjShipStockDetails implements Serializable {
 	private Long storageId;
 
 	/**
+	 * 调入仓库id
+	 */
+	private Long callInStorageId;
+
+	/**
 	 * 所属公司
 	 */
 	private String salesCompanyId;

+ 1 - 1
blade-service/blade-deliver-goods/src/main/java/org/springblade/deliver/goods/service/impl/DeliveryItemsServiceImpl.java

@@ -347,7 +347,7 @@ public class DeliveryItemsServiceImpl extends ServiceImpl<DeliveryItemsMapper, D
 				deliveryItemsList1.add(deliveryItems);
 //				baseMapper.updateById(deliveryItems);
 			}
-			for (DeliveryItems deliveryItems : reducelList) {
+			for (DeliveryItems deliveryItems : collect) {
 				// todo 更新订单明细中发货数量  采购和销售可能需要调不同接口
 				R actualQuantity = orderItemsClient.updateActualQuantity(deliveryItems.getSrcId(), deliveryItems.getArrivalQuantity(), delivery.getDeliveryType());
 				if (!actualQuantity.isSuccess()) {

+ 12 - 0
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/controller/BillsController.java

@@ -72,6 +72,18 @@ public class BillsController extends BladeController {
 	@ApiOperation(value = "分页", notes = "传入bills")
 	public R<IPage<Bills>> list(Bills bills, Query query) {
 		LambdaQueryWrapper<Bills> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.select(Bills::getId, Bills::getBillNo, Bills::getBillType, Bills::getMasterBillNo,
+			Bills::getCorpCnName, Bills::getCorpId, Bills::getCorpEnName, Bills::getVesselCnName,
+			Bills::getVesselId, Bills::getVoyageNo, Bills::getMblno, Bills::getHblno, Bills::getEta, Bills::getEtd,
+			Bills::getPolCnName, Bills::getPolId, Bills::getPodCnName, Bills::getPodId, Bills::getLoadType, Bills::getPlaceReceiptName,
+			Bills::getCargoType, Bills::getMarks, Bills::getQuantity, Bills::getGrossWeight, Bills::getNetWeight,
+			Bills::getMeasurement, Bills::getQuantityV20, Bills::getQuantityV40, Bills::getQuantityV40hc, Bills::getQuantityV45,
+			Bills::getQuantityV48, Bills::getIsNeedLand, Bills::getIsNeedDeclare, Bills::getIsNeedIq, Bills::getAmountDr,
+			Bills::getAmountCr, Bills::getAmountProfit, Bills::getAmountDrUsd, Bills::getAmountCrUsd, Bills::getAmountProfitUsd,
+			Bills::getAmountDrLoc, Bills::getAmountCrLoc, Bills::getAmountProfitLoc, Bills::getCheckCrStatusDescr, Bills::getCheckDrStatusDescr,
+			Bills::getStlCrStatusDescr, Bills::getStlDrStatusDescr, Bills::getInvoiceCrStatusDescr, Bills::getInvoiceDrStatusDescr, Bills::getCreateUserName,
+			Bills::getCreateTime, Bills::getUpdateUserName, Bills::getUpdateTime, Bills::getStatus, Bills::getBillStatus,
+			Bills::getAccountStatus, Bills::getRemarks);
 		lambdaQueryWrapper.eq(Bills::getIsDeleted, 0)
 			.eq(Bills::getTenantId, AuthUtil.getTenantId())
 			.and(i -> i.isNull(Bills::getMasterId).or()

+ 66 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/goods/controller/GoodsDescController.java

@@ -49,6 +49,7 @@ import org.springblade.salesPart.goods.service.IGoodsFilesService;
 import org.springblade.salesPart.goods.service.IGoodsTypeService;
 import org.springblade.salesPart.order.service.IOrderItemsService;
 import org.springblade.salesPart.productLaunch.service.IProductLaunchService;
+import org.springblade.salesPart.stock.service.IStockDescService;
 import org.springblade.salesPart.vo.GoodsDescVO;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
@@ -80,6 +81,7 @@ public class GoodsDescController extends BladeController {
 	private final IOrderItemsService orderItemsService;
 	private final IGoodsFilesService goodsFilesService;
 	private final IBrandFilesService brandFilesService;
+	private final IStockDescService stockDescService;
 
 	/**
 	 * 详情
@@ -489,6 +491,70 @@ public class GoodsDescController extends BladeController {
 	}
 
 	/**
+	 * 商品下拉 配件批发商品表(调拨)
+	 */
+	@GetMapping("/goodsPageDB")
+	@ApiOperationSupport(order = 12)
+	@ApiOperation(value = "商品下拉", notes = "传入goods")
+	public R<IPage<PjGoodsDesc>> goodsPageDB(PjGoodsDesc goods, Query query) {
+		LambdaQueryWrapper<PjStockDesc> queryWrapper = new LambdaQueryWrapper<PjStockDesc>()
+			.eq(PjStockDesc::getIsDeleted, 0)
+			.ne(PjStockDesc::getBalanceQuantity, 0);
+		queryWrapper.apply("find_in_set(sales_company_id,'" + AuthUtil.getDeptId() + "')");
+		List<PjStockDesc> pjProductLaunchList = stockDescService.list(queryWrapper);
+		List<Long> ids = pjProductLaunchList.stream().map(PjStockDesc::getGoodsId).distinct().collect(Collectors.toList());
+		LambdaQueryWrapper<PjGoodsDesc> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(PjGoodsDesc::getTenantId, AuthUtil.getTenantId())
+			.eq(PjGoodsDesc::getIsDeleted, 0)
+			.eq(ObjectUtils.isNotNull(goods.getEnableOrNot()), PjGoodsDesc::getEnableOrNot, goods.getEnableOrNot())
+			.eq(ObjectUtils.isNotNull(goods.getBrandId()), PjGoodsDesc::getBrandId, goods.getBrandId())
+			.eq(ObjectUtils.isNotNull(goods.getSpecificationAndModel()), PjGoodsDesc::getSpecificationAndModel, goods.getSpecificationAndModel())
+			.eq(ObjectUtils.isNotNull(goods.getBrandItem()), PjGoodsDesc::getBrandItem, goods.getBrandItem())
+			.eq(ObjectUtils.isNotNull(goods.getExplosionProof()), PjGoodsDesc::getExplosionProof, goods.getExplosionProof())
+			.eq(ObjectUtils.isNotNull(goods.getOriginalFactory()), PjGoodsDesc::getOriginalFactory, goods.getOriginalFactory())
+			.eq(ObjectUtils.isNotNull(goods.getSelfRecovery()), PjGoodsDesc::getSelfRecovery, goods.getSelfRecovery())
+		;
+		if (ObjectUtil.isNotEmpty(goods.getCname())) {//商品名称
+			lambdaQueryWrapper.and(i -> i.like(PjGoodsDesc::getCname, goods.getCname()).or().like(PjGoodsDesc::getCnameInt, goods.getCname()));
+		}
+		//指定分类为一级分类,查询此分类所有二级分类的商品
+		if (StringUtils.isNotBlank(goods.getGoodsTypeId())) {
+			Long goodsId = Long.parseLong(goods.getGoodsTypeId());
+			List<Long> goodsIdList = new ArrayList<>();
+			selectChildById(goodsId, goodsIdList);
+			goodsIdList.add(goodsId);
+
+			lambdaQueryWrapper.in(PjGoodsDesc::getGoodsTypeId, goodsIdList);
+		}
+		if (ObjectUtils.isNotNull(ids) && ids.size() > 0) {
+			lambdaQueryWrapper.in(PjGoodsDesc::getId, ids);
+		} else {
+			return R.data(new Page<>());
+		}
+		IPage<PjGoodsDesc> list = goodsDescService.page(Condition.getPage(query), lambdaQueryWrapper);
+		for (PjGoodsDesc item : list.getRecords()) {
+			if (pjProductLaunchList.size() > 0) {
+				PjStockDesc pjProductLaunch = pjProductLaunchList.stream().filter(e -> e.getGoodsId().equals(item.getId())).findFirst().orElse(new PjStockDesc());
+				item.setSharedCompanyId(pjProductLaunch.getSalesCompanyId());
+				item.setSharedCompanyName(pjProductLaunch.getSalesCompanyName());
+				item.setInventory(pjProductLaunch.getBalanceQuantity());
+				item.setPrice(pjProductLaunch.getInventoryCostPrice());
+			}
+			String typeId = item.getGoodsTypeId();
+			String[] split = typeId.split(",");
+			List<String> stringList = Arrays.asList(split);
+			LambdaQueryWrapper<PjGoodsType> goodsTypeLambdaQueryWrapper = new LambdaQueryWrapper<>();
+			goodsTypeLambdaQueryWrapper.in(PjGoodsType::getId, stringList);
+			List<PjGoodsType> types = goodsDescType.list(goodsTypeLambdaQueryWrapper);
+			if (CollectionUtils.isNotEmpty(types)) {
+				List<String> typeStr = types.stream().map(PjGoodsType::getCname).collect(Collectors.toList());
+				item.setGoodsTypeName(typeStr.toString().replace("[", "").replace("]", ""));
+			}
+		}
+		return R.data(list);
+	}
+
+	/**
 	 * 递归查询ID
 	 */
 	private void selectChildById(Long id, List<Long> idList) {

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

@@ -0,0 +1,181 @@
+/*
+ *      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.excel.util.ExcelUtil;
+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.BeanUtil;
+import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.salesPart.entity.PjOrder;
+import org.springblade.salesPart.entity.PjOrderItems;
+import org.springblade.salesPart.entity.PjShip;
+import org.springblade.salesPart.entity.PjShipItems;
+import org.springblade.salesPart.excel.PjOrderExportExcelXS;
+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.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * 配件调拨表 控制器
+ *
+ * @author BladeX
+ * @since 2023-04-21
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/transferAllocate")
+@Api(value = "配件调拨表", tags = "配件调拨表接口")
+public class TransferAllocateController extends BladeController {
+
+	private final IShipService shipService;
+	private final IShipItemsService shipItemsService;
+	private final IUserClient userClient;
+
+	/**
+	 * 分页 配件调拨
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入order")
+	public R<IPage<PjShip>> list(PjShip ship, Query query) {
+		if (ObjectUtil.isEmpty(ship.getBizTypeName())) {
+			throw new RuntimeException("缺少必要参数");
+		}
+		LambdaQueryWrapper<PjShip> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(PjShip::getTenantId, AuthUtil.getTenantId())
+			.eq(PjShip::getIsDeleted, 0)
+			.eq(PjShip::getSalesCompanyId, AuthUtil.getDeptId())//公司
+			.like(ObjectUtil.isNotEmpty(ship.getBillno()), PjShip::getBillno, ship.getBillno())//销售订单
+			.eq(ObjectUtil.isNotEmpty(ship.getStorageId()), PjShip::getStorageId, ship.getStorageId())//仓库
+			.eq(ObjectUtil.isNotEmpty(ship.getCallInStorageId()), PjShip::getCallInStorageId, ship.getCallInStorageId())//仓库
+			.like(ObjectUtil.isNotEmpty(ship.getStorageName()), PjShip::getStorageName, ship.getStorageName())
+			.like(ObjectUtil.isNotEmpty(ship.getCallInStorageName()), PjShip::getCallInStorageName, ship.getCallInStorageName())
+			.eq(ObjectUtil.isNotEmpty(ship.getCustomerId()), PjShip::getCustomerId, ship.getCustomerId())//客户
+			.eq(ObjectUtil.isNotEmpty(ship.getSourceCompanyId()), PjShip::getSourceCompanyId, ship.getSourceCompanyId())//来源公司
+			.eq(ObjectUtil.isNotEmpty(ship.getStatusName()), PjShip::getStatusName, ship.getStatusName())//状态
+			.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));
+		}
+		lambdaQueryWrapper.orderByDesc(PjShip::getCreateTime);
+		IPage<PjShip> pages = shipService.page(Condition.getPage(query), lambdaQueryWrapper);
+
+		String updateUserIds = "";//修改人id拼接
+		String createUserIds = "";//创建人id拼接
+		for (PjShip items : pages.getRecords()) {
+			if (ObjectUtil.isNotEmpty(items.getUpdateUser())) {
+				updateUserIds = updateUserIds + items.getUpdateUser() + ",";
+			}
+			if (ObjectUtil.isNotEmpty(items.getCreateUser())) {
+				createUserIds = createUserIds + items.getCreateUser() + ",";
+			}
+		}
+
+		//获得修改人信息
+		List<User> updateUserList = userClient.selectUserIds(updateUserIds);
+		//获得创建人信息
+		List<User> createUserList = userClient.selectUserIds(createUserIds);
+
+		if (CollectionUtils.isNotEmpty(pages.getRecords())) {
+			pages.getRecords().forEach(item -> {
+				if (ObjectUtil.isNotEmpty(updateUserList)) {
+					User user = updateUserList.stream().anyMatch(e -> e.getId().equals(item.getUpdateUser())) ? updateUserList.stream().filter(e -> e.getId().equals(item.getUpdateUser())).findFirst().get() : null;
+					if (ObjectUtils.isNotNull(user)) {
+						item.setUpdateUserName(user.getName());
+					}
+				}
+
+				if (ObjectUtil.isNotEmpty(createUserList)) {
+					User user = createUserList.stream().anyMatch(e -> e.getId().equals(item.getCreateUser())) ? createUserList.stream().filter(e -> e.getId().equals(item.getCreateUser())).findFirst().get() : null;
+					if (ObjectUtils.isNotNull(user)) {
+						item.setCreateUserName(user.getName());
+					}
+				}
+				item.setItem(shipItemsService.count(new LambdaQueryWrapper<PjShipItems>().eq(PjShipItems::getIsDeleted, 0).eq(PjShipItems::getPid, item.getId())) + "");
+			});
+		}
+
+		return R.data(pages);
+	}
+
+	/**
+	 * 配件调拨新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入order")
+	@RepeatSubmit
+	public R submit(@Valid @RequestBody PjShip order) {
+		if (StringUtils.isBlank(order.getBizTypeName())) {
+			throw new RuntimeException("缺少必要参数");
+		}
+		return shipService.submitTransferAllocate(order);
+	}
+
+	/**
+	 * 确认调拨
+	 */
+	@PostMapping("/confirmTransferAllocate")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "确认调拨", notes = "传入order")
+	@RepeatSubmit
+	public R generateShipTask(@Valid @RequestBody PjShip order) {
+		if (order.getId() == null) {
+			throw new RuntimeException("来源信息错误");
+		}
+		return shipService.confirmTransferAllocate(order);
+	}
+
+	/**
+	 * 撤销调拨
+	 */
+	@PostMapping("/revokeTransferAllocate")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "撤销调拨", notes = "传入order")
+	@RepeatSubmit
+	public R revokeGenerateShipTask(@Valid @RequestBody PjShip order) {
+		if (order.getId() == null) {
+			throw new RuntimeException("来源信息错误");
+		}
+		return shipService.revokeTransferAllocate(order);
+	}
+}

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

@@ -33,7 +33,6 @@ 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.PjOrder;
 import org.springblade.salesPart.entity.PjOrderItems;
 import org.springblade.salesPart.entity.PjShip;
 import org.springblade.salesPart.entity.PjShipItems;
@@ -42,7 +41,6 @@ import org.springblade.salesPart.excel.PjShipStockDetails;
 import org.springblade.salesPart.excel.ShipItemImportExcel;
 import org.springblade.salesPart.ship.service.IShipItemsService;
 import org.springblade.salesPart.ship.service.IShipService;
-import org.springblade.salesPart.vo.OrderVO;
 import org.springblade.salesPart.vo.ShipVO;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
@@ -385,6 +383,18 @@ public class ShipController extends BladeController {
 		pjShipStockDetails.setSalesCompanyId(AuthUtil.getDeptId());
 		pjShipStockDetails.setTenantId(AuthUtil.getTenantId());
 		List<PjShipStockDetails> pages = shipService.stockDataDetails(pjShipStockDetails);
+		for (PjShipStockDetails item : pages) {
+			if ("调拨".equals(item.getBizTypeName())) {
+				if (item.getStorageId().equals(pjShipStockDetails.getStorageId())) {
+					item.setBizTypeName("调出");
+					item.setSubSendTotalNum(item.getTransferAllocateNum());
+				}
+				if (item.getCallInStorageId().equals(pjShipStockDetails.getStorageId())) {
+					item.setBizTypeName("调入");
+					item.setAddSendTotalNum(item.getTransferAllocateNum());
+				}
+			}
+		}
 		return R.data(pages);
 	}
 

+ 59 - 44
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/mapper/ShipMapper.xml

@@ -33,57 +33,72 @@
         <result column="busines_date" property="businesDate"/>
     </resultMap>
     <delete id="deleteByTaskId">
-        update pjpf_ship set is_deleted = 1 where task_id = #{taskId}
+        update pjpf_ship
+        set is_deleted = 1
+        where task_id = #{taskId}
     </delete>
 
 
     <select id="selectShipPage" resultMap="shipResultMap">
-        select * from pjpf_ship where is_deleted = 0
+        select *
+        from pjpf_ship
+        where is_deleted = 0
     </select>
     <select id="stockDataDetails" resultType="org.springblade.salesPart.excel.PjShipStockDetails">
         SELECT
-            ps.id as id,
-            ps.billno AS billno,
-            ps.customer_name AS corpName,
-            ps.status_name AS statusName,
-            ps.update_time AS updateTime,
-            pgd.brand_item AS brandItem,
-            pgd.cname AS goodsName,
-            pgd.specification_and_model AS specificationAndModel,
-            CASE
-                ps.biz_type_name
-                WHEN 'FHGD' THEN
-                    '出库'
-                WHEN 'SHGD' THEN
-                    '入库'
-                WHEN 'TKSHGD' THEN
-                    '入库'
-                END AS bizTypeName,
-            CASE
-                ps.biz_type_name
-                WHEN 'FHGD' THEN
-                    IF
-                        ( SUM( psi.send_num ), SUM( psi.send_num ), 0 ) ELSE 0
-                END AS SubSendTotalNum,
-            CASE
-                ps.biz_type_name
-                WHEN 'SHGD' THEN
-                    IF
-                        ( SUM( psi.send_num ), SUM( psi.send_num ), 0 )
-                WHEN 'TKSHGD' THEN
-                    IF
-                        ( SUM( psi.send_num ), SUM( psi.send_num ), 0 ) ELSE 0
-                END AS addSendTotalNum
+        ps.id as id,
+        ps.storage_id as storageId,
+        ps.call_in_storage_id as callInStorageId,
+        ps.billno AS billno,
+        ps.customer_name AS corpName,
+        ps.status_name AS statusName,
+        ps.update_time AS updateTime,
+        pgd.brand_item AS brandItem,
+        pgd.cname AS goodsName,
+        pgd.specification_and_model AS specificationAndModel,
+        psi.inventory as totalNum,
+        CASE
+        ps.biz_type_name
+        WHEN 'FHGD' THEN
+        '出库'
+        WHEN 'SHGD' THEN
+        '入库'
+        WHEN 'TKSHGD' THEN
+        '入库'
+        WHEN 'DBGD' THEN
+        '调拨'
+        END AS bizTypeName,
+        CASE
+        ps.biz_type_name
+        WHEN 'FHGD' THEN
+        IF
+        ( SUM( psi.send_num ), SUM( psi.send_num ), 0 ) ELSE 0
+        END AS SubSendTotalNum,
+        CASE
+        ps.biz_type_name
+        WHEN 'DBGD' THEN
+        IF
+        ( SUM( psi.send_num ), SUM( psi.send_num ), 0 ) ELSE 0
+        END AS transferAllocateNum,
+        CASE
+        ps.biz_type_name
+        WHEN 'SHGD' THEN
+        IF
+        ( SUM( psi.send_num ), SUM( psi.send_num ), 0 )
+        WHEN 'TKSHGD' THEN
+        IF
+        ( SUM( psi.send_num ), SUM( psi.send_num ), 0 ) ELSE 0
+        END AS addSendTotalNum
         FROM
-            pjpf_ship_items psi
-            LEFT JOIN pjpf_ship ps ON ps.id = psi.pid
-            LEFT JOIN pjpf_goods_desc pgd ON pgd.id = psi.goods_id
+        pjpf_ship_items psi
+        LEFT JOIN pjpf_ship ps ON ps.id = psi.pid
+        LEFT JOIN pjpf_goods_desc pgd ON pgd.id = psi.goods_id
         WHERE
-             ps.is_deleted = '0'
-            and psi.is_deleted = '0'
-        AND FIND_IN_SET( ps.biz_type_name, 'FHGD,SHGD,TKSHGD' )
-            AND ps.tenant_id = #{order.tenantId}
-          AND FIND_IN_SET( ps.status_name, '已入库,已出库' )
+        ps.is_deleted = '0'
+        and psi.is_deleted = '0'
+        AND FIND_IN_SET( ps.biz_type_name, 'FHGD,SHGD,TKSHGD,DBGD' )
+        AND ps.tenant_id = #{order.tenantId}
+        AND FIND_IN_SET( ps.status_name, '已入库,已出库,确认调拨' )
         <if test="order.dot!=null and order.dot!=''">
             and psi.dot = #{order.dot}
         </if>
@@ -91,7 +106,7 @@
             and psi.dot is null
         </if>
         <if test="order.storageId!=null">
-            and ps.storage_id = #{order.storageId}
+            and (ps.storage_id = #{order.storageId} or ps.call_in_storage_id = #{order.storageId})
         </if>
         <if test="order.goodsId!=null">
             and psi.goods_id = #{order.goodsId}
@@ -118,7 +133,7 @@
             and po.busines_date &lt;= #{order.businesDateList[1]}
         </if>
         GROUP BY
-            ps.billno
+        ps.billno
         ORDER BY ps.busines_date asc
     </select>
 

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

@@ -137,4 +137,25 @@ public interface IShipService extends IService<PjShip> {
 	 * @return
 	 */
     R shipments(PjShip pjShip);
+
+	/**
+	 * 配件调拨新增或修改
+	 * @param order
+	 * @return
+	 */
+	R submitTransferAllocate(PjShip order);
+
+	/**
+	 * 确认调拨
+	 * @param order
+	 * @return
+	 */
+	R confirmTransferAllocate(PjShip order);
+
+	/**
+	 * 撤销调拨
+	 * @param order
+	 * @return
+	 */
+	R revokeTransferAllocate(PjShip order);
 }

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

@@ -34,6 +34,7 @@ import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
 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.excel.PjShipStockDetails;
@@ -95,6 +96,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 	private final ISysClient sysClient;
 	private final IStockDescService iStockDescService;
 	private final GoodsDescMapper goodsDescMapper;
+	private final CorpsDescMapper corpsDescMapper;
 	private final GoodsTypeMapper goodsTypeMapper;
 	private final IProductLaunchService productLaunchService;
 	private final HistoryMapper historyMapper;
@@ -1484,4 +1486,263 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 		history.setOperateStatus(status);
 		historyMapper.insert(history);
 	}
+
+	@Override
+	public R submitTransferAllocate(PjShip order) {
+		// 获取系统编号
+		R billNo = serialClient.getBillNo(order.getBizTypeName(), order.getBizTypeName(), order.getBizTypeName());
+		if (billNo.getCode() != 200) {
+			TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+			return R.fail(500, "生成系统编号失败");
+		}
+		//仓库名称
+		if (ObjectUtils.isNotNull(order.getStorageId())) {
+			order.setStorageName(storageDescMapper.selectById(order.getStorageId()).getCname());
+		}
+		//仓库名称
+		if (ObjectUtils.isNotNull(order.getCallInStorageId())) {
+			order.setCallInStorageName(storageDescMapper.selectById(order.getCallInStorageId()).getCname());
+		}
+		if (order.getId() == null) {
+			order.setBillno((String) billNo.getData());
+			order.setCreateTime(new Date());
+			order.setCreateUser(AuthUtil.getUserId());
+			order.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+			order.setTenantId(AuthUtil.getTenantId());
+			order.setStatusName(OrderTypeEnum.XSLR.getType());
+			//所属公司
+			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("未维护所属公司");
+			}
+			baseMapper.insert(order);
+		} else {
+			order.setUpdateUser(AuthUtil.getUserId());
+			order.setUpdateTime(new Date());
+			baseMapper.updateById(order);
+		}
+		// 保存订单明细
+		if (CollectionUtils.isNotEmpty(order.getShipItemsList())) {
+			order.getShipItemsList().forEach(item -> {
+				//计算小计
+				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());
+				}
+			});
+			shipItemsService.saveOrUpdateBatch(order.getShipItemsList());
+			order.setNumberRows(order.getShipItemsList().size());//行数
+			//明细总数量
+			order.setGoodsTotalNum(order.getShipItemsList().stream().filter(e -> e.getGoodsNum() != null).map(PjShipItems::getGoodsNum).reduce(BigDecimal.ZERO, BigDecimal::add));
+		}
+		baseMapper.updateById(order);
+		return R.data(order);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
+	public R confirmTransferAllocate(PjShip order) {
+		if (order.getId() == null) {
+			throw new RuntimeException("缺少必要参数");
+		}
+		PjShip detail = baseMapper.selectById(order.getId());
+		if (CollectionUtils.isNotEmpty(order.getShipItemsList())) {
+			List<PjStockDesc> pjStockDescArrayList = new ArrayList<>();
+			List<PjStockDesc> pjStockDescList = new ArrayList<>();
+			for (PjShipItems orderItems : order.getShipItemsList()) {
+				//获得商品
+				PjGoodsDesc goodsDesc = goodsDescMapper.selectById(orderItems.getGoodsId());
+				if (ObjectUtil.isEmpty(goodsDesc)) {
+					throw new RuntimeException("商品数据异常");
+				}
+				if ("1".equals(goodsDesc.getWhether()) && ObjectUtils.isNull(orderItems.getDot())) {
+					throw new RuntimeException("商品:" + goodsDesc.getCname() + ",请求选择批次号");
+				}
+				//调拨出库
+				LambdaQueryWrapper<PjStockDesc> lambdaQueryWrapperC = new LambdaQueryWrapper<>();
+				lambdaQueryWrapperC.eq(PjStockDesc::getTenantId, AuthUtil.getTenantId())
+					.eq(PjStockDesc::getIsDeleted, 0)
+					.eq(PjStockDesc::getSalesCompanyId, detail.getSalesCompanyId())
+					.eq(PjStockDesc::getGoodsId, orderItems.getGoodsId())
+					.eq(PjStockDesc::getStorageId, detail.getStorageId());
+				//管理批次号
+				if (ObjectUtil.isNotEmpty(goodsDesc.getWhether()) && "1".equals(goodsDesc.getWhether())) {
+					lambdaQueryWrapperC.eq(PjStockDesc::getDot, orderItems.getDot());
+				} else {
+					lambdaQueryWrapperC.and(i -> i.eq(PjStockDesc::getDot, "").or().isNull(PjStockDesc::getDot));
+				}
+
+				PjStockDesc stockOneC = iStockDescService.getOne(lambdaQueryWrapperC);
+				if (ObjectUtil.isNotEmpty(stockOneC)) {
+					stockOneC.setBalanceQuantity(stockOneC.getBalanceQuantity().subtract(orderItems.getGoodsNum()));
+					stockOneC.setStoreInventory(stockOneC.getBalanceQuantity());
+					stockOneC.setInventoryAmount(stockOneC.getInventoryAmount().subtract(orderItems.getGoodsNum()
+						.multiply(stockOneC.getInventoryCostPrice())));
+					stockOneC.setVersion(stockOneC.getVersion());
+					pjStockDescArrayList.add(stockOneC);
+				} else {
+					throw new RuntimeException("未查到库存账");
+				}
+				//调拨入库
+				LambdaQueryWrapper<PjStockDesc> lambdaQueryWrapperR = new LambdaQueryWrapper<>();
+				lambdaQueryWrapperR.eq(PjStockDesc::getTenantId, AuthUtil.getTenantId())
+					.eq(PjStockDesc::getIsDeleted, 0)
+					.eq(PjStockDesc::getSalesCompanyId, detail.getSalesCompanyId())
+					.eq(PjStockDesc::getGoodsId, orderItems.getGoodsId())
+					.eq(PjStockDesc::getStorageId, detail.getCallInStorageId());
+				//管理批次号
+				if (ObjectUtil.isNotEmpty(goodsDesc.getWhether()) && "1".equals(goodsDesc.getWhether())) {
+					lambdaQueryWrapperR.eq(PjStockDesc::getDot, orderItems.getDot());
+				} else {
+					lambdaQueryWrapperR.and(i -> i.eq(PjStockDesc::getDot, "").or().isNull(PjStockDesc::getDot));
+				}
+
+				PjStockDesc stockOneR = iStockDescService.getOne(lambdaQueryWrapperR);
+				if (ObjectUtil.isNotEmpty(stockOneR)) {
+					stockOneR.setBalanceQuantity(stockOneR.getBalanceQuantity().add(orderItems.getGoodsNum()));
+					stockOneR.setStoreInventory(stockOneR.getBalanceQuantity());
+					stockOneR.setInventoryAmount(stockOneR.getInventoryAmount().add(orderItems.getGoodsNum()
+						.multiply(stockOneR.getInventoryCostPrice())));
+					stockOneR.setInventoryCostPrice(stockOneR.getInventoryAmount().divide(stockOneR.getBalanceQuantity(), 2, RoundingMode.HALF_UP));
+					stockOneR.setVersion(stockOneR.getVersion());
+					pjStockDescArrayList.add(stockOneR);
+				} else {
+					PjStockDesc stockDesc = new PjStockDesc();
+					stockDesc.setStorageId(detail.getCallInStorageId());
+					stockDesc.setStorageName(detail.getCallInStorageName());
+					stockDesc.setGoodsId(orderItems.getGoodsId());
+					stockDesc.setCode(goodsDesc.getCode());
+					stockDesc.setCname(goodsDesc.getCname());
+					stockDesc.setBrandId(goodsDesc.getBrandId());
+					stockDesc.setBrandName(goodsDesc.getBrandName());
+					stockDesc.setTypeno(goodsDesc.getSpecificationAndModel());
+					stockDesc.setBrandItem(goodsDesc.getBrandItem());
+					stockDesc.setProductDescription(goodsDesc.getGoodsDescription());
+					stockDesc.setGoodsTypeId(goodsDesc.getGoodsTypeId());
+					stockDesc.setGoodsTypeName(goodsDesc.getGoodsTypeName());
+					stockDesc.setBalanceQuantity(orderItems.getGoodsNum());
+					stockDesc.setStoreInventory(orderItems.getGoodsNum());
+					stockDesc.setInventoryAmount(orderItems.getSubTotalMoney());
+					stockDesc.setInventoryCostPrice(orderItems.getPrice());
+					stockDesc.setSalesCompanyId(detail.getSalesCompanyId());
+					stockDesc.setSalesCompanyName(detail.getSalesCompanyName());
+					stockDesc.setDot(orderItems.getDot());
+					stockDesc.setCreateDept(detail.getCreateDept());
+					stockDesc.setCreateUser(AuthUtil.getUserId());
+					stockDesc.setCreateTime(new Date());
+					stockDesc.setTenantId(AuthUtil.getTenantId());
+					pjStockDescList.add(stockDesc);
+				}
+			}
+			R res = iStockDescService.updateBatchByIdNew(pjStockDescArrayList);
+			if (!res.isSuccess()) {
+				throw new RuntimeException(res.getMsg());
+			}
+			if (pjStockDescList.size() > 0) {
+				iStockDescService.saveOrUpdateBatch(pjStockDescList);
+			}
+		}
+		detail.setStatusName("确认调拨");
+		baseMapper.updateById(detail);
+		return R.data(detail);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
+	public R revokeTransferAllocate(PjShip order) {
+		if (order.getId() == null) {
+			throw new RuntimeException("缺少必要参数");
+		}
+		PjShip detail = baseMapper.selectById(order.getId());
+		if (CollectionUtils.isNotEmpty(order.getShipItemsList())) {
+			List<PjStockDesc> pjStockDescArrayList = new ArrayList<>();
+			for (PjShipItems orderItems : order.getShipItemsList()) {
+				//获得商品
+				PjGoodsDesc goodsDesc = goodsDescMapper.selectById(orderItems.getGoodsId());
+				if (ObjectUtil.isEmpty(goodsDesc)) {
+					throw new RuntimeException("商品数据异常");
+				}
+				if ("1".equals(goodsDesc.getWhether()) && ObjectUtils.isNull(orderItems.getDot())) {
+					throw new RuntimeException("商品:" + goodsDesc.getCname() + ",请求选择批次号");
+				}
+				//调拨出库
+				LambdaQueryWrapper<PjStockDesc> lambdaQueryWrapperC = new LambdaQueryWrapper<>();
+				lambdaQueryWrapperC.eq(PjStockDesc::getTenantId, AuthUtil.getTenantId())
+					.eq(PjStockDesc::getIsDeleted, 0)
+					.eq(PjStockDesc::getSalesCompanyId, detail.getSalesCompanyId())
+					.eq(PjStockDesc::getGoodsId, orderItems.getGoodsId())
+					.eq(PjStockDesc::getStorageId, detail.getStorageId());
+				//管理批次号
+				if (ObjectUtil.isNotEmpty(goodsDesc.getWhether()) && "1".equals(goodsDesc.getWhether())) {
+					lambdaQueryWrapperC.eq(PjStockDesc::getDot, orderItems.getDot());
+				} else {
+					lambdaQueryWrapperC.and(i -> i.eq(PjStockDesc::getDot, "").or().isNull(PjStockDesc::getDot));
+				}
+
+				PjStockDesc stockOneC = iStockDescService.getOne(lambdaQueryWrapperC);
+				if (ObjectUtil.isNotEmpty(stockOneC)) {
+					stockOneC.setBalanceQuantity(stockOneC.getBalanceQuantity().add(orderItems.getGoodsNum()));
+					stockOneC.setStoreInventory(stockOneC.getBalanceQuantity());
+					stockOneC.setInventoryAmount(stockOneC.getInventoryAmount().add(orderItems.getGoodsNum()
+						.multiply(stockOneC.getInventoryCostPrice())));
+					stockOneC.setVersion(stockOneC.getVersion());
+					pjStockDescArrayList.add(stockOneC);
+				} else {
+					throw new RuntimeException("未查到库存账");
+				}
+				//调拨入库
+				LambdaQueryWrapper<PjStockDesc> lambdaQueryWrapperR = new LambdaQueryWrapper<>();
+				lambdaQueryWrapperR.eq(PjStockDesc::getTenantId, AuthUtil.getTenantId())
+					.eq(PjStockDesc::getIsDeleted, 0)
+					.eq(PjStockDesc::getSalesCompanyId, detail.getSalesCompanyId())
+					.eq(PjStockDesc::getGoodsId, orderItems.getGoodsId())
+					.eq(PjStockDesc::getStorageId, detail.getCallInStorageId());
+				//管理批次号
+				if (ObjectUtil.isNotEmpty(goodsDesc.getWhether()) && "1".equals(goodsDesc.getWhether())) {
+					lambdaQueryWrapperR.eq(PjStockDesc::getDot, orderItems.getDot());
+				} else {
+					lambdaQueryWrapperR.and(i -> i.eq(PjStockDesc::getDot, "").or().isNull(PjStockDesc::getDot));
+				}
+
+				PjStockDesc stockOneR = iStockDescService.getOne(lambdaQueryWrapperR);
+				if (ObjectUtil.isNotEmpty(stockOneR)) {
+					stockOneR.setBalanceQuantity(stockOneR.getBalanceQuantity().subtract(orderItems.getGoodsNum()));
+					stockOneR.setStoreInventory(stockOneR.getBalanceQuantity());
+					stockOneR.setInventoryAmount(stockOneR.getInventoryAmount().subtract(orderItems.getGoodsNum()
+						.multiply(stockOneR.getInventoryCostPrice())));
+					if (stockOneR.getInventoryAmount().compareTo(new BigDecimal("0.00")) == 0 ||
+						stockOneR.getBalanceQuantity().compareTo(new BigDecimal("0.00")) == 0){
+						stockOneR.setInventoryCostPrice(new BigDecimal("0.00"));
+					}else{
+						stockOneR.setInventoryCostPrice(stockOneR.getInventoryAmount().divide(stockOneR.getBalanceQuantity(), 2, RoundingMode.HALF_UP));
+					}
+					stockOneR.setDot("");
+					stockOneR.setVersion(stockOneR.getVersion());
+					pjStockDescArrayList.add(stockOneR);
+				} else {
+					throw new RuntimeException("未查到库存账");
+				}
+			}
+			R res = iStockDescService.updateBatchByIdNew(pjStockDescArrayList);
+			if (!res.isSuccess()) {
+				throw new RuntimeException(res.getMsg());
+			}
+		}
+		detail.setStatusName("录入");
+		baseMapper.updateById(detail);
+		return R.data(detail);
+	}
+
 }

+ 38 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/stock/controller/StockDescController.java

@@ -131,6 +131,44 @@ public class StockDescController extends BladeController {
 		return R.data(pages);
 	}
 
+	/**
+	 * 分页 配件批发库存表
+	 */
+	@GetMapping("/webList")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入stockDesc")
+	public R<IPage<PjStockDesc>> webList(PjStockDesc stockDesc, Query query) {
+		LambdaQueryWrapper<PjStockDesc> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(PjStockDesc::getTenantId, AuthUtil.getTenantId())
+			.eq(PjStockDesc::getIsDeleted, 0)
+			.eq(PjStockDesc::getSalesCompanyId, AuthUtil.getDeptId())//公司
+			.like(ObjectUtil.isNotEmpty(stockDesc.getCode()), PjStockDesc::getCode, stockDesc.getCode())
+			.like(ObjectUtil.isNotEmpty(stockDesc.getTypeno()), PjStockDesc::getTypeno, stockDesc.getTypeno())
+			.eq(ObjectUtil.isNotEmpty(stockDesc.getStorageId()), PjStockDesc::getStorageId, stockDesc.getStorageId())
+			.eq(ObjectUtil.isNotEmpty(stockDesc.getBrandId()), PjStockDesc::getBrandId, stockDesc.getBrandId())
+			.eq(ObjectUtil.isNotEmpty(stockDesc.getGoodsTypeId()), PjStockDesc::getGoodsTypeId, stockDesc.getGoodsTypeId())
+			.like(ObjectUtil.isNotEmpty(stockDesc.getDot()), PjStockDesc::getDot, stockDesc.getDot())
+			.orderByAsc(PjStockDesc::getCreateTime);
+		if ("0".equals(stockDesc.getWhether())) {
+			lambdaQueryWrapper.ne(PjStockDesc::getStoreInventory, 0);
+		}
+		if (ObjectUtil.isNotEmpty(stockDesc.getCname())) {
+			List<PjGoodsDesc> pjGoodsDescs = goodsDescService.list(new LambdaQueryWrapper<PjGoodsDesc>()
+				.eq(PjGoodsDesc::getTenantId, AuthUtil.getTenantId())
+				.eq(PjGoodsDesc::getIsDeleted, 0)
+				.like(PjGoodsDesc::getCnameInt, stockDesc.getCname()));
+			if (pjGoodsDescs.size() > 0) {
+				List<Long> ids = pjGoodsDescs.stream().map(PjGoodsDesc::getId).collect(Collectors.toList());
+				lambdaQueryWrapper.and(i -> i.like(PjStockDesc::getCname, stockDesc.getCname())
+					.or().in(PjStockDesc::getGoodsId, ids));
+			} else {
+				lambdaQueryWrapper.like(PjStockDesc::getCname, stockDesc.getCname());
+			}
+		}
+		IPage<PjStockDesc> pages = stockDescService.page(Condition.getPage(query), lambdaQueryWrapper);
+		return R.data(pages);
+	}
+
 
 	/**
 	 * 获取上架管理所需库存