Browse Source

20230417 17:58

wangzhuo 2 years ago
parent
commit
09acbc2374

+ 7 - 1
blade-service-api/blade-stock-api/src/main/java/org/springblade/stock/vo/AppStockPartsExcel.java

@@ -42,7 +42,7 @@ public class AppStockPartsExcel {
 	 * 仓库结余
 	 */
 	@ExcelProperty("仓库结余")
-	private String storageBalance;
+	private BigDecimal balance;
 
 
 	/**
@@ -62,4 +62,10 @@ public class AppStockPartsExcel {
 	@ExcelProperty("库存均价")
 	private BigDecimal stockPrice;
 
+	/**
+	 * 结余金额
+	 */
+	@ExcelProperty("结余金额")
+	private BigDecimal balanceAmount;
+
 }

+ 5 - 0
blade-service-api/blade-stock-api/src/main/java/org/springblade/stock/vo/AppStockPartsVO.java

@@ -211,4 +211,9 @@ public class AppStockPartsVO {
 	 */
 	private String userType;
 
+	/**
+	 * 库存查询条件(1 大于0,2 等于0,3 小于0)
+	 */
+	private String inventoryConditions;
+
 }

+ 3 - 11
blade-service/blade-client/src/main/java/org/springblade/client/goods/controller/GoodsDescController.java

@@ -663,18 +663,10 @@ public class GoodsDescController extends BladeController {
 			}
 			if (ObjectUtils.isNotNull(storageId)) {
 				R<StockGoodsVO> r = stockGoodsClient.selectStockParts(null, storageId, good.getId(), null, null, null, null, null, null);
-				if ("XS".equals(billType)) {
-					if (r.isSuccess() && ObjectUtils.isNotNull(r.getData())) {
-						good.setStockGoods(r.getData());
-						goodsDescList.add(good);
-					}
-				} else {
-					if (r.isSuccess() && ObjectUtils.isNotNull(r.getData())) {
-						good.setStockGoods(r.getData());
-					}
-					goodsDescList.add(good);
+				if (r.isSuccess() && ObjectUtils.isNotNull(r.getData())) {
+					good.setStockGoods(r.getData());
 				}
-
+				goodsDescList.add(good);
 			}
 
 		});

+ 3 - 0
blade-service/blade-client/src/main/java/org/springblade/client/goods/service/impl/GoodsDescServiceImpl.java

@@ -906,15 +906,18 @@ public class GoodsDescServiceImpl extends ServiceImpl<GoodsDescMapper, GoodsDesc
 						r.getData().setBalanceQuantity(balanceQuantity);
 						r.getData().setBalanceAmount(balanceAmount);
 						r.getData().setStockPrice(stockPrice);
+						r.getData().setStorageId(storageDesc.getId());
 						stockGoodsClient.updateStock(r.getData());
 					} else {
 						StockGoods stockGoods = new StockGoods();
 						stockGoods.setSurplusRouteQuantity(e.getQuantity());
+						stockGoods.setBalanceQuantity(e.getQuantity());
 						stockGoods.setPurchasePrice(goodsDesc.getPurchasePrice());
 						stockGoods.setStockPrice(goodsDesc.getPurchasePrice());
 						stockGoods.setBalanceAmount(e.getQuantity().multiply(goodsDesc.getPurchasePrice()));
 						stockGoods.setTenantId(AuthUtil.getTenantId());
 						stockGoods.setGoodsId(goodsDesc.getId());
+						stockGoods.setStorageId(storageDesc.getId());
 						stockGoodsClient.saveStock(stockGoods);
 					}
 				}

+ 0 - 7
blade-service/blade-land/pom.xml

@@ -82,13 +82,6 @@
             <scope>system</scope>
             <systemPath>${project.basedir}/src/main/resources/lib/sinoiov.jar</systemPath>
         </dependency>
-        <dependency>
-            <groupId>com.apigwclient</groupId>
-            <artifactId>apigwclient-sdk</artifactId>
-            <version>2.0</version>
-            <scope>system</scope>
-            <systemPath>${project.basedir}/src/main/resources/lib/apigwclient-0.1.2.jar</systemPath>
-        </dependency>
 
     </dependencies>
 </project>

+ 2 - 2
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/impl/OrderItemsServiceImpl.java

@@ -287,10 +287,10 @@ public class OrderItemsServiceImpl extends ServiceImpl<OrderItemsMapper, OrderIt
 		List<OrderItems> orderItemsList = new ArrayList<>();
 		if (CollectionUtils.isEmpty(order.getOrderItemIds())) {
 			orderItemsList = baseMapper.selectList(new QueryWrapper<OrderItems>().eq("pid", order.getId())
-				.eq("tenant_id", SecureUtil.getTenantId()).eq("is_deleted", 0).orderByAsc("sort"));
+				.eq("tenant_id", SecureUtil.getTenantId()).eq("is_deleted", 0));
 		} else {
 			orderItemsList = baseMapper.selectList(new QueryWrapper<OrderItems>().eq("pid", order.getId())
-				.eq("tenant_id", SecureUtil.getTenantId()).eq("is_deleted", 0).in("id", order.getOrderItemIds()).orderByAsc("sort"));
+				.eq("tenant_id", SecureUtil.getTenantId()).eq("is_deleted", 0).in("id", order.getOrderItemIds()));
 		}
 		String itemIds = "";//商品id拼接
 		String updateUserIds = "";//修改人id拼接

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

@@ -521,6 +521,66 @@ public class StockGoodsController extends BladeController {
 	}
 
 	/**
+	 * 查询库存总数量和总金额
+	 */
+	@GetMapping("/stockPartsTotal")
+	public R stockPartsTotal(HttpServletRequest request, AppStockPartsVO appStockPartsVO, Query query) {
+		System.out.println("Blade-Auth=" + request.getHeader("Blade-Auth"));
+		if (ObjectUtils.isNull(request.getHeader("Blade-Auth"))) {
+			// 获取租户信息
+			R<Tenant> tenant = sysClient.getTenantByAppId(request.getHeader("appId"));
+			if (tenant.isSuccess() && ObjectUtils.isNotNull(tenant.getData())) {
+				appStockPartsVO.setTenantId(tenant.getData().getTenantId());
+			} else {
+				throw new RuntimeException("获取数据失败");
+			}
+		} else {
+			appStockPartsVO.setTenantId(AuthUtil.getTenantId());
+		}
+		if (appStockPartsVO.getLabel() != null && appStockPartsVO.getLabel().length > 0) {
+			appStockPartsVO.setLabels(StringUtil.join(appStockPartsVO.getLabel(), ","));
+		}
+		if (ObjectUtils.isNotNull(appStockPartsVO.getGoodsTypeId())) {
+			List<GoodsType> goodsTypeList = goodsDescClient.getGoodsTypeId(appStockPartsVO.getGoodsTypeId());
+			if (ObjectUtils.isNotNull(goodsTypeList) && goodsTypeList.size() > 0) {
+				List<Long> idList = goodsTypeList.stream().map(GoodsType::getId).distinct().collect(Collectors.toList());
+				StringBuilder ids = new StringBuilder();
+				for (Long id : idList) {
+					ids.append(id).append(",");
+				}
+				ids.append(appStockPartsVO.getGoodsTypeId());
+				appStockPartsVO.setGoodsTypeId(ids.toString());
+			}
+		}
+		String shoppingMall = "";
+		if (AuthUtil.getUserRole().equals("客户")) {
+			CorpsAttn corpsAttn = corpsAttnClient.getUser(AuthUtil.getUserId());
+			if (ObjectUtils.isNull(corpsAttn)) {
+				throw new RuntimeException("未查到用户信息");
+			} else {
+				CorpsDesc corpsDesc = corpsDescClient.getCorpId(corpsAttn.getPid());
+				if (ObjectUtils.isNull(corpsDesc)) {
+					throw new RuntimeException("未查到用户信息");
+				} else {
+					shoppingMall = corpsDesc.getShoppingMall();
+				}
+			}
+		} else {
+			shoppingMall = "游客";
+		}
+		appStockPartsVO.setUserType(shoppingMall);
+
+		List<AppStockPartsVO> list = stockGoodsService.selectAppStockPartsList(appStockPartsVO);
+
+		Map<String, Object> map = new HashMap<>();
+		BigDecimal balanceTotal = list.stream().map(AppStockPartsVO::getBalance).reduce(BigDecimal.ZERO, BigDecimal::add);//数量合计
+		BigDecimal balanceAmountTotal = list.stream().map(AppStockPartsVO::getBalanceAmount).reduce(BigDecimal.ZERO, BigDecimal::add);//金额合计
+		map.put("balanceTotal", balanceTotal);
+		map.put("balanceAmountTotal", balanceAmountTotal);
+		return R.data(map);
+	}
+
+	/**
 	 * 手机端库存商品详情(新-配件)
 	 */
 	@GetMapping("/app-stockPartsDetails")

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

@@ -176,12 +176,24 @@
             <if test="stock.goodsTypeId != null and stock.goodsTypeId != ''">
                 and find_in_set(t4.id,#{stock.goodsTypeId})
             </if>
-            <if test="stock.labels != null and stock.labels != ''">
-                and find_in_set(#{stock.labels},t3.label)
+            <if test="stock.goodsType != null and stock.goodsType != ''">
+                and t4.cname like CONCAT(CONCAT('%', #{stock.goodsType}), '%')
             </if>
-            <if test="stock.storageId != null">
+            <if test="stock.storageId != null and stock.storageId != ''">
                 and t1.storage_id = #{stock.storageId}
             </if>
+            <if test='stock.inventoryConditions != null and stock.inventoryConditions != "" and stock.inventoryConditions == "1"'>
+                AND t1.surplus_route_quantity > 0
+            </if>
+            <if test='stock.inventoryConditions != null and stock.inventoryConditions != "" and stock.inventoryConditions == "2"'>
+                AND t1.surplus_route_quantity = 0
+            </if>
+            <if test='stock.inventoryConditions != null and stock.inventoryConditions != "" and stock.inventoryConditions == "3"'>
+                AND t1.surplus_route_quantity &lt; 0
+            </if>
+            <if test="stock.labels != null and stock.labels != ''">
+                and find_in_set(#{stock.labels},t3.label)
+            </if>
             <if test="stock.goodsId != null">
                 and t1.goods_id = #{stock.goodsId}
             </if>
@@ -313,6 +325,21 @@
             <if test="stock.goodsTypeId != null">
                 and t4.id = #{stock.goodsTypeId}
             </if>
+            <if test="stock.goodsType != null and stock.goodsType != ''">
+                and t4.cname like CONCAT(CONCAT('%', #{stock.goodsType}), '%')
+            </if>
+            <if test="stock.storageId != null and stock.storageId != ''">
+                and t1.storage_id = #{stock.storage}
+            </if>
+            <if test='stock.inventoryConditions != null and stock.inventoryConditions != "" and stock.inventoryConditions == "1"'>
+                AND t1.surplus_route_quantity > 0
+            </if>
+            <if test='stock.inventoryConditions != null and stock.inventoryConditions != "" and stock.inventoryConditions == "2"'>
+                AND t1.surplus_route_quantity = 0
+            </if>
+            <if test='stock.inventoryConditions != null and stock.inventoryConditions != "" and stock.inventoryConditions == "3"'>
+                AND t1.surplus_route_quantity &lt; 0
+            </if>
             <if test="stock.labels != null and stock.labels != ''">
                 and find_in_set(t3.label,#{stock.labels})
             </if>

+ 7 - 1
blade-service/trade-purchase/pom.xml

@@ -109,7 +109,13 @@
             <version>2.8.2.RELEASE</version>
             <scope>compile</scope>
         </dependency>
-
+        <dependency>
+            <groupId>com.apigwclient</groupId>
+            <artifactId>apigwclient-sdk</artifactId>
+            <version>2.0</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/src/main/resources/lib/apigwclient-0.1.2.jar</systemPath>
+        </dependency>
     </dependencies>
 
 

+ 165 - 0
blade-service/trade-purchase/src/main/java/com/trade/purchase/extra/service/impl/ClaimServiceImpl.java

@@ -21,6 +21,13 @@ 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.extension.service.impl.ServiceImpl;
+import com.google.common.base.Ascii;
+import com.smecloud.apigw.client.ApigwClient;
+import com.smecloud.apigw.constant.HttpMethod;
+import com.smecloud.apigw.model.ApiRequest;
+import com.smecloud.apigw.model.ApiResult;
+import com.smecloud.apigw.model.ApigwConfig;
+import com.smecloud.apigw.util.SHAUtil;
 import com.trade.purchase.extra.entity.Claim;
 import com.trade.purchase.extra.entity.ClaimItem;
 import com.trade.purchase.extra.entity.JdModule;
@@ -38,6 +45,7 @@ import com.trade.purchase.vojo.JDYitems;
 import io.seata.spring.annotation.GlobalTransactional;
 import lombok.AllArgsConstructor;
 import lombok.Data;
+import org.apache.poi.ss.formula.functions.T;
 import org.springblade.check.dto.AuditProecessDTO;
 import org.springblade.check.entity.AuditPathsActs;
 import org.springblade.check.entity.AuditPathsLevels;
@@ -58,6 +66,7 @@ import org.springblade.core.tool.utils.StringUtil;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
+import org.apache.commons.codec.binary.Base64;
 
 import javax.net.ssl.*;
 import java.io.*;
@@ -69,6 +78,7 @@ import java.security.SecureRandom;
 import java.security.cert.X509Certificate;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
 /**
@@ -538,6 +548,72 @@ public class ClaimServiceImpl extends ServiceImpl<ClaimMapper, Claim> implements
 		if (jdTenant == null) {
 			throw new SecurityException("当前租户未配置凭证信息");
 		}
+
+		/*ApigwConfig config = new ApigwConfig();
+		//设置client_id
+		config.setClientID(jdTenant.getClientId());
+		//设置client_secret
+		config.setClientSecret("a4ae57bc06ea205a013acbf7ec753139");
+		ApigwClient apigwClient = ApigwClient.getInstance();
+		//初始化API网关客户端
+		apigwClient.init(config);
+
+		//设置headers参数
+		ApiRequest request = new ApiRequest(HttpMethod.GET, "api.kingdee.com", "/jdyconnector/app_management/kingdee_auth_token");
+
+		String key = "qidi75E9";
+		String secret = "0267f465852aa7690857cd0ca681889864a79158";
+		String s = SHAUtil.SHA256HMAC(key, secret);
+		System.out.println("s======>"+s);
+
+		String c = Base64.encodeBase64String(s.getBytes());
+		System.out.println("c======>"+c);
+
+		Map<String, String> querys = new TreeMap<>();
+		querys.put("app_key", key);
+		String appSignature = URLEncoder.encode(c, "UTF-8");
+		System.out.println("appSignature编码======>"+appSignature);
+		querys.put("app_signature", appSignature);
+		System.out.println("map======>"+querys.toString());
+		request.setQuerys(querys);
+
+
+
+		request.addSignHeaders("Content-Type","application/json");
+		request.addSignHeaders("X-Api-ClientID",jdTenant.getClientId());
+		request.addSignHeaders("X-Api-Auth-Version","2.0");
+
+		String timestamp = String.valueOf(System.currentTimeMillis());
+		request.addSignHeaders("X-Api-TimeStamp",timestamp);
+		System.out.println("时间戳======>" + timestamp);
+
+
+		System.out.println("clientId======>"+jdTenant.getClientId());
+
+		request.addSignHeaders("X-Api-SignHeaders","");
+
+		String nonce = getThirteenNumber();
+		System.out.println("随机正整数======>"+nonce);
+		request.addSignHeaders("X-Api-Nonce",nonce);
+
+
+		String Signature = getSignature(key, c, timestamp, nonce, jdTenant.getClientSecret());
+		request.addSignHeaders("X-Api-Signature",Signature);
+		System.out.println("返回的加密字符串======》"+ Signature);
+
+
+
+		System.out.println("Querys======>"+request.getQuerys().toString());
+		System.out.println("Host======>"+request.getHost());
+		System.out.println("Path======>"+request.getPath());
+
+
+		ApiResult results = ApigwClient.getInstance().send(request);
+		System.out.println("金蝶返回数据======》"+results.getBody());*/
+
+
+
+
 		//获取测试账套token的url
 		String getTokenUrl = "https://api.kingdee.com/auth/user/access_token?client_id=" + jdTenant.getClientId() +
 			"&client_secret=" + jdTenant.getClientSecret() +
@@ -553,6 +629,68 @@ public class ClaimServiceImpl extends ServiceImpl<ClaimMapper, Claim> implements
 		return tokenDTO.getData().getAccess_token();
 	}
 
+	private String getSignature(String appKey, String appSignature, String timestamp, String nonce, String clientSecret) {
+
+		try {
+			//1、对path部分进行url编码
+			String path = URLEncoder.encode("/jdyconnector/app_management/kingdee_auth_token", "UTF-8");
+			System.out.println("对path部分进行url编码======>"+path);
+
+			//2、params请求参数
+				//2.1 进行第一次url编码
+				appSignature = URLEncoder.encode(appSignature, "UTF-8");
+				System.out.println("进行第一次url编码======>"+appSignature);
+
+				//2.2 进行第二次url编码
+				appSignature = URLEncoder.encode(appSignature, "UTF-8");
+				System.out.println("进行第二次url编码======>"+appSignature);
+
+				//2.3 拼接params请求参数部分(按ASCII码升序顺序进行排序)
+				String params = "app_key=" + appKey + "&app_signature=" + appSignature;
+				System.out.println("拼接params请求参数部分======>"+params);
+
+			//3、headers请求参数
+			nonce = "x-api-nonce:" + nonce;//随机随机正整数
+			timestamp = "x-api-timestamp:" + timestamp;//请求发起的时间戳
+
+			//4、拼接得到签名字符串
+			String srcStr = "GET" + "\n"
+					+ path + "\n"
+					+ params + "\n"
+					+ nonce + "\n"
+					+ timestamp + "\n";
+			System.out.println("拼接得到签名字符串======>"+srcStr);
+
+			//4、签名字符串生成X-Api-Signature
+			String spec = SHAUtil.SHA256HMAC(srcStr, clientSecret);
+			System.out.println("签名字符串生成X-Api-Signature======>"+spec);
+			String value = Base64.encodeBase64String(spec.getBytes());
+			System.out.println("Base64签名======>"+value);
+
+			return value;
+		} catch (UnsupportedEncodingException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	public static Map<String,String> sortHashMap(Map<String,String> map){
+		Map<String,String> sortedMap = new LinkedHashMap<String,String>();
+		List<String> list = new ArrayList<String>();
+		Iterator<String> item = map.keySet().iterator();
+		while(item.hasNext()){
+			list.add(item.next());
+		}
+		Collections.sort(list);
+		Iterator<String> item2 = list.iterator();
+		while(item2.hasNext()){
+			String key = item2.next();
+			sortedMap.put(key,map.get(key));
+		}
+		return sortedMap;
+	}
+
+
 	public String doGet(String url, Map<String, String> urlParams)
 		throws IOException {
 		if (isEmpty(url)) {
@@ -708,4 +846,31 @@ public class ClaimServiceImpl extends ServiceImpl<ClaimMapper, Claim> implements
 
 
 	}
+
+	/**
+	 * 根据时间戳+atomicInteger生成13位长度数字,只能支持小并发不重复,仅适用于后台系统
+	 *
+	 * @return Number
+	 */
+	public static String getThirteenNumber() {
+		AtomicInteger atomicInteger = new AtomicInteger(0);
+		//后10位时间戳
+		String timeStr = String.valueOf(System.currentTimeMillis()).substring(3);
+		// 递增生成最大999的递增ID
+		if (atomicInteger.get() == 999) {
+			atomicInteger.set(0);
+		}
+		int atomicIntegerNum = atomicInteger.getAndIncrement();
+		String atomicString = String.valueOf(atomicIntegerNum);
+		if (atomicString.length() < 3) {
+			switch (atomicString.length()) {
+				case 1:
+					return timeStr.concat("00" + atomicString);
+				case 2:
+					return timeStr.concat("0" + atomicString);
+			}
+		}
+		return timeStr.concat(atomicString);
+	}
+
 }