Просмотр исходного кода

达沃特修改

Signed-off-by: sunhz <mpcoo@foxmail.com>
sunhz 3 лет назад
Родитель
Сommit
d88f772e1a
16 измененных файлов с 583 добавлено и 369 удалено
  1. 28 0
      blade-ops/blade-report/src/main/java/org/springblade/report/ureport/ClientBean.java
  2. 4 0
      blade-service-api/blade-client-api/src/main/java/org/springblade/client/entity/GoodsDesc.java
  3. 30 12
      blade-service-api/blade-client-api/src/main/java/org/springblade/client/feign/IGoodsDescClient.java
  4. 60 0
      blade-service-api/blade-stock-api/src/main/java/org/springblade/stock/vo/AppStockVO.java
  5. 2 0
      blade-service/blade-client/src/main/java/org/springblade/client/goods/controller/GoodsDescController.java
  6. 67 29
      blade-service/blade-client/src/main/java/org/springblade/client/goods/feign/GoodsDescClient.java
  7. 163 194
      blade-service/blade-client/src/main/java/org/springblade/client/goods/service/impl/GoodsDescServiceImpl.java
  8. 65 43
      blade-service/blade-deliver-goods/src/main/java/org/springblade/deliver/goods/service/impl/DeliveryItemsServiceImpl.java
  9. 4 1
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/excel/DatasetExcel.java
  10. 1 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/mapper/OrderItemsMapper.xml
  11. 1 1
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/impl/OrderServiceImpl.java
  12. 9 0
      blade-service/blade-stock/src/main/java/org/springblade/stock/controller/StockGoodsController.java
  13. 7 3
      blade-service/blade-stock/src/main/java/org/springblade/stock/mapper/StockGoodsMapper.java
  14. 26 0
      blade-service/blade-stock/src/main/java/org/springblade/stock/mapper/StockGoodsMapper.xml
  15. 26 12
      blade-service/blade-stock/src/main/java/org/springblade/stock/service/IStockGoodsService.java
  16. 90 74
      blade-service/blade-stock/src/main/java/org/springblade/stock/service/impl/StockGoodsServiceImpl.java

+ 28 - 0
blade-ops/blade-report/src/main/java/org/springblade/report/ureport/ClientBean.java

@@ -0,0 +1,28 @@
+package org.springblade.report.ureport;
+
+import lombok.AllArgsConstructor;
+import org.springblade.client.entity.GoodsDesc;
+import org.springblade.client.feign.IGoodsDescClient;
+import org.springblade.report.util.ParamUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+@Component
+@AllArgsConstructor
+public class ClientBean {
+
+	private IGoodsDescClient goodsDescClient;
+
+	public List<GoodsDesc> loadGoodsData(String dsName, String datasetName, Map<String, Object> params) {
+		String code = ParamUtil.getString(params.get("code"));
+		String cname = ParamUtil.getString(params.get("cname"));
+		String cnameInt = ParamUtil.getString(params.get("cnameInt"));
+		String goodsTypeId = ParamUtil.getString(params.get("goodsTypeId"));
+		String tenantId = ParamUtil.getString(params.get("tenantId"));
+
+		return goodsDescClient.getGoodsReport(cname, cnameInt, code, goodsTypeId, tenantId).getData();
+	}
+
+}

+ 4 - 0
blade-service-api/blade-client-api/src/main/java/org/springblade/client/entity/GoodsDesc.java

@@ -50,6 +50,10 @@ public class GoodsDesc implements Serializable {
 	private String code;
 	//商品名称
 	private String cname;
+	/**
+	 * 产品名称提取数字
+	 */
+	private String cnameInt;
 	//英文名称
 	private String ename;
 	//中文描述

+ 30 - 12
blade-service-api/blade-client-api/src/main/java/org/springblade/client/feign/IGoodsDescClient.java

@@ -11,22 +11,23 @@ import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
 
-@FeignClient(
-	value = LauncherConstant.APPLICATION_CLIENT_NAME
-)
 /**
  * 商品信息对外访问API
  */
+@FeignClient(
+	value = LauncherConstant.APPLICATION_CLIENT_NAME
+)
 public interface IGoodsDescClient {
 	String API_PREFIX = "/client";
 	String GOODS_BASIC = API_PREFIX + "/goodsBasic";
 	String GOODSD_ESCMESSAGE = API_PREFIX + "/goodsDescMessage";
 	String GOODS_BY_CODE = API_PREFIX + "goods_by_code";
-	String GET_SPECIFICATION = API_PREFIX + "/get_Specification" ;
-	String GET_GOOD_ID = API_PREFIX +"/getGoodId";
+	String GET_SPECIFICATION = API_PREFIX + "/get_Specification";
+	String GET_GOOD_ID = API_PREFIX + "/getGoodId";
 	String GOOD_TYPE_ID = API_PREFIX + "/goodTypeId";
-	String GET_GOOD_Name = API_PREFIX +"/getGoodName";
+	String GET_GOOD_Name = API_PREFIX + "/getGoodName";
 	String GOOD_TYPE_CNAME = API_PREFIX + "/goodTypeCname";
+	String GET_GOODS_REPORT = API_PREFIX + "/getGoodsReport";
 
 
 	/**
@@ -37,6 +38,7 @@ public interface IGoodsDescClient {
 	 */
 	@GetMapping(GOODSD_ESCMESSAGE)
 	R<GoodsDescVO> selectGoodsMessage(@RequestParam("Id") Long Id);
+
 	/**
 	 * 获取商品信息
 	 *
@@ -56,6 +58,7 @@ public interface IGoodsDescClient {
 
 	/**
 	 * 根据商品id获取商品规格
+	 *
 	 * @param goodId
 	 * @return
 	 */
@@ -64,6 +67,7 @@ public interface IGoodsDescClient {
 
 	/**
 	 * 获取商品id
+	 *
 	 * @param code
 	 * @param cname
 	 * @param brand
@@ -74,34 +78,48 @@ public interface IGoodsDescClient {
 	 * @return
 	 */
 	@GetMapping(GET_GOOD_ID)
-	List<Long> getGoodId(@RequestParam(value = "code",required = false)String code,@RequestParam(value = "cname",required = false)String cname,
-						 @RequestParam(value = "brand",required = false)String brand,@RequestParam(value = "brandItem",required = false)String brandItem,
-						 @RequestParam(value = "placeProduction",required = false)String placeProduction,
-						 @RequestParam(value = "specsOne",required = false)String specsOne,@RequestParam(value = "specsTwo",required = false)String specsTwo);
+	List<Long> getGoodId(@RequestParam(value = "code", required = false) String code, @RequestParam(value = "cname", required = false) String cname,
+						 @RequestParam(value = "brand", required = false) String brand, @RequestParam(value = "brandItem", required = false) String brandItem,
+						 @RequestParam(value = "placeProduction", required = false) String placeProduction,
+						 @RequestParam(value = "specsOne", required = false) String specsOne, @RequestParam(value = "specsTwo", required = false) String specsTwo);
 
 	/**
 	 * 获取商品类别
+	 *
 	 * @param goodId
 	 * @return
 	 */
 	@GetMapping(GOOD_TYPE_ID)
 	GoodsType goodTypeId(@RequestParam("goodId") Long goodId);
+
 	/**
 	 * 获取商品类别
+	 *
 	 * @param cname
 	 * @return
 	 */
 	@GetMapping(GOOD_TYPE_CNAME)
 	GoodsType goodTypeCname(@RequestParam("cname") String cname);
+
 	/**
 	 * 获取商品信息
-	 * @param cname 商品名
+	 *
+	 * @param cname  商品名
 	 * @param corpId 供应商
 	 * @return
 	 */
 	@GetMapping(GET_GOOD_Name)
 	GoodsDesc getGoodName(@RequestParam("cname") String cname,
-						  @RequestParam(value = "corpId",required = false) Long corpId);
+						  @RequestParam(value = "corpId", required = false) Long corpId);
 
+	/**
+	 * 获取商品报表信息
+	 */
+	@GetMapping(GET_GOODS_REPORT)
+	R<List<GoodsDesc>> getGoodsReport(@RequestParam(name = "cname", required = false) String cname,
+									  @RequestParam(name = "cnameInt", required = false) String cnameInt,
+									  @RequestParam(name = "code", required = false) String code,
+									  @RequestParam(name = "goodsTypeId", required = false) String goodsTypeId,
+									  @RequestParam(name = "tenantId", required = false) String tenantId);
 
 }

+ 60 - 0
blade-service-api/blade-stock-api/src/main/java/org/springblade/stock/vo/AppStockVO.java

@@ -0,0 +1,60 @@
+package org.springblade.stock.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * App库存视图类
+ *
+ * @author s
+ */
+@Data
+public class AppStockVO {
+
+	/**
+	 * ID
+	 */
+	private Long id;
+
+	/**
+	 * 商品名
+	 */
+	private String goods;
+
+	/**
+	 * 商品名的数字
+	 */
+	private String goodsInt;
+
+	/**
+	 * 仓库名
+	 */
+	private String storage;
+
+	/**
+	 * 结余
+	 */
+	private BigDecimal balance;
+
+	/**
+	 * 品牌
+	 */
+	private String brand;
+
+	/**
+	 * 花纹
+	 */
+	private String brandItem;
+
+	/**
+	 * 销售价
+	 */
+	private BigDecimal salesPrice;
+
+	/**
+	 * 租户号
+	 */
+	private String tenantId;
+
+}

+ 2 - 0
blade-service/blade-client/src/main/java/org/springblade/client/goods/controller/GoodsDescController.java

@@ -124,6 +124,7 @@ public class GoodsDescController extends BladeController {
 	public R<?> list(@RequestParam(name = "current", defaultValue = "1") Integer current,
 					 @RequestParam(name = "size", defaultValue = "10") Integer size,
 					 @RequestParam(name = "cname", required = false) String cname,
+					 @RequestParam(name = "cnameInt", required = false) String cnameInt,
 					 @RequestParam(name = "ename", required = false) String ename,
 					 @RequestParam(name = "code", required = false) String code,
 					 @RequestParam(name = "goodsTypeId", required = false) String goodsTypeId,
@@ -159,6 +160,7 @@ public class GoodsDescController extends BladeController {
 		}
 
 		goodsDescLambdaQueryWrapper.like(!StringUtils.isBlank(cname), GoodsDesc::getCname, cname);
+		goodsDescLambdaQueryWrapper.like(!StringUtils.isBlank(cnameInt), GoodsDesc::getCnameInt, cnameInt);
 		goodsDescLambdaQueryWrapper.like(!StringUtils.isBlank(ename), GoodsDesc::getEname, ename);
 		goodsDescLambdaQueryWrapper.like(!StringUtils.isBlank(code), GoodsDesc::getCode, code);
 		goodsDescLambdaQueryWrapper.eq(GoodsDesc::getTenantId, AuthUtil.getTenantId());

+ 67 - 29
blade-service/blade-client/src/main/java/org/springblade/client/goods/feign/GoodsDescClient.java

@@ -7,19 +7,20 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springblade.client.entity.GoodsDesc;
 import org.springblade.client.entity.GoodsType;
 import org.springblade.client.feign.IGoodsDescClient;
-import org.springblade.client.entity.GoodsDesc;
-import org.springblade.client.goods.assemble.mapstruct.GoodsDescMapstructMapper;
 import org.springblade.client.goods.service.IGoodsDescService;
 import org.springblade.client.goods.service.IGoodsSpecificationService;
 import org.springblade.client.goods.service.IGoodsTypeService;
 import org.springblade.client.vo.GoodsDescVO;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tenant.annotation.NonDS;
 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.StringUtil;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RestController;
 import springfox.documentation.annotations.ApiIgnore;
@@ -35,13 +36,13 @@ import java.util.stream.Collectors;
 @AllArgsConstructor
 public class GoodsDescClient implements IGoodsDescClient {
 
-	private IGoodsDescService goodsDescService;
+	private final IGoodsDescService goodsDescService;
 
-	private GoodsDescMapstructMapper goodsDescMapstructMapper;
+	private final IGoodsSpecificationService goodsSpecificationService;
 
-	private IGoodsSpecificationService goodsSpecificationService;
+	private final IGoodsTypeService goodsTypeService;
 
-	private IGoodsTypeService goodsTypeService;
+	private final IGoodsTypeService goodsDescType;
 
 	/**
 	 * 获取商品信息
@@ -77,6 +78,7 @@ public class GoodsDescClient implements IGoodsDescClient {
 
 	/**
 	 * 根据商品信息获取商品规格信息
+	 *
 	 * @param goodId
 	 * @return
 	 */
@@ -84,26 +86,25 @@ public class GoodsDescClient implements IGoodsDescClient {
 	public R<List<String>> getSpecification(Long goodId) {
 		return R.data(goodsSpecificationService.getSpecification(goodId));
 	}
+
 	@GetMapping(GET_GOOD_ID)
 	@Override
-	public List<Long> getGoodId(String code,String cname,String brand,String brandItem,String placeProduction,
-								String specsOne,String specsTwo) {
+	public List<Long> getGoodId(String code, String cname, String brand, String brandItem, String placeProduction,
+								String specsOne, String specsTwo) {
 		List<Long> list = new ArrayList<>();
 		LambdaQueryWrapper<GoodsDesc> lambdaQueryWrapper = new LambdaQueryWrapper<>();
-		lambdaQueryWrapper.eq(GoodsDesc::getTenantId,SecureUtil.getTenantId());
-		lambdaQueryWrapper.eq(GoodsDesc::getIsDeleted,0);
-		lambdaQueryWrapper.like(Func.isNotEmpty(code),GoodsDesc::getCode,code);
-		lambdaQueryWrapper.like(Func.isNotEmpty(cname),GoodsDesc::getCname,cname);
-		lambdaQueryWrapper.like(Func.isNotEmpty(brand),GoodsDesc::getBrand,brand);
-		lambdaQueryWrapper.like(Func.isNotEmpty(brandItem),GoodsDesc::getBrandItem,brandItem);
-		lambdaQueryWrapper.like(Func.isNotEmpty(placeProduction),GoodsDesc::getPlaceProduction,placeProduction);
-		lambdaQueryWrapper.like(Func.isNotEmpty(specsOne),GoodsDesc::getSpecsOne,specsOne);
-		lambdaQueryWrapper.like(Func.isNotEmpty(specsTwo),GoodsDesc::getSpecsTwo,specsTwo);
-		if (lambdaQueryWrapper != null){
-			List<GoodsDesc> goodsDescList = goodsDescService.list(lambdaQueryWrapper);
-			if (CollectionUtils.isNotEmpty(goodsDescList)){
-				list = goodsDescList.stream().map(GoodsDesc::getId).collect(Collectors.toList());
-			}
+		lambdaQueryWrapper.eq(GoodsDesc::getTenantId, SecureUtil.getTenantId());
+		lambdaQueryWrapper.eq(GoodsDesc::getIsDeleted, 0);
+		lambdaQueryWrapper.like(Func.isNotEmpty(code), GoodsDesc::getCode, code);
+		lambdaQueryWrapper.like(Func.isNotEmpty(cname), GoodsDesc::getCname, cname);
+		lambdaQueryWrapper.like(Func.isNotEmpty(brand), GoodsDesc::getBrand, brand);
+		lambdaQueryWrapper.like(Func.isNotEmpty(brandItem), GoodsDesc::getBrandItem, brandItem);
+		lambdaQueryWrapper.like(Func.isNotEmpty(placeProduction), GoodsDesc::getPlaceProduction, placeProduction);
+		lambdaQueryWrapper.like(Func.isNotEmpty(specsOne), GoodsDesc::getSpecsOne, specsOne);
+		lambdaQueryWrapper.like(Func.isNotEmpty(specsTwo), GoodsDesc::getSpecsTwo, specsTwo);
+		List<GoodsDesc> goodsDescList = goodsDescService.list(lambdaQueryWrapper);
+		if (CollectionUtils.isNotEmpty(goodsDescList)) {
+			list = goodsDescList.stream().map(GoodsDesc::getId).collect(Collectors.toList());
 		}
 		return list;
 	}
@@ -112,7 +113,7 @@ public class GoodsDescClient implements IGoodsDescClient {
 	public GoodsType goodTypeId(Long goodId) {
 		GoodsType goodsType = new GoodsType();
 		GoodsDesc goodsDesc = goodsDescService.getById(goodId);
-		if (goodsDesc != null && StringUtils.isNotBlank(goodsDesc.getGoodsTypeId())){
+		if (goodsDesc != null && StringUtils.isNotBlank(goodsDesc.getGoodsTypeId())) {
 			goodsType = goodsTypeService.getById(Long.valueOf(goodsDesc.getGoodsTypeId()));
 		}
 		return goodsType;
@@ -120,16 +121,53 @@ public class GoodsDescClient implements IGoodsDescClient {
 
 	@Override
 	public GoodsType goodTypeCname(String cname) {
-		 return goodsTypeService.getOne(new QueryWrapper<GoodsType>().eq("cname", cname).eq("tenant_id", SecureUtil.getTenantId()));
+		return goodsTypeService.getOne(new QueryWrapper<GoodsType>().eq("cname", cname).eq("tenant_id", SecureUtil.getTenantId()));
 	}
 
 	@Override
-	public GoodsDesc getGoodName(String cname,Long corpId) {
+	public GoodsDesc getGoodName(String cname, Long corpId) {
 		LambdaQueryWrapper<GoodsDesc> lambdaQueryWrapper = new LambdaQueryWrapper<>();
-		lambdaQueryWrapper.eq(GoodsDesc::getIsDeleted,0);
-		lambdaQueryWrapper.eq(GoodsDesc::getTenantId,SecureUtil.getTenantId());
-		lambdaQueryWrapper.eq(GoodsDesc::getCname,cname);
-		lambdaQueryWrapper.eq(Func.isNotEmpty(corpId),GoodsDesc::getCorpId,corpId);
+		lambdaQueryWrapper.eq(GoodsDesc::getIsDeleted, 0);
+		lambdaQueryWrapper.eq(GoodsDesc::getTenantId, SecureUtil.getTenantId());
+		lambdaQueryWrapper.eq(GoodsDesc::getCname, cname);
+		lambdaQueryWrapper.eq(Func.isNotEmpty(corpId), GoodsDesc::getCorpId, corpId);
 		return goodsDescService.getOne(lambdaQueryWrapper);
 	}
+
+	@Override
+	public R<List<GoodsDesc>> getGoodsReport(String cname, String cnameInt, String code, String goodsTypeId, String tenantId) {
+		LambdaQueryWrapper<GoodsDesc> goodsDescLambdaQueryWrapper = new LambdaQueryWrapper<>();
+
+		// 指定分类为一级分类,查询此分类所有二级分类的商品
+		if (StringUtil.isNotBlank(goodsTypeId)) {
+			Long goodsId = Long.parseLong(goodsTypeId);
+			List<Long> goodsIdList = new ArrayList<>();
+			selectChildById(goodsId, goodsIdList);
+			goodsIdList.add(goodsId);
+
+			goodsDescLambdaQueryWrapper.in(GoodsDesc::getGoodsTypeId, goodsIdList);
+		}
+
+		goodsDescLambdaQueryWrapper.like(!StringUtil.isBlank(cname), GoodsDesc::getCname, cname);
+		goodsDescLambdaQueryWrapper.like(!StringUtil.isBlank(cnameInt), GoodsDesc::getCnameInt, cnameInt);
+		goodsDescLambdaQueryWrapper.like(!StringUtil.isBlank(code), GoodsDesc::getCode, code);
+		goodsDescLambdaQueryWrapper.eq(GoodsDesc::getTenantId, tenantId);
+		goodsDescLambdaQueryWrapper.eq(GoodsDesc::getType, 0);
+		goodsDescLambdaQueryWrapper.orderByDesc(GoodsDesc::getCreateTime);
+		return R.data(goodsDescService.list(goodsDescLambdaQueryWrapper));
+	}
+
+	/**
+	 * 递归查询ID
+	 */
+	private void selectChildById(Long id, List<Long> idList) {
+		LambdaQueryWrapper<GoodsType> idListWrapper = new LambdaQueryWrapper<>();
+		idListWrapper.select(GoodsType::getId);
+		idListWrapper.eq(GoodsType::getParentId, id);
+		List<GoodsType> childIdList = goodsDescType.list(idListWrapper);
+		childIdList.forEach(item -> {
+			idList.add(item.getId());
+			this.selectChildById(item.getId(), idList);
+		});
+	}
 }

+ 163 - 194
blade-service/blade-client/src/main/java/org/springblade/client/goods/service/impl/GoodsDescServiceImpl.java

@@ -17,7 +17,6 @@
 package org.springblade.client.goods.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
@@ -33,21 +32,19 @@ import org.springblade.client.goods.mapper.*;
 import org.springblade.client.goods.service.IGoodsDescService;
 import org.springblade.client.vo.GoodsDescVO;
 import org.springblade.core.log.exception.ServiceException;
-import org.springblade.core.mp.support.Condition;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.core.tool.utils.StringUtil;
 import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.util.*;
-import java.util.stream.Collectors;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * 商品详情表 服务实现类
@@ -58,8 +55,14 @@ import java.util.stream.Collectors;
 @Service
 @AllArgsConstructor
 public class GoodsDescServiceImpl extends ServiceImpl<GoodsDescMapper, GoodsDesc> implements IGoodsDescService {
-	private GoodsTypeDescServiceImpl goodsTypeDescService;  //商品-商品类别对应表
-	private GoodsTypeServiceImpl goodsTypeService;//商品类别信息
+	/**
+	 * 商品-商品类别对应表
+	 */
+	private final GoodsTypeDescServiceImpl goodsTypeDescService;
+	/**
+	 * 商品类别信息
+	 */
+	private final GoodsTypeServiceImpl goodsTypeService;
 	private final GoodsTypeMapper goodsTypeMapper;
 	private final GoodsDescMapper goodsDescMapper;
 	private final GoodsPriceMapper goodsPriceMapper;
@@ -72,16 +75,16 @@ public class GoodsDescServiceImpl extends ServiceImpl<GoodsDescMapper, GoodsDesc
 
 	@Override
 	public IPage<GoodsDescVO> selectGoodsDescPage(IPage<GoodsDescVO> page, GoodsDescVO goodsDesc) {
-		//获取类别及子类别
-		if (StringUtils.isNotBlank(goodsDesc.getGoodsTypeId())){
+		// 获取类别及子类别
+		if (StringUtils.isNotBlank(goodsDesc.getGoodsTypeId())) {
 			List<Long> longList = goodsTypeService.goodTypeIdList(goodsDesc.getGoodsTypeId());
 			goodsDesc.setGoodsTypeIdList(longList);
 		}
-		return page.setRecords(baseMapper.selectGoodsDescPage(page, goodsDesc,AuthUtil.getTenantId()));
+		return page.setRecords(baseMapper.selectGoodsDescPage(page, goodsDesc, AuthUtil.getTenantId()));
 	}
 
 	@Override
-	@Transactional
+	@Transactional(rollbackFor = Exception.class)
 	public GoodsDesc saveMessage(GoodsDesc goodsDesc) {
 		if (goodsDesc.getId() == null) {
 			goodsDesc.setCreateUser(AuthUtil.getUserId());
@@ -105,10 +108,10 @@ public class GoodsDescServiceImpl extends ServiceImpl<GoodsDescMapper, GoodsDesc
 	 * @param goodsTypeId
 	 */
 	public void saveType(Long goodId, String goodsTypeId) {
-		goodsTypeDescService.remove(new QueryWrapper<GoodsTypeDesc>().eq("goods_id", goodId));
+		goodsTypeDescService.remove(new LambdaQueryWrapper<GoodsTypeDesc>().eq(GoodsTypeDesc::getGoodsId, goodId));
 		if (StringUtils.isNotBlank(goodsTypeId)) {
 			List<String> list = Arrays.asList(goodsTypeId.split(","));
-			list.stream().forEach(item -> {
+			list.forEach(item -> {
 				GoodsTypeDesc goodsTypeDesc = new GoodsTypeDesc();
 				goodsTypeDesc.setTenantId(SecureUtil.getTenantId());
 				goodsTypeDesc.setCreateDept(Long.valueOf(SecureUtil.getDeptId()));
@@ -123,9 +126,9 @@ public class GoodsDescServiceImpl extends ServiceImpl<GoodsDescMapper, GoodsDesc
 
 	@Override
 	public GoodsDesc getMessageById(GoodsDesc goodsDesc) {
-		//获取商品详情
+		// 获取商品详情
 		GoodsDesc desc = baseMapper.selectById(goodsDesc.getId());
-		//获取商品类别
+		// 获取商品类别
 		List<String> list = goodsTypeDescService.selectTypeId(goodsDesc.getId());
 		if (CollectionUtils.isNotEmpty(list)) {
 			desc.setGoodsTypeId(String.join(",", list));
@@ -145,7 +148,7 @@ public class GoodsDescServiceImpl extends ServiceImpl<GoodsDescMapper, GoodsDesc
 			.eq(GoodsDesc::getType, goodsDesc.getType())
 			.eq(GoodsDesc::getCode, goodsDesc.getCode())
 			.eq(GoodsDesc::getTenantId, goodsDesc.getTenantId())
-			.eq(GoodsDesc::getIsDeleted,0)
+			.eq(GoodsDesc::getIsDeleted, 0)
 		);
 		if (count > 0) {
 			throw new ServiceException("名称已存在");
@@ -164,7 +167,7 @@ public class GoodsDescServiceImpl extends ServiceImpl<GoodsDescMapper, GoodsDesc
 			.eq(GoodsDesc::getType, goodsDesc.getType())
 			.eq(GoodsDesc::getCname, goodsDesc.getCname())
 			.eq(GoodsDesc::getTenantId, goodsDesc.getTenantId())
-			.eq(GoodsDesc::getIsDeleted,0)
+			.eq(GoodsDesc::getIsDeleted, 0)
 		);
 		if (count > 0) {
 			throw new ServiceException("名称已存在");
@@ -182,66 +185,61 @@ public class GoodsDescServiceImpl extends ServiceImpl<GoodsDescMapper, GoodsDesc
 	}
 
 	@Override
-	@Transactional
-	public void modify(GoodsDesc goodsDesc)
-	{
-		LambdaQueryWrapper<GoodsDesc> lambdaQueryWrapper=new LambdaQueryWrapper<>();
-		lambdaQueryWrapper.eq(GoodsDesc::getType,0);
-		lambdaQueryWrapper.eq(GoodsDesc::getIsDeleted,0);
-		lambdaQueryWrapper.eq(GoodsDesc::getCode,goodsDesc.getCode());
-		lambdaQueryWrapper.eq(GoodsDesc::getCname,goodsDesc.getCname());
-		lambdaQueryWrapper.eq(GoodsDesc::getTenantId,AuthUtil.getTenantId());
+	@Transactional(rollbackFor = Exception.class)
+	public void modify(GoodsDesc goodsDesc) {
+		LambdaQueryWrapper<GoodsDesc> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(GoodsDesc::getType, 0);
+		lambdaQueryWrapper.eq(GoodsDesc::getIsDeleted, 0);
+		lambdaQueryWrapper.eq(GoodsDesc::getCode, goodsDesc.getCode());
+		lambdaQueryWrapper.eq(GoodsDesc::getCname, goodsDesc.getCname());
+		lambdaQueryWrapper.eq(GoodsDesc::getTenantId, AuthUtil.getTenantId());
 		GoodsDesc selectOne = baseMapper.selectOne(lambdaQueryWrapper);
-		if(selectOne != null && goodsDesc.getId() == null) {
+
+		if (selectOne != null && goodsDesc.getId() == null) {
 			throw new ServiceException("存在重复数据,请修改后添加");
-		}else if (selectOne != null && goodsDesc.getId().longValue() != selectOne.getId().longValue()){
+		} else if (selectOne != null && goodsDesc.getId().longValue() != selectOne.getId().longValue()) {
 			throw new ServiceException("存在重复数据,请修改后添加");
 		}
 
 		List<GoodsFiles> filesList = goodsDesc.getFilesList();
-		List<GoodsPrice> chilList=new ArrayList<>();
-		if(CollectionUtils.isNotEmpty(goodsDesc.getBuyGoodsPrice()))
-		{
+		List<GoodsPrice> chilList = new ArrayList<>();
+		if (CollectionUtils.isNotEmpty(goodsDesc.getBuyGoodsPrice())) {
 			chilList.addAll(goodsDesc.getBuyGoodsPrice());
 		}
-		if(CollectionUtils.isNotEmpty(goodsDesc.getSaleGoodsPrice()))
-		{
+		if (CollectionUtils.isNotEmpty(goodsDesc.getSaleGoodsPrice())) {
 			chilList.addAll(goodsDesc.getSaleGoodsPrice());
 		}
 
-
 		Long id = goodsDesc.getId();
-		//代表主表、子表都是新增,
-		if(id==null)
-		{
+		// 代表主表、子表都是新增,
+		if (id == null) {
+			goodsDesc.setCnameInt(getCnameInt(goodsDesc.getCname()));
 			goodsDesc.setTenantId(AuthUtil.getTenantId());
 			goodsDesc.setCreateTime(new Date());
 			goodsDesc.setCreateUser(SecureUtil.getUserId());
-			 goodsDescMapper.insert(goodsDesc);
-			 if(!CollectionUtils.isEmpty(chilList))
-			 {
-				 chilList.forEach(e->{
-					 e.setTenantId(AuthUtil.getTenantId());
-					 e.setPid(goodsDesc.getId());
-					 e.setCreateTime(new Date());
-					 e.setCreateUser(SecureUtil.getUserId());
-					 goodsPriceMapper.insert(e);
-				 });
-			 }
-			//文件上传
-			 if(!CollectionUtils.isEmpty(filesList))
-			 {
-				 filesList.forEach(k->{
-					 k.setTenantId(AuthUtil.getTenantId());
-					 k.setPid(goodsDesc.getId());
-					 k.setCreateTime(new Date());
-					 k.setCreateUser(SecureUtil.getUserId());
-					 goodsFilesMapper.insert(k);
-				 });
-			 }
-			 //商品规格明细
-			if (CollectionUtils.isNotEmpty(goodsDesc.getGoodsSpecificationList())){
-				goodsDesc.getGoodsSpecificationList().forEach( f->{
+			goodsDescMapper.insert(goodsDesc);
+			if (!CollectionUtils.isEmpty(chilList)) {
+				chilList.forEach(e -> {
+					e.setTenantId(AuthUtil.getTenantId());
+					e.setPid(goodsDesc.getId());
+					e.setCreateTime(new Date());
+					e.setCreateUser(SecureUtil.getUserId());
+					goodsPriceMapper.insert(e);
+				});
+			}
+			// 文件上传
+			if (!CollectionUtils.isEmpty(filesList)) {
+				filesList.forEach(k -> {
+					k.setTenantId(AuthUtil.getTenantId());
+					k.setPid(goodsDesc.getId());
+					k.setCreateTime(new Date());
+					k.setCreateUser(SecureUtil.getUserId());
+					goodsFilesMapper.insert(k);
+				});
+			}
+			// 商品规格明细
+			if (CollectionUtils.isNotEmpty(goodsDesc.getGoodsSpecificationList())) {
+				goodsDesc.getGoodsSpecificationList().forEach(f -> {
 					f.setTenantId(AuthUtil.getTenantId());
 					f.setPid(goodsDesc.getId());
 					f.setCreateTime(new Date());
@@ -249,30 +247,24 @@ public class GoodsDescServiceImpl extends ServiceImpl<GoodsDescMapper, GoodsDesc
 					goodsSpecificationMapper.insert(f);
 				});
 			}
-
-
-
 		}
-		//主表修改,子表看情况
-		else
-		{
+		// 主表修改,子表看情况
+		else {
+			goodsDesc.setCnameInt(getCnameInt(goodsDesc.getCname()));
 			goodsDescMapper.updateById(goodsDesc);
-			//价格列表
-			if(CollectionUtils.isNotEmpty(chilList))
-			{
-				chilList.forEach(e->{
-					//新增
-					if(e.getId()==null)
-					{
+			// 价格列表
+			if (CollectionUtils.isNotEmpty(chilList)) {
+				chilList.forEach(e -> {
+					// 新增
+					if (e.getId() == null) {
 						e.setTenantId(AuthUtil.getTenantId());
 						e.setPid(goodsDesc.getId());
 						e.setCreateTime(new Date());
 						e.setCreateUser(SecureUtil.getUserId());
 						goodsPriceMapper.insert(e);
 					}
-					//修改
-					else
-					{
+					// 修改
+					else {
 						e.setUpdateTime(new Date());
 						e.setUpdateUser(SecureUtil.getUserId());
 						goodsPriceMapper.updateById(e);
@@ -280,39 +272,35 @@ public class GoodsDescServiceImpl extends ServiceImpl<GoodsDescMapper, GoodsDesc
 				});
 			}
 
-			//文件列表
-			if(CollectionUtils.isNotEmpty(filesList))
-			{
-				filesList.forEach(k->{
-					//新增
-					if(k.getId()==null)
-					{
+			// 文件列表
+			if (CollectionUtils.isNotEmpty(filesList)) {
+				filesList.forEach(k -> {
+					// 新增
+					if (k.getId() == null) {
 						k.setTenantId(AuthUtil.getTenantId());
 						k.setPid(goodsDesc.getId());
 						k.setCreateTime(new Date());
 						k.setCreateUser(SecureUtil.getUserId());
 						goodsFilesMapper.insert(k);
 					}
-					//修改
-					else
-					{
+					// 修改
+					else {
 						k.setUpdateTime(new Date());
 						k.setUpdateUser(SecureUtil.getUserId());
 						goodsFilesMapper.updateById(k);
 					}
 				});
 			}
-			//商品规格明细
-			if (CollectionUtils.isNotEmpty(goodsDesc.getGoodsSpecificationList())){
-				goodsDesc.getGoodsSpecificationList().forEach( f->{
-					if (f.getId() == null){
+			// 商品规格明细
+			if (CollectionUtils.isNotEmpty(goodsDesc.getGoodsSpecificationList())) {
+				goodsDesc.getGoodsSpecificationList().forEach(f -> {
+					if (f.getId() == null) {
 						f.setTenantId(AuthUtil.getTenantId());
 						f.setPid(goodsDesc.getId());
 						f.setCreateTime(new Date());
 						f.setCreateUser(SecureUtil.getUserId());
 						goodsSpecificationMapper.insert(f);
-					}
-					else {
+					} else {
 						f.setUpdateTime(new Date());
 						f.setUpdateUser(SecureUtil.getUserId());
 						goodsSpecificationMapper.updateById(f);
@@ -324,110 +312,84 @@ public class GoodsDescServiceImpl extends ServiceImpl<GoodsDescMapper, GoodsDesc
 	}
 
 	@Override
-	public R importGoods(List<GoodsExcel> data, Boolean isCovered)
-	{
+	public R importGoods(List<GoodsExcel> data, Boolean isCovered) {
 
-			if(org.springframework.util.CollectionUtils.isEmpty(data))
-			{
-				throw new SecurityException("导入数据不能为空");
-			}
-            StringBuffer errMsg= new StringBuffer();
-
-		    for(int i=0;i<data.size();i++)
-		    {
-				GoodsExcel goodsExcel = data.get(i);
-				String type = goodsExcel.getType();
-				GoodsType goodsType = goodsTypeMapper.selectGoodsTypeCname(type, AuthUtil.getTenantId());
-				if(goodsType==null)
-				{
-					errMsg.append("第"+i+"行未添加分类或者分类不存在,");
-				}
+		if (org.springframework.util.CollectionUtils.isEmpty(data)) {
+			throw new SecurityException("导入数据不能为空");
+		}
 
+		for (int i = 0; i < data.size(); i++) {
+			GoodsExcel goodsExcel = data.get(i);
+			String type = goodsExcel.getType();
+			GoodsType goodsType = goodsTypeMapper.selectGoodsTypeCname(type, AuthUtil.getTenantId());
+			if (goodsType == null) {
+				throw new SecurityException("第" + (i + 1) + "行未添加分类或者分类不存在");
 			}
+		}
 
-			data.forEach(e->{
-				String type = e.getType();
-				GoodsType goodsType = goodsTypeMapper.selectGoodsTypeCname(type, AuthUtil.getTenantId());
-				if(goodsType!=null)
-				{
-					GoodsDesc goodsDesc=new GoodsDesc();
-					goodsDesc.setCode(e.getCode());
-					goodsDesc.setCname(e.getCname());
-					goodsDesc.setBrandItem(e.getBrandItem());
-					goodsDesc.setBrand(e.getBrand());
-					goodsDesc.setTypeno(e.getTypeNo());
-					goodsDesc.setSpecsOne(e.getSpecsOne());
-					goodsDesc.setLevel(e.getLevel());
-					goodsDesc.setLevelOne(e.getLevelOne());
-					goodsDesc.setMasterUnit(e.getMasterUnit());
-					goodsDesc.setSlaveUnit(e.getSlaveUnit());
-					goodsDesc.setSwapRate(e.getSwapRate());
-					goodsDesc.setTinyNumber(e.getTinyNumber());
-					goodsDesc.setTax(e.getTax());
-					goodsDesc.setPrice(e.getPrice());
-					goodsDesc.setEffectiveDay(e.getEffectiveDay());
-					goodsDesc.setPlaceProduction(e.getPlaceProduction());
-					goodsDesc.setCompany(e.getCompany());
-					goodsDesc.setRemarks(e.getRemarks());
-					goodsDesc.setType(0L);
-					goodsDesc.setGoodsTypeId(String.valueOf(goodsType.getId()));
-					//获取供应商
-					/*CorpsDesc corpsDesc = new CorpsDesc();
-					corpsDesc.setCname(e.getCorpName());
-					corpsDesc.setCorpType("GYS");*/
-					CorpsDesc corpByName = corpsDescClient.getCorpsDesc(e.getCorpName(),"GYS");
-					if (corpByName != null){
-						goodsDesc.setCorpId(corpByName.getId());
-						goodsDesc.setCorpName(corpByName.getCname());
-					}
-					//如果名称相等 就认为重复
-					LambdaQueryWrapper<GoodsDesc> queryWrapper = new LambdaQueryWrapper<>();
-					queryWrapper.eq(GoodsDesc::getTenantId,AuthUtil.getTenantId());
-					queryWrapper.eq(GoodsDesc::getCname,goodsDesc.getCname());
-					queryWrapper.eq(GoodsDesc::getIsDeleted,0);
-					GoodsDesc one = goodsDescMapper.selectOne(queryWrapper);
-					if(one==null)
-					{
-						goodsDesc.setCreateTime(new Date());
-						goodsDesc.setCreateUser(AuthUtil.getUserId());
-						goodsDesc.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
-						goodsDescMapper.insert(goodsDesc);
-
-						GoodsTypeDesc goodsTypeDes=new GoodsTypeDesc();
-						goodsTypeDes.setGoodsId(goodsDesc.getId());
-						goodsTypeDes.setGoodsTypeId(goodsType.getId());
-						goodsTypeDes.setCreateTime(new Date());
-						goodsTypeDes.setCreateUser(AuthUtil.getUserId());
-						goodsTypeDes.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
-						goodsTypeDescMapper.insert(goodsTypeDes);
-					}
-					else
-					{
-						goodsDesc.setId(one.getId());
-						goodsDesc.setUpdateTime(new Date());
-						goodsDesc.setUpdateUser(AuthUtil.getUserId());
-						goodsDescMapper.updateById(goodsDesc);
-					}
+		data.forEach(e -> {
+			String type = e.getType();
+			GoodsType goodsType = goodsTypeMapper.selectGoodsTypeCname(type, AuthUtil.getTenantId());
+			if (goodsType != null) {
+				GoodsDesc goodsDesc = new GoodsDesc();
+				goodsDesc.setCode(e.getCode());
+				goodsDesc.setCname(e.getCname());
+				goodsDesc.setCnameInt(getCnameInt(goodsDesc.getCname()));
+				goodsDesc.setBrandItem(e.getBrandItem());
+				goodsDesc.setBrand(e.getBrand());
+				goodsDesc.setTypeno(e.getTypeNo());
+				goodsDesc.setSpecsOne(e.getSpecsOne());
+				goodsDesc.setLevel(e.getLevel());
+				goodsDesc.setLevelOne(e.getLevelOne());
+				goodsDesc.setMasterUnit(e.getMasterUnit());
+				goodsDesc.setSlaveUnit(e.getSlaveUnit());
+				goodsDesc.setSwapRate(e.getSwapRate());
+				goodsDesc.setTinyNumber(e.getTinyNumber());
+				goodsDesc.setTax(e.getTax());
+				goodsDesc.setPrice(e.getPrice());
+				goodsDesc.setEffectiveDay(e.getEffectiveDay());
+				goodsDesc.setPlaceProduction(e.getPlaceProduction());
+				goodsDesc.setCompany(e.getCompany());
+				goodsDesc.setRemarks(e.getRemarks());
+				goodsDesc.setType(0L);
+				goodsDesc.setGoodsTypeId(String.valueOf(goodsType.getId()));
+				// 获取供应商
+				/*CorpsDesc corpsDesc = new CorpsDesc();
+				corpsDesc.setCname(e.getCorpName());
+				corpsDesc.setCorpType("GYS");*/
+				CorpsDesc corpByName = corpsDescClient.getCorpsDesc(e.getCorpName(), "GYS");
+				if (corpByName != null) {
+					goodsDesc.setCorpId(corpByName.getId());
+					goodsDesc.setCorpName(corpByName.getCname());
 				}
-				else
-				{
+				// 如果名称相等 就认为重复
+				LambdaQueryWrapper<GoodsDesc> queryWrapper = new LambdaQueryWrapper<>();
+				queryWrapper.eq(GoodsDesc::getTenantId, AuthUtil.getTenantId());
+				queryWrapper.eq(GoodsDesc::getCname, goodsDesc.getCname());
+				queryWrapper.eq(GoodsDesc::getIsDeleted, 0);
+				GoodsDesc one = goodsDescMapper.selectOne(queryWrapper);
+				if (one == null) {
+					goodsDesc.setCreateTime(new Date());
+					goodsDesc.setCreateUser(AuthUtil.getUserId());
+					goodsDesc.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+					goodsDescMapper.insert(goodsDesc);
 
+					GoodsTypeDesc goodsTypeDes = new GoodsTypeDesc();
+					goodsTypeDes.setGoodsId(goodsDesc.getId());
+					goodsTypeDes.setGoodsTypeId(goodsType.getId());
+					goodsTypeDes.setCreateTime(new Date());
+					goodsTypeDes.setCreateUser(AuthUtil.getUserId());
+					goodsTypeDes.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+					goodsTypeDescMapper.insert(goodsTypeDes);
+				} else {
+					goodsDesc.setId(one.getId());
+					goodsDesc.setUpdateTime(new Date());
+					goodsDesc.setUpdateUser(AuthUtil.getUserId());
+					goodsDescMapper.updateById(goodsDesc);
 				}
-			});
-		/*	List<Boolean> booleanList = countList.stream().filter(e -> e == true).collect(Collectors.toList());
-			if(data.size()>booleanList.size())
-			{
-				return R.fail("导入中的数据,分类字段不存在或者未填分类字段");
-			}
-			else if(data.size()==booleanList.size())
-			{
-				return R.success("导入成功");
 			}
-			else
-			{
-				throw new SecurityException("导入失败,请仔细检查导入数据");
-			}*/
- return R.success("ok");
+		});
+		return R.success("ok");
 
 	}
 
@@ -436,14 +398,13 @@ public class GoodsDescServiceImpl extends ServiceImpl<GoodsDescMapper, GoodsDesc
 		if (org.springframework.util.CollectionUtils.isEmpty(data)) {
 			throw new SecurityException("导入数据不能为空");
 		}
-		StringBuffer errMsg = new StringBuffer();
 
 		for (int i = 0; i < data.size(); i++) {
 			GoodsInfoExcel goodsExcel = data.get(i);
 			String type = goodsExcel.getType();
 			GoodsType goodsType = goodsTypeMapper.selectGoodsTypeCname(type, AuthUtil.getTenantId());
 			if (goodsType == null) {
-				errMsg.append("第" + i + "行未添加分类或者分类不存在,");
+				throw new SecurityException("第" + (i + 1) + "行未添加分类或者分类不存在");
 			}
 		}
 
@@ -453,6 +414,7 @@ public class GoodsDescServiceImpl extends ServiceImpl<GoodsDescMapper, GoodsDesc
 			if (goodsType != null) {
 				GoodsDesc goodsDesc = new GoodsDesc();
 				BeanUtils.copyProperties(e, goodsDesc);
+				goodsDesc.setCnameInt(getCnameInt(goodsDesc.getCname()));
 
 				R<CorpsDesc> corpByName = corpsDescClient.getCorpByName(e.getCorpName(), AuthUtil.getTenantId());
 				if (corpByName.isSuccess() && corpByName.getData() != null) {
@@ -475,7 +437,7 @@ public class GoodsDescServiceImpl extends ServiceImpl<GoodsDescMapper, GoodsDesc
 					}
 				}
 
-				//获取供应商
+				// 获取供应商
 				goodsDesc.setTypeno(e.getTypeNo());
 				goodsDesc.setCntrVolumn(e.getCntrVolumn());
 				goodsDesc.setCartonWeight(e.getCartonWeight());
@@ -483,7 +445,7 @@ public class GoodsDescServiceImpl extends ServiceImpl<GoodsDescMapper, GoodsDesc
 				goodsDesc.setSize(e.getSize());
 				goodsDesc.setType(0L);
 				goodsDesc.setGoodsTypeId(String.valueOf(goodsType.getId()));
-				//如果名称相等 就认为重复
+				// 如果名称相等 就认为重复
 				LambdaQueryWrapper<GoodsDesc> queryWrapper = new LambdaQueryWrapper<>();
 				queryWrapper.eq(GoodsDesc::getTenantId, AuthUtil.getTenantId());
 				queryWrapper.eq(GoodsDesc::getCode, goodsDesc.getCode());
@@ -516,4 +478,11 @@ public class GoodsDescServiceImpl extends ServiceImpl<GoodsDescMapper, GoodsDesc
 		return R.success("ok");
 	}
 
+	private String getCnameInt(String cname) {
+		String regex = "[^0-9]";
+		Pattern p = Pattern.compile(regex);
+		Matcher m = p.matcher(cname);
+		return m.replaceAll("").trim();
+	}
+
 }

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

@@ -17,7 +17,9 @@
 package org.springblade.deliver.goods.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.trade.purchase.order.enums.OrderTypeEnum;
 import lombok.AllArgsConstructor;
 import org.springblade.client.entity.CorpsDesc;
@@ -26,14 +28,14 @@ import org.springblade.client.feign.IGoodsDescClient;
 import org.springblade.client.vo.GoodsDescVO;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.deliver.goods.entity.Delivery;
 import org.springblade.deliver.goods.entity.DeliveryItems;
 import org.springblade.deliver.goods.enums.DeliveryEnum;
 import org.springblade.deliver.goods.enums.DeliveryStatusEnum;
-import org.springblade.deliver.goods.vo.*;
 import org.springblade.deliver.goods.mapper.DeliveryItemsMapper;
 import org.springblade.deliver.goods.service.IDeliveryItemsService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.deliver.goods.vo.*;
 import org.springblade.finance.feign.IFinanceClient;
 import org.springblade.mocha.entity.BusinessOverpaymentItem;
 import org.springblade.mocha.entity.BusinessPointsItem;
@@ -42,6 +44,7 @@ import org.springblade.mocha.entity.Points;
 import org.springblade.mocha.enums.OverpaymentEnum;
 import org.springblade.mocha.feign.IBusinessOverpaymentClient;
 import org.springblade.mocha.feign.IBusinessPointsClient;
+import org.springblade.purchase.sales.entity.Order;
 import org.springblade.purchase.sales.feign.IOrderDescClient;
 import org.springblade.purchase.sales.feign.IOrderItemsClient;
 import org.springblade.stock.entity.StockGoods;
@@ -50,7 +53,6 @@ import org.springblade.stock.vo.StockGoodsVO;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
 import org.springframework.stereotype.Service;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
@@ -147,99 +149,119 @@ public class DeliveryItemsServiceImpl extends ServiceImpl<DeliveryItemsMapper, D
 
 	/**
 	 * 提交发货信息
+	 *
 	 * @param pId
 	 * @param deliveryItemsList
 	 * @param
 	 * @return
 	 */
-	public List<DeliveryItems> affirmDeliveryItemsList(Long pId,Delivery delivery,List<DeliveryItems> deliveryItemsList){
-		List<DeliveryItems> collect = deliveryItemsList.stream().filter(e -> e.getGoodType() == 0).collect(Collectors.toList());//发货商品
-		List<DeliveryItems> itemsList = deliveryItemsList.stream().filter(e -> e.getGoodType() == 1).collect(Collectors.toList());//赠送商品
-		//判断要发货物的金额和已收金额的大小
-		if (delivery.getDeliveryType() == DeliveryEnum.DELIVER.getType()){
-			R amount = this.deliveryAmount(collect, delivery.getTradeType());
-			if (!amount.isSuccess()){
-				throw  new RuntimeException(amount.getMsg());
+	public List<DeliveryItems> affirmDeliveryItemsList(Long pId, Delivery delivery, List<DeliveryItems> deliveryItemsList) {
+		// 发货商品
+		List<DeliveryItems> collect = deliveryItemsList.stream().filter(e -> e.getGoodType() == 0).collect(Collectors.toList());
+		// 赠送商品
+		List<DeliveryItems> itemsList = deliveryItemsList.stream().filter(e -> e.getGoodType() == 1).collect(Collectors.toList());
+
+		boolean temp = true;
+		// 新增欠费审批的订单处理
+		if (ObjectUtil.isNotEmpty(delivery.getOrgId())) {
+			Order order = orderDescClient.getById(delivery.getOrgId());
+			if (ObjectUtil.isNotEmpty(order) && order.getSpecialCheck() == 1 && order.getSpecialCheckStatus() == 3) {
+				temp = false;
 			}
 		}
-		if (CollectionUtils.isNotEmpty(collect)){
+
+		if (temp) {
+			// 判断要发货物的金额和已收金额的大小
+			if (delivery.getDeliveryType().equals(DeliveryEnum.DELIVER.getType())) {
+				R amount = this.deliveryAmount(collect, delivery.getTradeType());
+				if (!amount.isSuccess()) {
+					throw new RuntimeException(amount.getMsg());
+				}
+			}
+		}
+
+		if (CollectionUtils.isNotEmpty(collect)) {
 			for (DeliveryItems deliveryItems : collect) {
-				if (deliveryItems.getItemId() == null){
+				if (deliveryItems.getItemId() == null) {
 					throw new RuntimeException("发货明细中商品id不能为空");
 				}
-				deliveryItems.setPid(pId);//父级ID
-				deliveryItems.setTenantId(SecureUtil.getTenantId());//租户id
+				// 父级ID
+				deliveryItems.setPid(pId);
+				// 租户id
+				deliveryItems.setTenantId(SecureUtil.getTenantId());
 				deliveryItems.setDeliveryStatus(delivery.getDeliveryStatus());
-				if (deliveryItems.getId() == null){
+				if (deliveryItems.getId() == null) {
 					deliveryItems.setCreateUser(SecureUtil.getUserId());
 					deliveryItems.setCreateTime(new Date());
 					baseMapper.insert(deliveryItems);
-				}else {
+				} else {
 					deliveryItems.setUpdateTime(new Date());
 					deliveryItems.setUpdateUser(SecureUtil.getUserId());
 					baseMapper.updateById(deliveryItems);
 				}
-				StockGoods stockGoods=null;
+				StockGoods stockGoods = null;
 				StockGoodsVO stock = this.getStock(delivery.getTradeType(), deliveryItems.getCorpId(), delivery.getStorageId(), deliveryItems);
 				// todo 国内贸易暂定不更新库存
-				if (!delivery.getTradeType().equals(OrderTypeEnum.DOMESTIC.getType())){
-					if (stock != null && delivery.getDeliveryType() == DeliveryEnum.DELIVER.getType()){//发货
-						//更新库存账
+				if (!delivery.getTradeType().equals(OrderTypeEnum.DOMESTIC.getType())) {
+					// 发货
+					if (stock != null && delivery.getDeliveryType().equals(DeliveryEnum.DELIVER.getType())) {
+						// 更新库存账
 						stockGoods = this.deliverGoods(delivery.getTradeType(), stock.getId(), deliveryItems);
-
-					}else if (stock != null && delivery.getDeliveryType() == DeliveryEnum.REPEAL.getType()){ //撤销发货
+					// 撤销发货
+					} else if (stock != null && delivery.getDeliveryType().equals(DeliveryEnum.REPEAL.getType())) {
 						stockGoods = this.revocationDeliverGoods(delivery.getTradeType(), stock.getId(), deliveryItems);
-
-					}else {
+					} else {
 						//新增库存账
-						throw  new RuntimeException("库存为空");
+						throw new RuntimeException("库存为空");
 					}
 
 				}
 				// todo 更新订单明细中发货数量  采购和销售可能需要调不同接口
-				R actualQuantity = orderItemsClient.updateActualQuantity(deliveryItems.getSrcId(), deliveryItems.getActualQuantity(),delivery.getDeliveryType());
-				if (!actualQuantity.isSuccess()){
+				R actualQuantity = orderItemsClient.updateActualQuantity(deliveryItems.getSrcId(), deliveryItems.getActualQuantity(), delivery.getDeliveryType());
+				if (!actualQuantity.isSuccess()) {
 					throw new RuntimeException(actualQuantity.getMsg());
 				}
 				// todo 出口贸易确认发货修改发票重量
-				if (delivery.getTradeType().equals(OrderTypeEnum.IMPORT.getType())){
+				if (delivery.getTradeType().equals(OrderTypeEnum.IMPORT.getType())) {
 					R actualWeight = orderItemsClient.updateActualWeight(deliveryItems.getSrcId(), deliveryItems.getInvoiceWeight(), delivery.getDeliveryType());
-					if (!actualWeight.isSuccess()){
+					if (!actualWeight.isSuccess()) {
 						throw new RuntimeException("更新订单发票重量出错");
 					}
 				}
 				//更新发货明细库存字段
-				if (stockGoods != null){
+				if (stockGoods != null) {
 					deliveryItems.setInventoryNumber(stockGoods.getSurplusRouteQuantity());
-				}else if (stock != null){
+				} else if (stock != null) {
 					deliveryItems.setInventoryNumber(stock.getSurplusRouteQuantity());
-				}else {
+				} else {
 					deliveryItems.setInventoryNumber(BigDecimal.ZERO);
 				}
 				baseMapper.updateById(deliveryItems);
 			}
 		}
-		if (CollectionUtils.isNotEmpty(itemsList)){
-			itemsList.stream().forEach(item ->{
-				item.setPid(pId);//父级ID
-				item.setTenantId(SecureUtil.getTenantId());//租户id
+		if (CollectionUtils.isNotEmpty(itemsList)) {
+			itemsList.forEach(item -> {
+				// 父级ID
+				item.setPid(pId);
+				// 租户id
+				item.setTenantId(SecureUtil.getTenantId());
 				item.setDeliveryStatus(delivery.getDeliveryStatus());
-				if (item.getId() == null){
+				if (item.getId() == null) {
 					item.setCreateUser(SecureUtil.getUserId());
 					item.setCreateTime(new Date());
 					baseMapper.insert(item);
-				}else {
+				} else {
 					item.setUpdateTime(new Date());
 					item.setUpdateUser(SecureUtil.getUserId());
 					baseMapper.updateById(item);
 				}
 			});
 		}
-		//发货只会消费积分
-		if (delivery.getTradeType().equals(OrderTypeEnum.DOMESTIC.getType())){
+		// 发货只会消费积分
+		if (delivery.getTradeType().equals(OrderTypeEnum.DOMESTIC.getType())) {
 			R updatePoints = this.updatePoints(delivery, collect, itemsList);
-			if (!updatePoints.isSuccess()){
-				throw  new RuntimeException(updatePoints.getMsg());
+			if (!updatePoints.isSuccess()) {
+				throw new RuntimeException(updatePoints.getMsg());
 			}
 		}
 		return deliveryItemsList;

+ 4 - 1
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/excel/DatasetExcel.java

@@ -33,7 +33,10 @@ public class DatasetExcel {
 	@ExcelProperty(value = "所属公司")
 	private String belongCompany;
 
-	@ExcelProperty(value = "商品名称")
+	@ExcelProperty(value = "产品编码")
+	private String goodsCode;
+
+	@ExcelProperty(value = "产品名称")
 	private String goodsName;
 
 	@ExcelProperty(value = "规格")

+ 1 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/mapper/OrderItemsMapper.xml

@@ -462,6 +462,7 @@ WHERE
                t3.cname           as corpName,
                t2.corp_name       as gysName,
                t1.belong_company  as belongCompany,
+               t4.code            as goodsCode,
                t4.cname           as goodsName,
                t4.Typeno          as typeNo,
                t4.brand_item      as brandItem,

+ 1 - 1
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/impl/OrderServiceImpl.java

@@ -683,7 +683,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	@GlobalTransactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
 	public void checkOrder(Order order) {
 		Order salesOrder = baseMapper.selectById(order.getId());
 		if (order.getCheckFlag() != 3 && salesOrder.getStatus() != 0) {

+ 9 - 0
blade-service/blade-stock/src/main/java/org/springblade/stock/controller/StockGoodsController.java

@@ -42,6 +42,7 @@ import org.springblade.core.tool.utils.Func;
 import org.springblade.stock.entity.StockGoods;
 import org.springblade.stock.excel.StockGoodsExcel;
 import org.springblade.stock.service.IStockGoodsService;
+import org.springblade.stock.vo.AppStockVO;
 import org.springblade.stock.vo.StockGoodsVO;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
@@ -347,5 +348,13 @@ public class StockGoodsController extends BladeController {
 		return R.data(detail);
 	}
 
+	/**
+	 * 自定义分页 手机端库存
+	 */
+	@GetMapping("/app-page")
+	public R<IPage<AppStockVO>> page(AppStockVO appStockVO, Query query) {
+		IPage<AppStockVO> pages = stockGoodsService.selectAppStockPage(Condition.getPage(query), appStockVO);
+		return R.data(pages);
+	}
 
 }

+ 7 - 3
blade-service/blade-stock/src/main/java/org/springblade/stock/mapper/StockGoodsMapper.java

@@ -16,11 +16,13 @@
  */
 package org.springblade.stock.mapper;
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.apache.ibatis.annotations.Param;
 import org.springblade.stock.entity.StockGoods;
+import org.springblade.stock.vo.AppStockVO;
 import org.springblade.stock.vo.StockGoodsVO;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
+
 import java.util.List;
 
 /**
@@ -40,6 +42,8 @@ public interface StockGoodsMapper extends BaseMapper<StockGoods> {
 	 */
 	List<StockGoodsVO> selectStockGoodsPage(IPage page, StockGoodsVO stockGoods);
 
-	IPage<StockGoods> groupByStock(IPage<StockGoods> iPage,@Param("tenantId") String tenantId,@Param("contractNumber") String contractNumber,@Param("billNo") String billNo,@Param("goodId") Long goodId,@Param("createStartTime") String createStartTime,@Param("createEndTime") String createEndTime);
+	IPage<StockGoods> groupByStock(IPage<StockGoods> iPage, @Param("tenantId") String tenantId, @Param("contractNumber") String contractNumber, @Param("billNo") String billNo, @Param("goodId") Long goodId, @Param("createStartTime") String createStartTime, @Param("createEndTime") String createEndTime);
+
+	List<AppStockVO> selectAppStockPage(IPage<AppStockVO> page, @Param("stock") AppStockVO appStockVO);
 
 }

+ 26 - 0
blade-service/blade-stock/src/main/java/org/springblade/stock/mapper/StockGoodsMapper.xml

@@ -90,4 +90,30 @@
 	a.goods_id
     </select>
 
+    <select id="selectAppStockPage" resultType="org.springblade.stock.vo.AppStockVO">
+        select t1.id,
+               t2.cname as goods,
+               t3.cname as storage,
+               t1.surplus_route_quantity as balance,
+               t2.brand_item as brandItem,
+               t4.sales_price as salesPrice
+        from business_stock_goods t1
+                 left join basic_goods_desc t2 on t1.goods_id = t2.id
+                 left join basic_storage_desc t3 on t1.storage_id = t3.id
+                 left join basic_price_item t4 on t4.code = t2.code
+        <where>
+            t1.is_deleted = 0
+            and t1.surplus_route_quantity > 0
+            and t4.is_deleted = 0
+            and t1.tenant_id = #{stock.tenantId}
+            and t4.tenant_id = #{stock.tenantId}
+            <if test="stock.goodsInt != null and stock.goodsInt != ''">
+                and t2.cname_int like concat('%', #{stock.goodsInt}, '%')
+            </if>
+            <if test="stock.brand != null and stock.brand != ''">
+                and t2.brand = #{stock.brand}
+            </if>
+        </where>
+    </select>
+
 </mapper>

+ 26 - 12
blade-service/blade-stock/src/main/java/org/springblade/stock/service/IStockGoodsService.java

@@ -17,13 +17,13 @@
 package org.springblade.stock.service;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import org.apache.ibatis.annotations.Param;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
 import org.springblade.core.tool.api.R;
 import org.springblade.stock.entity.StockGoods;
 import org.springblade.stock.excel.StockGoodsExcel;
+import org.springblade.stock.vo.AppStockVO;
 import org.springblade.stock.vo.StockGoodsVO;
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 
 import java.util.List;
 
@@ -46,21 +46,24 @@ public interface IStockGoodsService extends IService<StockGoods> {
 
 	/**
 	 * 查询库存总账 是否存在
-	 * @param corpId 客户id
-	 * @param storageId 仓库id
-	 * @param goodId 商品id
-	 * @param itemType 产品规格型号
-	 * @param lotNo 批次号
-	 * @param cntrNo 箱号
-	 * @param billNo 提单号
+	 *
+	 * @param corpId         客户id
+	 * @param storageId      仓库id
+	 * @param goodId         商品id
+	 * @param itemType       产品规格型号
+	 * @param lotNo          批次号
+	 * @param cntrNo         箱号
+	 * @param billNo         提单号
 	 * @param contractNumber 合同号
 	 * @return
 	 */
-	StockGoodsVO selectStock(Long corpId,Long storageId,Long goodId,String itemType,String lotNo,String cntrNo,String billNo,String contractNumber,String tradeType);
+	StockGoodsVO selectStock(Long corpId, Long storageId, Long goodId, String itemType, String lotNo, String cntrNo, String billNo, String contractNumber, String tradeType);
+
 	/**
 	 * 新增库存总账
 	 */
 	boolean saveStock(StockGoods stockGoods);
+
 	/**
 	 * 导入库存账数据
 	 *
@@ -69,21 +72,32 @@ public interface IStockGoodsService extends IService<StockGoods> {
 	 * @return
 	 */
 	R importUser(List<StockGoodsExcel> data, Boolean isCovered);
+
 	/**
 	 * 查询库存信息
+	 *
 	 * @return
 	 */
 	IPage<StockGoods> listMessage(IPage<StockGoods> page, QueryWrapper<StockGoods> queryWrapper);
 
 	/**
 	 * 保存或修改库存账
+	 *
 	 * @param stockGoods
 	 * @return
 	 */
 	R<StockGoods> updateMessage(StockGoods stockGoods);
 
 
-	IPage<StockGoods> groupByStock(IPage<StockGoods> iPage, @Param("tenantId") String tenantId, @Param("contractNumber") String contractNumber, @Param("billNo") String billNo, @Param("goodId") Long goodId, @Param("createStartTime") String createStartTime, @Param("createEndTime") String createEndTime);
+	IPage<StockGoods> groupByStock(IPage<StockGoods> iPage, String tenantId, String contractNumber, String billNo, Long goodId, String createStartTime, String createEndTime);
 
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param appStockVO
+	 * @return
+	 */
+	IPage<AppStockVO> selectAppStockPage(IPage<AppStockVO> page, AppStockVO appStockVO);
 
 }

+ 90 - 74
blade-service/blade-stock/src/main/java/org/springblade/stock/service/impl/StockGoodsServiceImpl.java

@@ -18,11 +18,11 @@ package org.springblade.stock.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.AllArgsConstructor;
-import org.apache.ibatis.annotations.Param;
 import org.springblade.client.entity.CorpsDesc;
 import org.springblade.client.entity.GoodsDesc;
 import org.springblade.client.entity.StorageDesc;
@@ -37,14 +37,13 @@ import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.stock.entity.StockGoods;
 import org.springblade.stock.excel.StockGoodsExcel;
-import org.springblade.stock.vo.StockGoodsVO;
 import org.springblade.stock.mapper.StockGoodsMapper;
 import org.springblade.stock.service.IStockGoodsService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.stock.vo.AppStockVO;
+import org.springblade.stock.vo.StockGoodsVO;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
 import org.springframework.stereotype.Service;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
@@ -60,10 +59,20 @@ import java.util.List;
 @Service
 @AllArgsConstructor
 public class StockGoodsServiceImpl extends ServiceImpl<StockGoodsMapper, StockGoods> implements IStockGoodsService {
-	private ICorpsDescClient corpsDescClient;//获取客户信息
-	private IGoodsDescClient goodsDescClient;//商品信息
-	private IUserClient userClient;//用户信息
-	private IStorageClient storageClient;
+	/**
+	 * 获取客户信息
+	 */
+	private final ICorpsDescClient corpsDescClient;
+	/**
+	 * 商品信息
+	 */
+	private final IGoodsDescClient goodsDescClient;
+	/**
+	 * 用户信息
+	 */
+	private final IUserClient userClient;
+	private final IStorageClient storageClient;
+
 	@Override
 	public IPage<StockGoodsVO> selectStockGoodsPage(IPage<StockGoodsVO> page, StockGoodsVO stockGoods) {
 		return page.setRecords(baseMapper.selectStockGoodsPage(page, stockGoods));
@@ -71,32 +80,33 @@ public class StockGoodsServiceImpl extends ServiceImpl<StockGoodsMapper, StockGo
 
 	/**
 	 * 查询库存总账 是否存在
-	 * @param corpId 客户id
-	 * @param storageId 仓库id
-	 * @param goodId 商品id
-	 * @param itemType 产品规格型号
-	 * @param lotNo 批次号
-	 * @param cntrNo 箱号
-	 * @param billNo 提单号
+	 *
+	 * @param corpId         客户id
+	 * @param storageId      仓库id
+	 * @param goodId         商品id
+	 * @param itemType       产品规格型号
+	 * @param lotNo          批次号
+	 * @param cntrNo         箱号
+	 * @param billNo         提单号
 	 * @param contractNumber 合同号
 	 * @return
 	 */
 	@Override
-	public StockGoodsVO selectStock(Long corpId,Long storageId,Long goodId,String itemType,String lotNo,String cntrNo,String billNo,String contractNumber,String tradeType) {
-		LambdaQueryWrapper<StockGoods> lambdaQueryWrapper = new LambdaQueryWrapper();
-		lambdaQueryWrapper.eq(Func.isNotEmpty(corpId),StockGoods::getCorpId,corpId);//客户id
-		lambdaQueryWrapper.eq(Func.isNotEmpty(storageId),StockGoods::getStorageId,storageId);//仓库id
-		lambdaQueryWrapper.isNull(Func.isNull(storageId),StockGoods::getStorageId);//仓库id
-		lambdaQueryWrapper.eq(Func.isNotEmpty(goodId),StockGoods::getGoodsId,goodId);//商品id
-		lambdaQueryWrapper.eq(Func.isNotEmpty(itemType),StockGoods::getItemType,itemType);//产品型号
-		lambdaQueryWrapper.isNull(Func.isEmpty(itemType),StockGoods::getItemType);//产品型号
-		lambdaQueryWrapper.eq(Func.isNotEmpty(lotNo),StockGoods::getLotNo,lotNo);//批次号
-		lambdaQueryWrapper.isNull(Func.isEmpty(lotNo),StockGoods::getLotNo);//批次号
-		lambdaQueryWrapper.eq(StockGoods::getTenantId,SecureUtil.getTenantId());//租户
-		lambdaQueryWrapper.eq(Func.isNotEmpty(tradeType),StockGoods::getTradeType,tradeType);
-		lambdaQueryWrapper.eq(Func.isNotEmpty(cntrNo),StockGoods::getCntrNo,cntrNo);//收货单 箱号
-		lambdaQueryWrapper.eq(Func.isNotEmpty(billNo),StockGoods::getBillNo,billNo);//收货单 提单号
-		lambdaQueryWrapper.eq(Func.isNotEmpty(contractNumber),StockGoods::getContractNumber,contractNumber);//收货单 合同号
+	public StockGoodsVO selectStock(Long corpId, Long storageId, Long goodId, String itemType, String lotNo, String cntrNo, String billNo, String contractNumber, String tradeType) {
+		LambdaQueryWrapper<StockGoods> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(Func.isNotEmpty(corpId), StockGoods::getCorpId, corpId);//客户id
+		lambdaQueryWrapper.eq(Func.isNotEmpty(storageId), StockGoods::getStorageId, storageId);//仓库id
+		lambdaQueryWrapper.isNull(Func.isNull(storageId), StockGoods::getStorageId);//仓库id
+		lambdaQueryWrapper.eq(Func.isNotEmpty(goodId), StockGoods::getGoodsId, goodId);//商品id
+		lambdaQueryWrapper.eq(Func.isNotEmpty(itemType), StockGoods::getItemType, itemType);//产品型号
+		lambdaQueryWrapper.isNull(Func.isEmpty(itemType), StockGoods::getItemType);//产品型号
+		lambdaQueryWrapper.eq(Func.isNotEmpty(lotNo), StockGoods::getLotNo, lotNo);//批次号
+		lambdaQueryWrapper.isNull(Func.isEmpty(lotNo), StockGoods::getLotNo);//批次号
+		lambdaQueryWrapper.eq(StockGoods::getTenantId, SecureUtil.getTenantId());//租户
+		lambdaQueryWrapper.eq(Func.isNotEmpty(tradeType), StockGoods::getTradeType, tradeType);
+		lambdaQueryWrapper.eq(Func.isNotEmpty(cntrNo), StockGoods::getCntrNo, cntrNo);//收货单 箱号
+		lambdaQueryWrapper.eq(Func.isNotEmpty(billNo), StockGoods::getBillNo, billNo);//收货单 提单号
+		lambdaQueryWrapper.eq(Func.isNotEmpty(contractNumber), StockGoods::getContractNumber, contractNumber);//收货单 合同号
 
 		StockGoods stockGoods = baseMapper.selectOne(lambdaQueryWrapper);
 		return BeanUtil.copy(stockGoods, StockGoodsVO.class);
@@ -104,11 +114,12 @@ public class StockGoodsServiceImpl extends ServiceImpl<StockGoodsMapper, StockGo
 
 	/**
 	 * 新增库存账接口
+	 *
 	 * @param stockGoods
 	 * @return
 	 */
 	@Override
-	public boolean  saveStock(StockGoods stockGoods) {
+	public boolean saveStock(StockGoods stockGoods) {
 		stockGoods.setTenantId(SecureUtil.getTenantId());
 		stockGoods.setCreateUser(SecureUtil.getUserId());
 		stockGoods.setCreateTime(new Date());
@@ -133,69 +144,69 @@ public class StockGoodsServiceImpl extends ServiceImpl<StockGoodsMapper, StockGo
 			stockGoods.setTenantId(SecureUtil.getTenantId());
 			//获取商品id
 			R<GoodsDesc> goodsDesc = goodsDescClient.GoodsByCode(datum.getCode());
-			if (goodsDesc.isSuccess() && goodsDesc.getData() != null){
+			if (goodsDesc.isSuccess() && goodsDesc.getData() != null) {
 				stockGoods.setGoodsId(goodsDesc.getData().getId());
-				if (StringUtils.isNotBlank(goodsDesc.getData().getBrand())){
+				if (StringUtils.isNotBlank(goodsDesc.getData().getBrand())) {
 					stockGoods.setBrand(goodsDesc.getData().getBrand());
 				}
-				if (StringUtils.isNotBlank(goodsDesc.getData().getBrandItem())){
+				if (StringUtils.isNotBlank(goodsDesc.getData().getBrandItem())) {
 					stockGoods.setBrandItem(goodsDesc.getData().getBrandItem());
 				}
-				if (StringUtils.isNotBlank(goodsDesc.getData().getTypeno())){
+				if (StringUtils.isNotBlank(goodsDesc.getData().getTypeno())) {
 					stockGoods.setTypeno(goodsDesc.getData().getTypeno());
 					stockGoods.setItemType(goodsDesc.getData().getTypeno());
 				}
-				if (StringUtils.isNotBlank(goodsDesc.getData().getSpecsOne())){
+				if (StringUtils.isNotBlank(goodsDesc.getData().getSpecsOne())) {
 					stockGoods.setTypenoOne(goodsDesc.getData().getSpecsOne());
 				}
-				if (StringUtils.isNotBlank(goodsDesc.getData().getSpecsTwo())){
+				if (StringUtils.isNotBlank(goodsDesc.getData().getSpecsTwo())) {
 					stockGoods.setTypenoTwo(goodsDesc.getData().getSpecsTwo());
 				}
-				if (StringUtils.isNotBlank(goodsDesc.getData().getPlaceProduction())){
+				if (StringUtils.isNotBlank(goodsDesc.getData().getPlaceProduction())) {
 					stockGoods.setPlaceProduction(goodsDesc.getData().getPlaceProduction());
 				}
 				stockGoods.setCname(goodsDesc.getData().getCname());
 				stockGoods.setCode(goodsDesc.getData().getCode());
-			}else {
+			} else {
 				good.append(datum.getCode());
 				continue;
 			}
 			//获取客户id
-			if (StringUtils.isNotBlank(datum.getCorpName())){
+			if (StringUtils.isNotBlank(datum.getCorpName())) {
 				R<CorpsDesc> corpsDesc = corpsDescClient.getCorpByName(datum.getCorpName(), SecureUtil.getTenantId());
-				if (corpsDesc.isSuccess() && corpsDesc.getData() != null){
+				if (corpsDesc.isSuccess() && corpsDesc.getData() != null) {
 					stockGoods.setCorpId(corpsDesc.getData().getId());
 					stockGoods.setCorpName(corpsDesc.getData().getCname());
 				}
-			}else if (StringUtils.isBlank(datum.getCorpName()) && goodsDesc.getData().getCorpId() != null){
+			} else if (StringUtils.isBlank(datum.getCorpName()) && goodsDesc.getData().getCorpId() != null) {
 				stockGoods.setCorpId(goodsDesc.getData().getCorpId());
 				stockGoods.setCorpName(goodsDesc.getData().getCorpName());
-			}else {
+			} else {
 				corp.append(datum.getCode());
 				continue;
 			}
-			if (stockGoods.getCorpId() == null){
+			if (stockGoods.getCorpId() == null) {
 				corp.append(datum.getCode());
 				continue;
 			}
 			//获取仓库id
 			StorageDesc storageDesc = storageClient.getName(datum.getStorageName());
-			if (storageDesc != null){
+			if (storageDesc != null) {
 				stockGoods.setStorageId(storageDesc.getId());
-			}else {
+			} else {
 				storage.append(datum.getCode());
 				continue;
 			}
 			//查询库存账
 			StockGoods goods = baseMapper.selectOne(new QueryWrapper<StockGoods>().eq("goods_id", stockGoods.getGoodsId())
 				.eq("corp_id", stockGoods.getCorpId()).eq("tenant_id", SecureUtil.getTenantId()).eq("is_deleted", 0)
-			.eq("item_type",stockGoods.getItemType()).eq("storage_id",stockGoods.getStorageId()));
-			if (goods == null){
+				.eq("item_type", stockGoods.getItemType()).eq("storage_id", stockGoods.getStorageId()));
+			if (goods == null) {
 				stockGoods.setCreateTime(new Date());
 				stockGoods.setCreateUser(SecureUtil.getUserId());
 				stockGoods.setLockingQuantity(BigDecimal.ZERO);//锁定数量
 				baseMapper.insert(stockGoods);
-			}else {
+			} else {
 				stockGoods.setUpdateUser(SecureUtil.getUserId());
 				stockGoods.setUpdateTime(new Date());
 				stockGoods.setId(goods.getId());
@@ -204,33 +215,33 @@ public class StockGoodsServiceImpl extends ServiceImpl<StockGoodsMapper, StockGo
 			}
 		}
 		String message = new String("导入成功");
-		if (StringUtils.isNotBlank(good)){
-			message = message + "在基础资料中未查到商品信息的商品有:" +good.toString();
+		if (StringUtils.isNotBlank(good)) {
+			message = message + "在基础资料中未查到商品信息的商品有:" + good.toString();
 		}
-		if (StringUtils.isNotBlank(corp)){
-			message = message + "在基础资料中未查到供应商的商品有:" +corp.toString();
+		if (StringUtils.isNotBlank(corp)) {
+			message = message + "在基础资料中未查到供应商的商品有:" + corp.toString();
 		}
-		if (StringUtils.isNotBlank(storage)){
-			message = message + "在基础资料中未查到仓库信息的商品有:" +storage.toString();
+		if (StringUtils.isNotBlank(storage)) {
+			message = message + "在基础资料中未查到仓库信息的商品有:" + storage.toString();
 		}
 		return R.data(message);
 	}
 
 	@Override
 	public IPage<StockGoods> listMessage(IPage<StockGoods> page, QueryWrapper<StockGoods> queryWrapper) {
-		IPage<StockGoods> stockGoodsIPage = baseMapper.selectPage(page, queryWrapper);
-		if (CollectionUtils.isNotEmpty(stockGoodsIPage.getRecords())){
-			stockGoodsIPage.getRecords().stream().forEach(item ->{
+		IPage<StockGoods> stockGoodsPage = baseMapper.selectPage(page, queryWrapper);
+		if (CollectionUtils.isNotEmpty(stockGoodsPage.getRecords())) {
+			stockGoodsPage.getRecords().forEach(item -> {
 				//获取商品信息
 				R<GoodsDescVO> goodsMessage = goodsDescClient.selectGoodsMessage(item.getGoodsId());
-				if (goodsMessage.isSuccess() && goodsMessage.getData() != null){
-					if (StringUtils.isNotBlank(goodsMessage.getData().getBrand())){
+				if (goodsMessage.isSuccess() && goodsMessage.getData() != null) {
+					if (StringUtils.isNotBlank(goodsMessage.getData().getBrand())) {
 						item.setBrand(goodsMessage.getData().getBrand());
 					}
-					if (StringUtils.isNotBlank(goodsMessage.getData().getBrandItem())){
+					if (StringUtils.isNotBlank(goodsMessage.getData().getBrandItem())) {
 						item.setBrandItem(goodsMessage.getData().getBrandItem());
 					}
-					if (StringUtils.isNotBlank(goodsMessage.getData().getTypeno())){
+					if (StringUtils.isNotBlank(goodsMessage.getData().getTypeno())) {
 						item.setTypeno(goodsMessage.getData().getTypeno());
 					}
 					item.setCname(goodsMessage.getData().getCname());
@@ -238,35 +249,35 @@ public class StockGoodsServiceImpl extends ServiceImpl<StockGoodsMapper, StockGo
 				}
 				//获取客户信息
 				R<CorpsDesc> corpMessage = corpsDescClient.getCorpMessage(item.getCorpId());
-				if (corpMessage.isSuccess() && corpMessage.getData() != null){
+				if (corpMessage.isSuccess() && corpMessage.getData() != null) {
 					item.setCorpName(corpMessage.getData().getCname());
 				}
 				//获取用户信息
-				if (item.getCreateUser() != null){
+				if (item.getCreateUser() != null) {
 					R<User> createUser = userClient.userInfoById(item.getCreateUser());
-					if (createUser.isSuccess() && createUser.getData() != null){
+					if (createUser.isSuccess() && createUser.getData() != null) {
 						item.setCreateUserName(createUser.getData().getName());
 					}
 				}
-				if (item.getUpdateUser() != null){
+				if (item.getUpdateUser() != null) {
 					R<User> updateUser = userClient.userInfoById(item.getUpdateUser());
-					if (updateUser.isSuccess() && updateUser.getData() != null){
+					if (updateUser.isSuccess() && updateUser.getData() != null) {
 						item.setUpdateUserName(updateUser.getData().getName());
 					}
 				}
 			});
 		}
-		return stockGoodsIPage;
+		return stockGoodsPage;
 	}
 
 	@Override
 	public R<StockGoods> updateMessage(StockGoods stockGoods) {
-		if (stockGoods.getId() == null){
+		if (stockGoods.getId() == null) {
 			stockGoods.setCreateTime(new Date());
 			stockGoods.setCreateUser(SecureUtil.getUserId());
 			stockGoods.setTenantId(SecureUtil.getTenantId());
 			baseMapper.insert(stockGoods);
-		}else {
+		} else {
 			stockGoods.setUpdateUser(SecureUtil.getUserId());
 			stockGoods.setUpdateTime(new Date());
 			baseMapper.updateById(stockGoods);
@@ -275,9 +286,14 @@ public class StockGoodsServiceImpl extends ServiceImpl<StockGoodsMapper, StockGo
 	}
 
 	@Override
-	public IPage<StockGoods> groupByStock(IPage<StockGoods> iPage,  String tenantId,  String contractNumber,  String billNo,Long goodId,  String createStartTime,  String createEndTime)
-	{
-		return baseMapper.groupByStock(iPage,AuthUtil.getTenantId(),contractNumber,billNo,goodId,createStartTime,createEndTime);
+	public IPage<StockGoods> groupByStock(IPage<StockGoods> iPage, String tenantId, String contractNumber, String billNo, Long goodId, String createStartTime, String createEndTime) {
+		return baseMapper.groupByStock(iPage, AuthUtil.getTenantId(), contractNumber, billNo, goodId, createStartTime, createEndTime);
+	}
+
+	@Override
+	public IPage<AppStockVO> selectAppStockPage(IPage<AppStockVO> page, AppStockVO appStockVO) {
+		appStockVO.setTenantId(AuthUtil.getTenantId());
+		return page.setRecords(baseMapper.selectAppStockPage(page, appStockVO));
 	}
 
 }