Selaa lähdekoodia

2022年12月16日19:04:17

纪新园 3 vuotta sitten
vanhempi
commit
ce18f89de0
52 muutettua tiedostoa jossa 3185 lisäystä ja 162 poistoa
  1. 23 20
      blade-auth/src/main/java/org/springblade/auth/service/BladeUserDetailsServiceImpl.java
  2. 1 0
      blade-auth/src/main/java/org/springblade/auth/utils/TokenUtil.java
  3. 5 0
      blade-common/src/main/java/org/springblade/common/constant/TenantConstant.java
  4. 34 0
      blade-service-api/blade-client-api/src/main/java/org/springblade/client/dto/ParametersDTO.java
  5. 12 0
      blade-service-api/blade-client-api/src/main/java/org/springblade/client/entity/CorpsDesc.java
  6. 21 0
      blade-service-api/blade-client-api/src/main/java/org/springblade/client/entity/GoodsDesc.java
  7. 170 0
      blade-service-api/blade-client-api/src/main/java/org/springblade/client/entity/Parameters.java
  8. 25 0
      blade-service-api/blade-client-api/src/main/java/org/springblade/client/feign/ITongLianPaymentClient.java
  9. 36 0
      blade-service-api/blade-client-api/src/main/java/org/springblade/client/vo/ParametersVO.java
  10. 26 0
      blade-service-api/blade-purchase-sales-api/src/main/java/org/springblade/purchase/sales/entity/Order.java
  11. 31 0
      blade-service-api/blade-stock-api/src/main/java/org/springblade/stock/vo/AppStockPartsVO.java
  12. 12 0
      blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Tenant.java
  13. 10 0
      blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClient.java
  14. 5 0
      blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClientFallback.java
  15. 1 1
      blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ITenantClient.java
  16. 1 2
      blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ITenantClientFallback.java
  17. 5 1
      blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java
  18. 3 0
      blade-service-api/trade-finance-api/src/main/java/org/springblade/finance/feign/IFinanceClient.java
  19. 14 1
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/service/impl/TradingBoxServiceImpl.java
  20. 15 4
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/service/impl/TransportServiceImpl.java
  21. 89 18
      blade-service/blade-client/src/main/java/org/springblade/client/corps/service/impl/CorpsDescServiceImpl.java
  22. 25 0
      blade-service/blade-client/src/main/java/org/springblade/client/goods/controller/GoodsDescController.java
  23. 25 8
      blade-service/blade-client/src/main/java/org/springblade/client/goods/controller/GoodsDescPartsController.java
  24. 126 0
      blade-service/blade-client/src/main/java/org/springblade/client/tonglianPayment/controller/ParametersController.java
  25. 28 0
      blade-service/blade-client/src/main/java/org/springblade/client/tonglianPayment/feign/TongLianPaymentClient.java
  26. 42 0
      blade-service/blade-client/src/main/java/org/springblade/client/tonglianPayment/mapper/ParametersMapper.java
  27. 38 0
      blade-service/blade-client/src/main/java/org/springblade/client/tonglianPayment/mapper/ParametersMapper.xml
  28. 41 0
      blade-service/blade-client/src/main/java/org/springblade/client/tonglianPayment/service/IParametersService.java
  29. 41 0
      blade-service/blade-client/src/main/java/org/springblade/client/tonglianPayment/service/impl/ParametersServiceImpl.java
  30. 44 11
      blade-service/blade-client/src/main/java/org/springblade/client/wechat/controller/WechatController.java
  31. 69 13
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/partsapp/AppPartsController.java
  32. 8 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/IOrderService.java
  33. 663 78
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/impl/OrderServiceImpl.java
  34. 131 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/tonglianPayment/controller/TongLianPaymentController.java
  35. 63 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/tonglianPayment/method/ApiTestV2.java
  36. 68 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/tonglianPayment/method/NotifyServlet.java
  37. 33 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/tonglianPayment/utils/AnalysisMapUtils.java
  38. 124 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/tonglianPayment/utils/HttpConnectionUtil.java
  39. 50 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/tonglianPayment/utils/RandomStringUtils.java
  40. 54 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/tonglianPayment/utils/SSLUtil.java
  41. 138 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/tonglianPayment/utils/SmUtil.java
  42. 37 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/tonglianPayment/utils/SybConstants.java
  43. 334 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/tonglianPayment/utils/SybPayService.java
  44. 227 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/tonglianPayment/utils/SybUtil.java
  45. 125 2
      blade-service/blade-stock/src/main/java/org/springblade/stock/controller/StockGoodsController.java
  46. 2 0
      blade-service/blade-stock/src/main/java/org/springblade/stock/mapper/StockGoodsMapper.java
  47. 85 1
      blade-service/blade-stock/src/main/java/org/springblade/stock/mapper/StockGoodsMapper.xml
  48. 2 0
      blade-service/blade-stock/src/main/java/org/springblade/stock/service/IStockGoodsService.java
  49. 6 0
      blade-service/blade-stock/src/main/java/org/springblade/stock/service/impl/StockGoodsServiceImpl.java
  50. 8 0
      blade-service/blade-system/src/main/java/org/springblade/system/feign/SysClient.java
  51. 3 1
      blade-service/blade-user/src/main/java/org/springblade/system/user/feign/UserClient.java
  52. 6 1
      blade-service/trade-finance/src/main/java/org/springblade/finance/service/impl/SettlementServiceImpl.java

+ 23 - 20
blade-auth/src/main/java/org/springblade/auth/service/BladeUserDetailsServiceImpl.java

@@ -72,26 +72,33 @@ public class BladeUserDetailsServiceImpl implements UserDetailsService {
 		String grantType = request.getParameter(TokenUtil.GRANT_TYPE_KEY);
 		String openId = request.getParameter(TokenUtil.OPEN_ID);
 		String unionId = request.getParameter(TokenUtil.UNION_ID);
+		String appletsId = request.getParameter(TokenUtil.APPLETS_ID);
 
 		//判断租户号是否为空  为空查询数据库赋值
 		if (ObjectUtils.isNull(headerTenant) && ObjectUtils.isNull(paramTenant)) {
 			User user = new User();
-			user = userClient.loginByAccount(username, null);
-			if (ObjectUtils.isNull(user)) {
-				user = userClient.loginByAccount(null, username);
+			R<Tenant> tenant = null;
+			//判断是否是小程序登录
+			if (ObjectUtils.isNotNull(appletsId)) {
+				//通过小程序appId查到租户信息
+				tenant = sysClient.getTenantByAppId(appletsId);
+				if (ObjectUtils.isNull(tenant) || ObjectUtils.isNull(tenant.getData())) {
+					throw new UsernameNotFoundException("未查到租户信息");
+				}
+				user = userClient.loginByAccount(null, username, "4", tenant.getData().getTenantId());
 				if (ObjectUtils.isNull(user)) {
 					throw new UsernameNotFoundException(TokenUtil.USER_NOT_FOUND);
 				}
-			}
-			/*if (ObjectUtils.isNull(user.getCodeStatus()) || "0".equals(user.getCodeStatus())){
-				user.setCodeStatus("1");
-				//保存openId
-				user.setOpenId(openId);
-			}else{
-				if (!openId.equals(user.getOpenId())){
-					throw new UsernameNotFoundException("登录失败");
+			} else {
+				user = userClient.loginByAccount(username, null, "2", null);
+				if (ObjectUtils.isNull(user)) {
+					user = userClient.loginByAccount(null, username, "2", null);
+					if (ObjectUtils.isNull(user)) {
+						throw new UsernameNotFoundException(TokenUtil.USER_NOT_FOUND);
+					}
 				}
-			}*/
+				tenant = sysClient.getTenant(user.getTenantId());
+			}
 			user.setOpenId(openId);
 			user.setUnionId(unionId);
 			userClient.updateOpenId(user);
@@ -104,11 +111,10 @@ public class BladeUserDetailsServiceImpl implements UserDetailsService {
 			// TODO 2.8.3版本将增加:1.参数管理读取配置 2.用户管理增加解封按钮
 			int count = getFailCount(tenantId, user.getAccount());
 			if (count >= FAIL_COUNT) {
-//			throw new UserDeniedAuthorizationException(TokenUtil.USER_HAS_TOO_MANY_FAILS);
+				throw new UserDeniedAuthorizationException(TokenUtil.USER_HAS_TOO_MANY_FAILS);
 			}
 
 			// 获取租户信息
-			R<Tenant> tenant = sysClient.getTenant(tenantId);
 			if (tenant.isSuccess()) {
 				if (TokenUtil.judgeTenant(tenant.getData())) {
 					throw new UserDeniedAuthorizationException(TokenUtil.USER_HAS_NO_TENANT_PERMISSION);
@@ -141,14 +147,14 @@ public class BladeUserDetailsServiceImpl implements UserDetailsService {
 					setFailCount(tenantId, user1.getAccount(), count);
 					throw new UsernameNotFoundException(TokenUtil.USER_NOT_FOUND);
 				}
-				if (ObjectUtils.isNull(openId)){
+				if (ObjectUtils.isNull(openId)) {
 					// 用户存在但密码错误,超过次数则锁定账号
 					if (!grantType.equals(TokenUtil.REFRESH_TOKEN_KEY) && !user1.getPassword().equals(DigestUtil.hex(password))) {
 						setFailCount(tenantId, user1.getAccount(), count);
 						throw new UsernameNotFoundException(TokenUtil.USER_NOT_FOUND);
 					}
-				}else{
-					request.setAttribute(TokenUtil.PASSWORD_KEY,user.getPassword());
+				} else {
+					request.setAttribute(TokenUtil.PASSWORD_KEY, user.getPassword());
 				}
 				// 用户角色不存在
 				if (Func.isEmpty(userInfo.getRoles())) {
@@ -176,9 +182,6 @@ public class BladeUserDetailsServiceImpl implements UserDetailsService {
 		} else {
 
 
-
-
-
 			if (StringUtil.isAllBlank(headerTenant, paramTenant)) {
 				throw new UserDeniedAuthorizationException(TokenUtil.TENANT_NOT_FOUND);
 			}

+ 1 - 0
blade-auth/src/main/java/org/springblade/auth/utils/TokenUtil.java

@@ -84,6 +84,7 @@ public class TokenUtil {
 	public final static String PHONE_URL = "https://api.weixin.qq.com/wxa/business/getuserphonenumber";
 	public final static String OPEN_ID = "open_id";
 	public final static String UNION_ID = "union_id";
+	public final static String APPLETS_ID = "applets_id";
 
 	private static BladeTenantProperties tenantProperties;
 

+ 5 - 0
blade-common/src/main/java/org/springblade/common/constant/TenantConstant.java

@@ -63,4 +63,9 @@ public interface TenantConstant {
 		"desk", "flow", "work", "monitor", "resource", "role", "user", "dept", "dictbiz", "topmenu"
 	);
 
+	/**
+	 * 支付环境
+	 */
+	String PAYMENT_PARAMETER = "payment.parameter";
+
 }

+ 34 - 0
blade-service-api/blade-client-api/src/main/java/org/springblade/client/dto/ParametersDTO.java

@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.client.dto;
+
+import org.springblade.client.entity.Parameters;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 支付参数表数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2022-12-13
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ParametersDTO extends Parameters {
+	private static final long serialVersionUID = 1L;
+
+}

+ 12 - 0
blade-service-api/blade-client-api/src/main/java/org/springblade/client/entity/CorpsDesc.java

@@ -418,6 +418,12 @@ public class CorpsDesc implements Serializable {
 	private String labels;
 
 	/**
+	 * 商城价格
+	 */
+	@ApiModelProperty(value = "商城价格")
+	private String shoppingMall;
+
+	/**
 	 * 客户类别
 	 */
 	@ApiModelProperty(value = "客户类别")
@@ -447,5 +453,11 @@ public class CorpsDesc implements Serializable {
 	@TableField(exist = false)
 	private String adminProfilesName;
 
+	/**
+	 * 业务标识(配件1)
+	 */
+	@TableField(exist = false)
+	private String billType;
+
 
 }

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

@@ -314,6 +314,10 @@ public class GoodsDesc implements Serializable {
 	 * 采购价
 	 */
 	private BigDecimal purchasePrice;
+	/**
+	 * 特价
+	 */
+	private BigDecimal specialOffer;
 
 	/**
 	 * 标签
@@ -321,6 +325,11 @@ public class GoodsDesc implements Serializable {
 	private String label;
 
 	/**
+	 * 是否上架
+	 */
+	private String upperFrame;
+
+	/**
 	 * 库存数据
 	 */
 	@TableField(exist = false)
@@ -332,4 +341,16 @@ public class GoodsDesc implements Serializable {
 	@TableField(exist = false)
 	private StockGoods stockGoods;
 
+	/**
+	 * 库存数据
+	 */
+	@TableField(exist = false)
+	private String shoppingMall;
+
+	/**
+	 * 库存数据
+	 */
+	@TableField(exist = false)
+	private String ids;
+
 }

+ 170 - 0
blade-service-api/blade-client-api/src/main/java/org/springblade/client/entity/Parameters.java

@@ -0,0 +1,170 @@
+/*
+ *      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.client.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 支付参数表实体类
+ *
+ * @author BladeX
+ * @since 2022-12-13
+ */
+@Data
+@TableName("payment_parameters")
+@ApiModel(value = "Parameters对象", description = "支付参数表")
+public class Parameters implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	private Long id;
+	/**
+	 * 集团/代理商商户号
+	 */
+	@ApiModelProperty(value = "集团/代理商商户号")
+	private String orgid;
+	/**
+	 * 商户号
+	 */
+	@ApiModelProperty(value = "商户号")
+	private String cusId;
+	/**
+	 * 平台分配的APPID
+	 */
+	@ApiModelProperty(value = "平台分配的APPID")
+	private String appId;
+	/**
+	 * 商户号
+	 */
+	@ApiModelProperty(value = "商户号")
+	private String mchId;
+	/**
+	 * 通联支付appid
+	 */
+	@ApiModelProperty(value = "通联支付appid")
+	private String sybAppId;
+	/**
+	 * 交易类型
+	 */
+	@ApiModelProperty(value = "交易类型")
+	private String payType;
+	/**
+	 * 支付签名key
+	 */
+	@ApiModelProperty(value = "支付签名key")
+	private String paySignKey;
+	/**
+	 * 有效时间
+	 */
+	@ApiModelProperty(value = "有效时间")
+	private String validtime;
+	/**
+	 * 支付回调地址
+	 */
+	@ApiModelProperty(value = "支付回调地址")
+	private String notifyUrl;
+	/**
+	 * 微信子appid
+	 */
+	@ApiModelProperty(value = "微信子appid")
+	private String subAppid;
+	/**
+	 * 渠道门店编号
+	 */
+	@ApiModelProperty(value = "渠道门店编号")
+	private String chnlstoreId;
+	/**
+	 * 门店号
+	 */
+	@ApiModelProperty(value = "门店号")
+	private String subbranch;
+	/**
+	 * 支付完成跳转
+	 */
+	@ApiModelProperty(value = "支付完成跳转")
+	private String frontUrl;
+	/**
+	 * 终端ip
+	 */
+	@ApiModelProperty(value = "终端ip")
+	private String cusIp;
+	/**
+	 * 备注
+	 */
+	@ApiModelProperty(value = "备注")
+	private String remarks;
+	/**
+	 * 创建人
+	 */
+	@ApiModelProperty(value = "创建人")
+	private Long createUser;
+	/**
+	 * 创建时间
+	 */
+	@ApiModelProperty(value = "创建时间")
+	private LocalDateTime createTime;
+	/**
+	 * 修改人
+	 */
+	@ApiModelProperty(value = "修改人")
+	private Long updateUser;
+	/**
+	 * 修改时间
+	 */
+	@ApiModelProperty(value = "修改时间")
+	private LocalDateTime updateTime;
+	/**
+	 * 创建人姓名
+	 */
+	@ApiModelProperty(value = "创建人姓名")
+	private String createUserName;
+	/**
+	 * 修改人姓名
+	 */
+	@ApiModelProperty(value = "修改人姓名")
+	private String updateUserName;
+	/**
+	 * 是否删除
+	 */
+	@ApiModelProperty(value = "是否删除")
+	private Integer isDeleted;
+	/**
+	 * 状态0停用1启用
+	 */
+	@ApiModelProperty(value = "状态0停用1启用")
+	private String status;
+
+	/**
+	 * 租户号
+	 */
+	@ApiModelProperty(value = "租户号")
+	private String tenantId;
+
+	/**
+	 * 小程序的appSecret
+	 */
+	@ApiModelProperty(value = "小程序的appSecret")
+	private String appSecret;
+
+
+}

+ 25 - 0
blade-service-api/blade-client-api/src/main/java/org/springblade/client/feign/ITongLianPaymentClient.java

@@ -0,0 +1,25 @@
+package org.springblade.client.feign;
+
+import org.springblade.client.entity.CommonFile;
+import org.springblade.client.entity.Parameters;
+import org.springblade.common.constant.LauncherConstant;
+import org.springblade.core.tool.api.R;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+@FeignClient(
+	value = LauncherConstant.APPLICATION_CLIENT_NAME
+)
+public interface ITongLianPaymentClient {
+	String API_PREFIX = "/parameters";
+	String GET_PARAMETERS_ONE = API_PREFIX + "/getParametersOne";
+
+	@PostMapping(GET_PARAMETERS_ONE)
+	Parameters getParametersOne();
+
+}

+ 36 - 0
blade-service-api/blade-client-api/src/main/java/org/springblade/client/vo/ParametersVO.java

@@ -0,0 +1,36 @@
+/*
+ *      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.client.vo;
+
+import org.springblade.client.entity.Parameters;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import io.swagger.annotations.ApiModel;
+
+/**
+ * 支付参数表视图实体类
+ *
+ * @author BladeX
+ * @since 2022-12-13
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "ParametersVO对象", description = "支付参数表")
+public class ParametersVO extends Parameters {
+	private static final long serialVersionUID = 1L;
+
+}

+ 26 - 0
blade-service-api/blade-purchase-sales-api/src/main/java/org/springblade/purchase/sales/entity/Order.java

@@ -1067,6 +1067,12 @@ public class Order implements Serializable {
 	private BigDecimal costAmount;
 
 	/**
+	 * 订单来源(配件)
+	 */
+	@ApiModelProperty(value = "订单来源(配件)")
+	private String orderSource;
+
+	/**
 	 * 核心客户与流失类别
 	 */
 	@TableField(exist = false)
@@ -1135,4 +1141,24 @@ public class Order implements Serializable {
 	@TableField(exist = false)
 	private BigDecimal price;
 
+	/**
+	 * 退货数量
+	 */
+	@ApiModelProperty(value = "退货数量")
+	private BigDecimal returnGoods;
+
+	/**
+	 * 实际支付状态
+	 */
+	@ApiModelProperty(value = "实际支付状态")
+	private int actualPaymentStatus;
+
+	/**
+	 * 微信预付单号
+	 */
+	@ApiModelProperty(value = "微信预付单号")
+	private String prepayId;
+
+
+
 }

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

@@ -1,5 +1,6 @@
 package org.springblade.stock.vo;
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.math.BigDecimal;
@@ -39,6 +40,16 @@ public class AppStockPartsVO {
 	private String storage;
 
 	/**
+	 * 仓库Id
+	 */
+	private Long storageId;
+
+	/**
+	 * 仓库结余
+	 */
+	private String storageBalance;
+
+	/**
 	 * 结余
 	 */
 	private BigDecimal balance;
@@ -82,6 +93,11 @@ public class AppStockPartsVO {
 	private String goodsType;
 
 	/**
+	 * 单位
+	 */
+	private String unit;
+
+	/**
 	 * 产品分类Id
 	 */
 	private Long goodsTypeId;
@@ -100,6 +116,11 @@ public class AppStockPartsVO {
 	 * 标签
 	 */
 	private String labels;
+
+	/**
+	 * 标签
+	 */
+	private String[] label;
 	/**
 	 * 排序 0 正序  1 倒序
 	 */
@@ -167,4 +188,14 @@ public class AppStockPartsVO {
 	 */
 	private String status;
 
+	/**
+	 * 是否上架
+	 */
+	private String upperFrame;
+
+	/**
+	 * 标准售价
+	 */
+	private BigDecimal standardPrice;
+
 }

+ 12 - 0
blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Tenant.java

@@ -117,4 +117,16 @@ public class Tenant extends BaseEntity {
 	@ApiModelProperty(value = "平台客户编码")
 	private String corpCode;
 
+	/**
+	 * 小程序的appId
+	 */
+	@ApiModelProperty(value = "小程序的appId")
+	private String appId;
+
+	/**
+	 * 租户级别
+	 */
+	@ApiModelProperty(value = "租户级别")
+	private String tenantLevel;
+
 }

+ 10 - 0
blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClient.java

@@ -63,6 +63,7 @@ public interface ISysClient {
 	String LIST_ROLE_ALIAS=API_PREFIX+"/listRoleAlias";
 	String GET_ROLE_ID_BY_ALIAS=API_PREFIX+"/getRoleByAlias";
 	String DEPT_BY_IDS = API_PREFIX + "/selectByDeptIds";
+	String TENANT_ID_BY_APP_ID = API_PREFIX + "/tenantIdByAppId";
 
 	/**
 	 * 通过租户id获取全部租户别名
@@ -297,4 +298,13 @@ public interface ISysClient {
 	 */
 	@GetMapping(DEPT_BY_IDS)
 	R<List<Dept>> selectByDeptIds(@RequestParam("ids") String ids);
+
+	/**
+	 * 获取租户
+	 *
+	 * @param appId 小程序appid
+	 * @return Tenant
+	 */
+	@GetMapping(TENANT_ID_BY_APP_ID)
+	R<Tenant> getTenantByAppId(@RequestParam("appId") String appId);
 }

+ 5 - 0
blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClientFallback.java

@@ -160,4 +160,9 @@ public class ISysClientFallback implements ISysClient {
 		return R.fail("获取数据失败");
 	}
 
+	@Override
+	public R<Tenant> getTenantByAppId(String appId) {
+		return R.fail("获取数据失败");
+	}
+
 }

+ 1 - 1
blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ITenantClient.java

@@ -11,7 +11,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 	fallback = ITenantClientFallback.class
 )
 public interface ITenantClient {
-	String API_PREFIX = "/client";
+	String API_PREFIX = "/clientTenant";
 	String TENANT_MESSAGE = API_PREFIX + "/tenantMessage";
 
 	/**

+ 1 - 2
blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ITenantClientFallback.java

@@ -1,6 +1,5 @@
 package org.springblade.system.feign;
 
-import org.springblade.core.tool.api.R;
 import org.springblade.system.entity.Tenant;
 import org.springframework.stereotype.Component;
 
@@ -10,7 +9,7 @@ import org.springframework.stereotype.Component;
  * @author Chill
  */
 @Component
-public class ITenantClientFallback implements ITenantClient{
+public class ITenantClientFallback implements ITenantClient {
 	@Override
 	public Tenant tenantMessage(String tenantId) {
 		return null;

+ 5 - 1
blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java

@@ -196,6 +196,10 @@ public interface IUserClient {
 	 * @return
 	 */
 	@GetMapping(LOGIN_BY_ACCOUNT)
-	User loginByAccount(@RequestParam(value = "account", required = false) String account, @RequestParam(value = "phone", required = false) String phone);
+	User loginByAccount(@RequestParam(value = "account", required = false) String account,
+						@RequestParam(value = "phone", required = false) String phone,
+						@RequestParam(value = "userType", required = false) String userType,
+						@RequestParam(value = "tenantId", required = false) String tenantId
+	);
 
 }

+ 3 - 0
blade-service-api/trade-finance-api/src/main/java/org/springblade/finance/feign/IFinanceClient.java

@@ -106,6 +106,9 @@ public interface IFinanceClient {
 	@PostMapping("/acc/updateByOrderId")
 	R updateByOrderId(@RequestParam("orderId") Long orderId);
 
+	@PostMapping("/acc/update")
+	R update(@RequestBody Acc acc);
+
 	@PostMapping("/acc/deleteBySrcFeesId")
 	R deleteBySrcFeesId(@RequestParam("feesId") Long feesId);
 

+ 14 - 1
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/service/impl/TradingBoxServiceImpl.java

@@ -28,7 +28,6 @@ import org.springblade.box.tube.dto.TradingBoxItemRentExcelEnter;
 import org.springblade.box.tube.entity.*;
 import org.springblade.box.tube.mapper.*;
 import org.springblade.box.tube.service.ITradingBoxService;
-import org.springblade.box.tube.utils.GeneralToolsUtils;
 import org.springblade.box.tube.vo.TradingBoxVO;
 import org.springblade.check.dto.AuditProecessDTO;
 import org.springblade.check.entity.AuditPathsActs;
@@ -465,6 +464,20 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 					tradingBoxItem.setPid(tradingBox.getId());
 					tradingBoxItemMapper.insert(tradingBoxItem);
 				} else {
+					if (tradingBox.getType().equals("ZR") && "录入".equals(tradingBoxItem.getStatus())) {
+						if (ObjectUtils.isNotNull(tradingBoxItem.getLeaseCommencementDate())) {
+							tradingBoxItem.setStatus("待使用");
+						} else {
+							tradingBoxItem.setStatus("录入");
+						}
+					} else if (tradingBox.getType().equals("ZC") && "录入".equals(tradingBoxItem.getStatus())) {
+//						tradingBoxItem.setStatus("使用");
+						if (ObjectUtils.isNotNull(tradingBoxItem.getLeaseCommencementDate())) {
+							tradingBoxItem.setStatus("使用");
+						} else {
+							tradingBoxItem.setStatus("录入");
+						}
+					}
 					tradingBoxItem.setUpdateUser(AuthUtil.getUserId());
 					tradingBoxItem.setUpdateTime(new Date());
 					tradingBoxItem.setUpdateUserName(AuthUtil.getUserName());

+ 15 - 4
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/service/impl/TransportServiceImpl.java

@@ -29,7 +29,6 @@ import org.springblade.box.tube.dto.TransportItemExcelEnter;
 import org.springblade.box.tube.entity.*;
 import org.springblade.box.tube.mapper.*;
 import org.springblade.box.tube.service.ITransportService;
-import org.springblade.box.tube.utils.GeneralToolsUtils;
 import org.springblade.box.tube.vo.TransportVO;
 import org.springblade.check.dto.AuditProecessDTO;
 import org.springblade.check.entity.AuditPathsActs;
@@ -165,7 +164,16 @@ public class TransportServiceImpl extends ServiceImpl<TransportMapper, Transport
 	@Transactional(rollbackFor = Exception.class)
 	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
 	public Transport add(Transport transport) {
+		LambdaQueryWrapper<Transport> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(Transport::getIsDeleted, 0)
+			.eq(Transport::getTenantId, AuthUtil.getTenantId())
+			.eq(Transport::getBillType, transport.getBillType())
+			.eq(Transport::getBillNo, transport.getBillNo());
+		List<Transport> transportList = baseMapper.selectList(lambdaQueryWrapper);
 		if (transport.getId() == null) {
+			if (transportList.size() > 0) {
+				throw new Error("提单号已存在,请勿重复添加");
+			}
 			//获取系统编号
 			R billNo = serialClient.getBillNo(transport.getBillType(), "BOX", transport.getBillType());
 			if (!billNo.isSuccess()) {
@@ -180,6 +188,9 @@ public class TransportServiceImpl extends ServiceImpl<TransportMapper, Transport
 			transport.setStatus(0);
 			baseMapper.insert(transport);
 		} else {
+			if (transportList.size() >= 1) {
+				throw new Error("提单号已存在,请勿重复添加");
+			}
 			transport.setUpdateTime(new Date());
 			transport.setUpdateUser(AuthUtil.getUserId());
 			transport.setUpdateUserName(AuthUtil.getUserName());
@@ -357,9 +368,9 @@ public class TransportServiceImpl extends ServiceImpl<TransportMapper, Transport
 							transportItemFees.setTenantId(AuthUtil.getTenantId());
 							transportItemFees.setPid(transport.getId());
 							transportItemFees.setFeesType(1);
-							if ("CKZY".equals(transport.getBillType())){
+							if ("CKZY".equals(transport.getBillType())) {
 								transportItemFees.setBillType("出口装运");
-							}else{
+							} else {
 								transportItemFees.setBillType("进口返程");
 							}
 							transportItemFees.setCode(transportItem.getCode());
@@ -381,7 +392,7 @@ public class TransportServiceImpl extends ServiceImpl<TransportMapper, Transport
 						}
 					}
 				}
-			}else{
+			} else {
 				archives.setStatus("使用");
 			}
 			transportItemMapper.updateById(transportItem);

+ 89 - 18
blade-service/blade-client/src/main/java/org/springblade/client/corps/service/impl/CorpsDescServiceImpl.java

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.AllArgsConstructor;
+import org.springblade.client.constant.LandConstant;
 import org.springblade.client.corps.excel.*;
 import org.springblade.client.corps.mapper.CorpsAddrMapper;
 import org.springblade.client.corps.mapper.CorpsDescMapper;
@@ -17,10 +18,13 @@ import org.springblade.client.corps.service.ICorpsDescService;
 import org.springblade.client.dto.CorpsDescDto;
 import org.springblade.client.entity.*;
 import org.springblade.client.vo.CorpsDescVO;
+import org.springblade.core.log.exception.ServiceException;
 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.*;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.finance.feign.IFinanceClient;
 import org.springblade.purchase.sales.entity.Order;
 import org.springblade.purchase.sales.feign.IOrderDescClient;
@@ -32,7 +36,6 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
 import java.math.BigDecimal;
-import java.rmi.server.ServerCloneException;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -102,14 +105,14 @@ public class CorpsDescServiceImpl extends ServiceImpl<CorpsDescMapper, CorpsDesc
 		}
 		corpsDesc.setTenantId(AuthUtil.getTenantId());
 		if (ObjectUtils.isNotNull(corpsDesc.getCname())) {
-			String cName = corpsDesc.getCname().replaceAll(" ","");
+			String cName = corpsDesc.getCname().replaceAll(" ", "");
 			corpsDesc.setCname(cName);
 		}
 		corpsDesc.setIsDeleted(0);
-		if ("234557".equals(AuthUtil.getTenantId())){
+		if ("234557".equals(AuthUtil.getTenantId())) {
 			IPage<CorpsDescVO> page1 = page.setRecords(baseMapper.selectCorpsDescPageZD(page, corpsDesc));
 			return page1;
-		}else{
+		} else {
 			IPage<CorpsDescVO> page1 = page.setRecords(baseMapper.selectCorpsDescPage(page, corpsDesc));
 			return page1;
 		}
@@ -152,6 +155,74 @@ public class CorpsDescServiceImpl extends ServiceImpl<CorpsDescMapper, CorpsDesc
 			TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
 			return saveOrUpdateAttn;
 		}
+		if ("1".equals(corpsDesc.getBillType())){
+			User user = new User();
+			user.setTenantId(AuthUtil.getTenantId());
+			user.setUserType(1);
+			user.setAccount(corpsDesc.getTel());
+			user.setName(corpsDesc.getCname());
+			user.setRealName(corpsDesc.getCname());
+			user.setUserType(4);
+			user.setPhone(corpsDesc.getTel());
+			R<String> r = sysClient.getRoleIds(AuthUtil.getTenantId(), "客户");
+			if (r.isSuccess() && ObjectUtils.isNotNull(r.getData())) {
+				user.setRoleId(r.getData());
+			}
+			user.setDeptId(AuthUtil.getDeptId());
+			user.setPostId(AuthUtil.getPostId());
+
+			LambdaQueryWrapper<CorpsAttn> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+			lambdaQueryWrapper.eq(CorpsAttn::getTenantId,AuthUtil.getTenantId())
+				.eq(CorpsAttn::getIsDeleted,0)
+				.eq(CorpsAttn::getTel,corpsDesc.getTel())
+				.eq(CorpsAttn::getPid,corpsDesc.getId());
+			CorpsAttn attn = corpsAttnService.getOne(lambdaQueryWrapper);
+			if (ObjectUtils.isNotNull(attn)){
+				R<User> userR = userClient.userInfoById(attn.getUserId());
+				if (ObjectUtil.isNotEmpty(userR.getData())){
+					user.setId(attn.getUserId());
+					R<Boolean> result = userClient.updateUser(user);
+
+					if (!result.isSuccess()) {
+						throw new ServiceException(result.getMsg());
+					}
+				}else {
+					user.setPassword(LandConstant.USER_PASSWORD);
+					R<Boolean> result = userClient.saveUser(user);
+					if (!result.isSuccess()) {
+						throw new ServiceException(result.getMsg());
+					}
+					R<User> userTemp = userClient.userByAccount(AuthUtil.getTenantId(), corpsDesc.getTel());
+					if (!userTemp.isSuccess()) {
+						throw new ServiceException(userTemp.getMsg());
+					}
+					attn.setUserId(userTemp.getData().getId());
+					corpsAttnService.updateById(attn);
+				}
+			}else{
+				user.setPassword(LandConstant.USER_PASSWORD);
+				R<Boolean> result = userClient.saveUser(user);
+				if (!result.isSuccess()) {
+					throw new ServiceException(result.getMsg());
+				}
+				R<User> userTemp = userClient.userByAccount(AuthUtil.getTenantId(), corpsDesc.getTel());
+				if (!userTemp.isSuccess()) {
+					throw new ServiceException(userTemp.getMsg());
+				}
+				CorpsAttn corpsAttn = new CorpsAttn();
+				corpsAttn.setCode(corpsDesc.getCname());
+				corpsAttn.setCname(corpsDesc.getCname());
+				corpsAttn.setAttn(corpsDesc.getAttn());
+				corpsAttn.setTel(corpsDesc.getTel());
+				corpsAttn.setTenantId(AuthUtil.getTenantId());
+				corpsAttn.setPid(corpsDesc.getId());
+				corpsAttn.setUserId(userTemp.getData().getId());
+				corpsAttn.setCreateTime(new Date());
+				corpsAttn.setTenantId(AuthUtil.getTenantId());
+				corpsAttn.setCreateUser(AuthUtil.getUserId());
+				corpsAttnService.save(corpsAttn);
+			}
+		}
 		//保存客户银行信息
 		this.saveOrUpdateBank(corpsDesc, userId, pId, tenantId, date);
 		//保存客户文件信息
@@ -191,14 +262,14 @@ public class CorpsDescServiceImpl extends ServiceImpl<CorpsDescMapper, CorpsDesc
 			List<String> longs = corpsTypeDescMapper.selectTypeId(corpsDesc.getId());
 			desc.setCorpsTypeId(String.join(",", longs));
 			StringBuilder corpsTypeName = new StringBuilder();
-			if(ObjectUtils.isNotNull(longs)){
-				for (String id:longs) {
-					String name = corpsTypeMapper.selectById(Long.parseLong(id)) == null ?"":corpsTypeMapper.selectById(Long.parseLong(id)).getCname();
+			if (ObjectUtils.isNotNull(longs)) {
+				for (String id : longs) {
+					String name = corpsTypeMapper.selectById(Long.parseLong(id)) == null ? "" : corpsTypeMapper.selectById(Long.parseLong(id)).getCname();
 					corpsTypeName.append(name).append(",");
 				}
-				String corpsName = corpsTypeName.substring(0,corpsTypeName.length()-1);
+				String corpsName = corpsTypeName.substring(0, corpsTypeName.length() - 1);
 				desc.setCorpsTypeName(corpsName);
-			}else{
+			} else {
 				desc.setCorpsTypeName("");
 			}
 		}
@@ -263,11 +334,11 @@ public class CorpsDescServiceImpl extends ServiceImpl<CorpsDescMapper, CorpsDesc
 				if (corpsType != null) {
 					countList.add(true);
 					CorpsDesc corpsDesc = new CorpsDesc();
-					if (ObjectUtil.isNotEmpty(e.getCode())){//判断编号是否重复
+					if (ObjectUtil.isNotEmpty(e.getCode())) {//判断编号是否重复
 						CorpsDesc desc = baseMapper.selectCorpsDescCode(e.getCode(), AuthUtil.getTenantId());
-						if (ObjectUtil.isNotEmpty(desc)){
-							throw new SecurityException("客户编号"+e.getCode()+"重复");
-						}else {
+						if (ObjectUtil.isNotEmpty(desc)) {
+							throw new SecurityException("客户编号" + e.getCode() + "重复");
+						} else {
 							corpsDesc.setCode(e.getCode());
 						}
 					}
@@ -353,7 +424,7 @@ public class CorpsDescServiceImpl extends ServiceImpl<CorpsDescMapper, CorpsDesc
 			}
 
 		} catch (Exception exception) {
-			throw new SecurityException("请检查导入数据"+exception.getMessage());
+			throw new SecurityException("请检查导入数据" + exception.getMessage());
 		}
 	}
 
@@ -825,9 +896,9 @@ public class CorpsDescServiceImpl extends ServiceImpl<CorpsDescMapper, CorpsDesc
 			//获取客户类别
 			List<String> longs = corpsTypeDescMapper.selectTypeId(corpsDesc.getId());
 			StringBuilder corpsTypeName = new StringBuilder();
-			if(ObjectUtils.isNotNull(longs)){
-				for (String id:longs) {
-					String name = corpsTypeMapper.selectById(Long.parseLong(id)) == null ?"":corpsTypeMapper.selectById(Long.parseLong(id)).getCname();
+			if (ObjectUtils.isNotNull(longs)) {
+				for (String id : longs) {
+					String name = corpsTypeMapper.selectById(Long.parseLong(id)) == null ? "" : corpsTypeMapper.selectById(Long.parseLong(id)).getCname();
 					corpsTypeName.append(name).append(",");
 				}
 			}

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

@@ -28,6 +28,7 @@ import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
+import org.springblade.client.corps.service.ICorpsAttnService;
 import org.springblade.client.corps.service.ICorpsDescService;
 import org.springblade.client.entity.*;
 import org.springblade.client.feign.IRedisClient;
@@ -104,6 +105,8 @@ public class GoodsDescController extends BladeController {
 
 	private final IRedisClient redisClient;//redis缓存处理
 
+	private final ICorpsAttnService corpsAttnService;
+
 	/**
 	 * 详情
 	 */
@@ -145,6 +148,7 @@ public class GoodsDescController extends BladeController {
 					 @RequestParam(name = "status", required = false) String status,
 					 @RequestParam(name = "unit", required = false) String unit,
 					 @RequestParam(name = "remarks", required = false) String remarks,
+					 @RequestParam(name = "upperFrame", required = false) String upperFrame,
 					 @RequestParam(name = "label", required = false) String label,
 					 @RequestParam(name = "artsVision", required = false) String artsVision) {
 		LambdaQueryWrapper<GoodsDesc> goodsDescLambdaQueryWrapper = new LambdaQueryWrapper<>();
@@ -185,6 +189,7 @@ public class GoodsDescController extends BladeController {
 		goodsDescLambdaQueryWrapper.eq(GoodsDesc::getType, 0);
 		goodsDescLambdaQueryWrapper.eq(ObjectUtils.isNotNull(status),GoodsDesc::getStatus, status);
 		goodsDescLambdaQueryWrapper.eq(ObjectUtils.isNotNull(unit),GoodsDesc::getUnit, unit);
+		goodsDescLambdaQueryWrapper.eq(ObjectUtils.isNotNull(upperFrame),GoodsDesc::getUpperFrame, upperFrame);
 		if (StringUtils.isNotEmpty(artsVision)) {
 			goodsDescLambdaQueryWrapper.and(i -> i.like(GoodsDesc::getArtsVision, artsVision).or().isNull(GoodsDesc::getArtsVision));
 		}
@@ -192,6 +197,25 @@ public class GoodsDescController extends BladeController {
 		Page<GoodsDesc> page = new Page<>(current, size);
 		IPage<GoodsDesc> iPage = goodsDescService.page(page, goodsDescLambdaQueryWrapper);
 		if (CollectionUtils.isNotEmpty(iPage.getRecords())) {
+			String shoppingMall = "";
+			if (AuthUtil.getUserRole().equals("客户")) {
+				CorpsAttn corpsAttn = corpsAttnService.getOne(new LambdaQueryWrapper<CorpsAttn>()
+					.eq(CorpsAttn::getUserId, AuthUtil.getUserId())
+					.eq(CorpsAttn::getIsDeleted, 0)
+					.eq(CorpsAttn::getTenantId, AuthUtil.getTenantId())
+				);
+				if (ObjectUtils.isNull(corpsAttn)) {
+					throw new RuntimeException("未查到用户信息");
+				} else {
+					CorpsDesc corpsDesc = corpsDescService.getCorpId(corpsAttn.getPid());
+					if (ObjectUtils.isNull(corpsDesc)) {
+						throw new RuntimeException("未查到用户信息");
+					} else {
+						shoppingMall = corpsDesc.getShoppingMall();
+					}
+				}
+			}
+			String finalShoppingMall = shoppingMall;
 			iPage.getRecords().forEach(e -> {
 				String typeId = e.getGoodsTypeId();
 				String[] split = typeId.split(",");
@@ -205,6 +229,7 @@ public class GoodsDescController extends BladeController {
 				}
 
 				e.setPolicyName(salesPolicyClient.getPolicyName(e.getId()));
+				e.setShoppingMall(finalShoppingMall);
 			});
 		}
 		return R.data(iPage);

+ 25 - 8
blade-service/blade-client/src/main/java/org/springblade/client/goods/controller/GoodsDescPartsController.java

@@ -29,7 +29,6 @@ import org.springblade.client.entity.GoodsDesc;
 import org.springblade.client.entity.GoodsFiles;
 import org.springblade.client.entity.GoodsType;
 import org.springblade.client.feign.IRedisClient;
-import org.springblade.client.goods.excel.GoodsInfoExcel;
 import org.springblade.client.goods.excel.GoodsInfoPartsExcel;
 import org.springblade.client.goods.service.IGoodsDescService;
 import org.springblade.client.goods.service.IGoodsFilesService;
@@ -77,7 +76,6 @@ public class GoodsDescPartsController extends BladeController {
 	private final IOrderItemsClient orderItemsClient;
 
 
-
 	/**
 	 * 商品详情表新增修改
 	 */
@@ -99,9 +97,9 @@ public class GoodsDescPartsController extends BladeController {
 	@GetMapping("/partsDetails")
 	@ApiOperationSupport(order = 2)
 	@ApiOperation(value = "分页", notes = "")
-	public R partsDetails(@RequestParam("goodsId") Long goodsId,@RequestParam(value = "storageId",required = false) Long storageId) {
+	public R partsDetails(@RequestParam("goodsId") Long goodsId, @RequestParam(value = "storageId", required = false) Long storageId) {
 		GoodsDesc goodsDesc = goodsDescService.getById(goodsId);
-		if (ObjectUtils.isNotNull(goodsDesc.getGoodsTypeId())){
+		if (ObjectUtils.isNotNull(goodsDesc.getGoodsTypeId())) {
 			String typeId = goodsDesc.getGoodsTypeId();
 			String[] split = typeId.split(",");
 			List<String> stringList = Arrays.asList(split);
@@ -128,9 +126,9 @@ public class GoodsDescPartsController extends BladeController {
 		StockGoods stockGoods = new StockGoods();
 		stockGoods.setGoodsId(goodsId);
 		List<StockGoods> stockGoodsList = stockGoodsClient.postListStockByCondition(stockGoods);
-		if (stockGoodsList.size()>0){
+		if (stockGoodsList.size() > 0) {
 			goodsDescDto.setStockGoodsList(stockGoodsList);
-		}else{
+		} else {
 			goodsDescDto.setStockGoodsList(new ArrayList<>());
 		}
 		R<StockGoodsVO> r = stockGoodsClient.selectStockParts(null, storageId, goodsId, null, null, null, null, null, null);
@@ -190,8 +188,8 @@ public class GoodsDescPartsController extends BladeController {
 		if (goodsDesc.getId() == null) {
 			return R.fail(500, "缺少参数");
 		}
-		R<List<OrderItems>> r = orderItemsClient.listByItemId(goodsDesc.getId(),null);
-		if (r.isSuccess() && r.getData().size()>0){
+		R<List<OrderItems>> r = orderItemsClient.listByItemId(goodsDesc.getId(), null);
+		if (r.isSuccess() && r.getData().size() > 0) {
 			return R.fail(500, "该产品已有订单禁用失败");
 		}
 		boolean status = goodsDescService.updateById(goodsDesc);
@@ -199,6 +197,25 @@ public class GoodsDescPartsController extends BladeController {
 	}
 
 	/**
+	 * 修改 商品详情表
+	 */
+	@PostMapping("/updateById")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入goodsDesc")
+	public R updateById(@Valid @RequestBody GoodsDesc goodsDesc) {
+
+		if (ObjectUtils.isNull(goodsDesc.getIds())) {
+			return R.fail(500, "缺少参数");
+		}
+		String[] ids = goodsDesc.getIds().split(",");
+		for (String id : ids) {
+			goodsDesc.setId(Long.parseLong(id));
+			goodsDescService.updateById(goodsDesc);
+		}
+		return R.data(goodsDesc);
+	}
+
+	/**
 	 * 导出模板
 	 */
 	@GetMapping("/export-descParts-info")

+ 126 - 0
blade-service/blade-client/src/main/java/org/springblade/client/tonglianPayment/controller/ParametersController.java

@@ -0,0 +1,126 @@
+/*
+ *      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.client.tonglianPayment.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.client.tonglianPayment.service.IParametersService;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.client.entity.Parameters;
+import org.springblade.client.vo.ParametersVO;
+import org.springblade.core.boot.ctrl.BladeController;
+
+/**
+ * 支付参数表 控制器
+ *
+ * @author BladeX
+ * @since 2022-12-13
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/parameters")
+@Api(value = "支付参数表", tags = "支付参数表接口")
+public class ParametersController extends BladeController {
+
+	private final IParametersService parametersService;
+
+	/**
+	 * 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入parameters")
+	public R<Parameters> detail(Parameters parameters) {
+		Parameters detail = parametersService.getOne(Condition.getQueryWrapper(parameters));
+		return R.data(detail);
+	}
+
+	/**
+	 * 分页 支付参数表
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入parameters")
+	public R<IPage<Parameters>> list(Parameters parameters, Query query) {
+		IPage<Parameters> pages = parametersService.page(Condition.getPage(query), Condition.getQueryWrapper(parameters));
+		return R.data(pages);
+	}
+
+	/**
+	 * 自定义分页 支付参数表
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入parameters")
+	public R<IPage<ParametersVO>> page(ParametersVO parameters, Query query) {
+		IPage<ParametersVO> pages = parametersService.selectParametersPage(Condition.getPage(query), parameters);
+		return R.data(pages);
+	}
+
+	/**
+	 * 新增 支付参数表
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入parameters")
+	public R save(@Valid @RequestBody Parameters parameters) {
+		return R.status(parametersService.save(parameters));
+	}
+
+	/**
+	 * 修改 支付参数表
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入parameters")
+	public R update(@Valid @RequestBody Parameters parameters) {
+		return R.status(parametersService.updateById(parameters));
+	}
+
+	/**
+	 * 新增或修改 支付参数表
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入parameters")
+	public R submit(@Valid @RequestBody Parameters parameters) {
+		return R.status(parametersService.saveOrUpdate(parameters));
+	}
+
+
+	/**
+	 * 删除 支付参数表
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(parametersService.removeByIds(Func.toLongList(ids)));
+	}
+
+
+}

+ 28 - 0
blade-service/blade-client/src/main/java/org/springblade/client/tonglianPayment/feign/TongLianPaymentClient.java

@@ -0,0 +1,28 @@
+package org.springblade.client.tonglianPayment.feign;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.AllArgsConstructor;
+import org.springblade.client.entity.Parameters;
+import org.springblade.client.feign.ITongLianPaymentClient;
+import org.springblade.client.tonglianPayment.service.IParametersService;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tenant.annotation.NonDS;
+import org.springframework.web.bind.annotation.RestController;
+import springfox.documentation.annotations.ApiIgnore;
+
+@NonDS
+@ApiIgnore()
+@RestController
+@AllArgsConstructor
+public class TongLianPaymentClient implements ITongLianPaymentClient {
+
+	private final IParametersService parametersService;
+
+
+	@Override
+	public Parameters getParametersOne() {
+		LambdaQueryWrapper<Parameters> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(Parameters::getIsDeleted, 0).eq(Parameters::getTenantId, AuthUtil.getTenantId()).eq(Parameters::getStatus, "1");
+		return parametersService.getOne(lambdaQueryWrapper);
+	}
+}

+ 42 - 0
blade-service/blade-client/src/main/java/org/springblade/client/tonglianPayment/mapper/ParametersMapper.java

@@ -0,0 +1,42 @@
+/*
+ *      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.client.tonglianPayment.mapper;
+
+import org.springblade.client.entity.Parameters;
+import org.springblade.client.vo.ParametersVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.List;
+
+/**
+ * 支付参数表 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2022-12-13
+ */
+public interface ParametersMapper extends BaseMapper<Parameters> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param parameters
+	 * @return
+	 */
+	List<ParametersVO> selectParametersPage(IPage page, ParametersVO parameters);
+
+}

+ 38 - 0
blade-service/blade-client/src/main/java/org/springblade/client/tonglianPayment/mapper/ParametersMapper.xml

@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.client.tonglianPayment.mapper.ParametersMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="parametersResultMap" type="org.springblade.client.entity.Parameters">
+        <id column="id" property="id"/>
+        <result column="orgid" property="orgid"/>
+        <result column="cus_id" property="cusId"/>
+        <result column="app_id" property="appId"/>
+        <result column="mch_id" property="mchId"/>
+        <result column="syb_app_id" property="sybAppId"/>
+        <result column="pay_type" property="payType"/>
+        <result column="pay_sign_key" property="paySignKey"/>
+        <result column="validtime" property="validtime"/>
+        <result column="notify_url" property="notifyUrl"/>
+        <result column="sub_appid" property="subAppid"/>
+        <result column="chnlstore_id" property="chnlstoreId"/>
+        <result column="subbranch" property="subbranch"/>
+        <result column="front_url" property="frontUrl"/>
+        <result column="cus_ip" property="cusIp"/>
+        <result column="remarks" property="remarks"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="create_user_name" property="createUserName"/>
+        <result column="update_user_name" property="updateUserName"/>
+        <result column="is_deleted" property="isDeleted"/>
+        <result column="status" property="status"/>
+    </resultMap>
+
+
+    <select id="selectParametersPage" resultMap="parametersResultMap">
+        select * from payment_parameters where is_deleted = 0
+    </select>
+
+</mapper>

+ 41 - 0
blade-service/blade-client/src/main/java/org/springblade/client/tonglianPayment/service/IParametersService.java

@@ -0,0 +1,41 @@
+/*
+ *      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.client.tonglianPayment.service;
+
+import org.springblade.client.entity.Parameters;
+import org.springblade.client.vo.ParametersVO;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 支付参数表 服务类
+ *
+ * @author BladeX
+ * @since 2022-12-13
+ */
+public interface IParametersService extends IService<Parameters> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param parameters
+	 * @return
+	 */
+	IPage<ParametersVO> selectParametersPage(IPage<ParametersVO> page, ParametersVO parameters);
+
+}

+ 41 - 0
blade-service/blade-client/src/main/java/org/springblade/client/tonglianPayment/service/impl/ParametersServiceImpl.java

@@ -0,0 +1,41 @@
+/*
+ *      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.client.tonglianPayment.service.impl;
+
+import org.springblade.client.entity.Parameters;
+import org.springblade.client.tonglianPayment.mapper.ParametersMapper;
+import org.springblade.client.tonglianPayment.service.IParametersService;
+import org.springblade.client.vo.ParametersVO;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 支付参数表 服务实现类
+ *
+ * @author BladeX
+ * @since 2022-12-13
+ */
+@Service
+public class ParametersServiceImpl extends ServiceImpl<ParametersMapper, Parameters> implements IParametersService {
+
+	@Override
+	public IPage<ParametersVO> selectParametersPage(IPage<ParametersVO> page, ParametersVO parameters) {
+		return page.setRecords(baseMapper.selectParametersPage(page, parameters));
+	}
+
+}

+ 44 - 11
blade-service/blade-client/src/main/java/org/springblade/client/wechat/controller/WechatController.java

@@ -3,15 +3,18 @@ package org.springblade.client.wechat.controller;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import okhttp3.*;
+import org.springblade.client.entity.Parameters;
+import org.springblade.client.tonglianPayment.service.IParametersService;
 import org.springblade.client.wechat.Util.AESUtil;
 import org.springblade.client.wechat.Util.HttpUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.jackson.JsonUtil;
-import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.core.tool.utils.StringUtil;
-import org.springframework.util.ObjectUtils;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -29,33 +32,62 @@ import java.util.Map;
 @Slf4j
 @RestController
 @RequestMapping("/wechat")
+@AllArgsConstructor
 public class WechatController {
 
+	private final IParametersService parametersService;
+
 	// 登录凭证校验地址
 	public final static String GetPageAccessTokenUrl = "https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=CODE&grant_type=authorization_code";
 	// 小程序的appId以及appSecret
 	private static final String appId = "wx0a0feca24b695636";
 	private static final String appSecret = "b3efb530f9ef97626e2ec31fc7a3af56";
+//	private static final String appSecret = "d78d26f94e756c89f2623cc2e3050237";
 
 	/**
 	 * 微信授权登录
 	 *
 	 * @param loginCode 登录code
-	 * @param telCode	获取手机号code
+	 * @param telCode   获取手机号code
 	 * @return 结果
 	 */
 	@GetMapping("programLogin")
 	public R<Map<String, Object>> weChatProgramLogin(@RequestParam("loginCode") String loginCode,
 													 @RequestParam("telCode") String telCode,
 													 @RequestParam("encryptedData") String encryptedData,
-													 @RequestParam("iv") String iv)
-	throws IOException {
+													 @RequestParam("iv") String iv,
+													 @RequestParam("applets_id") String applets_id)
+		throws IOException {
 		if (StringUtil.isBlank(loginCode)) {
 			throw new SecurityException("登录code获取失败");
 		}
-		Map<String, Object> map = new HashMap<>(16);
 
-		String requestUrl = GetPageAccessTokenUrl.replace("APPID", appId).replace("SECRET", appSecret).replace("CODE", loginCode);
+		LambdaQueryWrapper<Parameters> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(Parameters::getIsDeleted,0)
+			.eq(Parameters::getStatus,1)
+			.eq(Parameters::getSubAppid,applets_id);
+		Parameters parameters = parametersService.getOne(lambdaQueryWrapper);
+		if (ObjectUtils.isNull(parameters)){
+			throw new SecurityException("未找到小程序信息");
+		}
+
+		if (ObjectUtils.isNull(parameters.getAppSecret())){
+			throw new SecurityException("未找到小程序秘钥");
+		}
+
+		Map<String, Object> map = new HashMap<>(16);
+		String requestUrl = "";
+		String appIds = "";
+		String appSecrets = "";
+		if (ObjectUtils.isNotNull(applets_id)) {
+			appIds = applets_id;
+			appSecrets = parameters.getAppSecret();
+			requestUrl = GetPageAccessTokenUrl.replace("APPID", appIds).replace("SECRET", appSecrets).replace("CODE", loginCode);
+		} else {
+			appIds = appId;
+			appSecrets = appSecret;
+			requestUrl = GetPageAccessTokenUrl.replace("APPID", appIds).replace("SECRET", appSecrets).replace("CODE", loginCode);
+		}
 		try {
 			String response = HttpUtil.get(requestUrl);
 			JSONObject jsonObject = JSONObject.parseObject(response);
@@ -80,7 +112,7 @@ public class WechatController {
 			// ps:此处一定要注意解密的出来的字段名为驼峰命名的unionId,openId,并非直接授权的unionid
 			String unionid = String.valueOf(parseObject.get("unionId"));
 			map.put("openid", openid);
-			map.put("unionid",unionid);
+			map.put("unionid", unionid);
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
@@ -88,7 +120,8 @@ public class WechatController {
 
 		OkHttpClient client = new OkHttpClient();
 		//获得token
-		Request request = new Request.Builder().url("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wx0a0feca24b695636&secret=b3efb530f9ef97626e2ec31fc7a3af56").build();
+
+		Request request = new Request.Builder().url("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appIds + "&secret=" + appSecrets + "").build();
 		try {
 
 			Response responseToken = client.newCall(request).execute();
@@ -98,7 +131,7 @@ public class WechatController {
 				//得到一个JSON对象
 				JSONObject object = JSON.parseObject(body);
 				String accessToken = object.getString("access_token");
-				if (ObjectUtil.isNotEmpty(accessToken)) {
+				if (ObjectUtils.isNotNull(accessToken)) {
 					map.put("accessToken", accessToken);
 				} else {
 					throw new RuntimeException("access_token获取失败");
@@ -128,7 +161,7 @@ public class WechatController {
 				JSONObject object = JSON.parseObject(body);
 				if (object.getString("errcode").equals("0")) {
 					JSONObject jsonObject = object.getJSONObject("phone_info");
-					if (ObjectUtil.isNotEmpty(jsonObject)) {
+					if (ObjectUtils.isNotNull(jsonObject)) {
 						String phoneNumber = jsonObject.getString("phoneNumber");
 						if (ObjectUtils.isEmpty(phoneNumber)) {
 							throw new RuntimeException("获取手机号异常");

+ 69 - 13
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/partsapp/AppPartsController.java

@@ -25,8 +25,10 @@ import com.trade.purchase.order.enums.OrderTypeEnum;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.springblade.client.entity.CorpsAttn;
 import org.springblade.client.entity.CorpsDesc;
 import org.springblade.client.entity.StorageDesc;
+import org.springblade.client.feign.ICorpsAttnClient;
 import org.springblade.client.feign.ICorpsDescClient;
 import org.springblade.client.feign.IStorageClient;
 import org.springblade.core.boot.ctrl.BladeController;
@@ -76,6 +78,10 @@ public class AppPartsController extends BladeController {
 	private final IUserClient userClient;//获取用户信息
 	private IStorageClient iStorageClient;//库区信息
 	private final IFinanceClient financeClient;
+	/**
+	 * 库区信息
+	 */
+	private final ICorpsAttnClient corpsAttnClient;
 
 	/**
 	 * 获得app首页营业收入和采购支出(配件系统)
@@ -114,18 +120,34 @@ public class AppPartsController extends BladeController {
 		lambdaQueryWrapper.eq(Order::getIsDeleted, 0);//订单是否有效
 		lambdaQueryWrapper.like(Func.isNotEmpty(order.getOrderNo()), Order::getOrderNo, order.getOrderNo());//订单号
 		lambdaQueryWrapper.eq(Func.isNotEmpty(order.getStorageId()), Order::getStorageId, order.getStorageId());//仓库id
-		if (ObjectUtils.isNotNull(order.getCorpsName())) {
-			String corpsName = order.getCorpsName().replaceAll(" ","");
-			List<Long> ids = corpsDescClient.listCorpIdByName(corpsName);
-			if (ObjectUtils.isNotNull(ids) && ids.size() > 0) {
-				lambdaQueryWrapper.in(Order::getCorpId, ids);//客户id
+		if ("线上".equals(order.getOrderSource())) {
+			CorpsAttn corpsAttn = corpsAttnClient.getUser(AuthUtil.getUserId());
+			if (ObjectUtils.isNotNull(corpsAttn)) {
+				CorpsDesc corpsDesc = corpsDescClient.getCorpId(corpsAttn.getPid());
+				if (ObjectUtils.isNotNull(corpsDesc)) {
+					lambdaQueryWrapper.eq(Func.isNotEmpty(corpsDesc.getId()), Order::getCorpId, corpsDesc.getId());//客户id
+				} else {
+					lambdaQueryWrapper.eq(Order::getCorpId, 0);//客户id
+				}
 			} else {
-				lambdaQueryWrapper.isNull(Order::getCorpId);
+				lambdaQueryWrapper.eq(Order::getCorpId, 0);//客户id
 			}
 		} else {
-			lambdaQueryWrapper.like(Func.isNotEmpty(order.getCorpId()), Order::getCorpId, order.getCorpId());//客户id
+			if (ObjectUtils.isNotNull(order.getCorpsName())) {
+				String corpsName = order.getCorpsName().replaceAll(" ", "");
+				List<Long> ids = corpsDescClient.listCorpIdByName(corpsName);
+				if (ObjectUtils.isNotNull(ids) && ids.size() > 0) {
+					lambdaQueryWrapper.in(Order::getCorpId, ids);//客户id
+				} else {
+					lambdaQueryWrapper.isNull(Order::getCorpId);
+				}
+			} else {
+				lambdaQueryWrapper.like(Func.isNotEmpty(order.getCorpId()), Order::getCorpId, order.getCorpId());//客户id
+			}
 		}
-		lambdaQueryWrapper.eq(ObjectUtils.isNotNull(order.getSalesName()),Order::getSalesName, order.getSalesName());//业务员
+		lambdaQueryWrapper.eq(Func.isNotEmpty(order.getOrderSource()), Order::getOrderSource, order.getOrderSource());//订单来源
+		lambdaQueryWrapper.eq(Func.isNotEmpty(order.getStatus()), Order::getStatus, order.getStatus());//订单状态
+		lambdaQueryWrapper.eq(ObjectUtils.isNotNull(order.getSalesName()), Order::getSalesName, order.getSalesName());//业务员
 		lambdaQueryWrapper.ge(Func.isNotEmpty(order.getContractStartDate()), Order::getBusinesDate, order.getContractStartDate());//合同日期开始
 		lambdaQueryWrapper.le(Func.isNotEmpty(order.getContractEndDate()), Order::getBusinesDate, order.getContractEndDate());//合同日期结束
 		lambdaQueryWrapper.like(Func.isNotEmpty(order.getSrcOrderNo()), Order::getSrcOrderNo, order.getSrcOrderNo());//订单来源
@@ -327,7 +349,7 @@ public class AppPartsController extends BladeController {
 		lambdaQueryWrapper.eq(Order::getBillType, OrderTypeEnum.SALES.getType());
 		lambdaQueryWrapper.eq(Order::getTradeType, OrderTypeEnum.PARTS.getType());
 		lambdaQueryWrapper.eq(Order::getConfirmStatus, 1);
-		lambdaQueryWrapper.eq(ObjectUtils.isNotNull(order.getSalesName()),Order::getSalesName, order.getSalesName());//业务员
+		lambdaQueryWrapper.eq(ObjectUtils.isNotNull(order.getSalesName()), Order::getSalesName, order.getSalesName());//业务员
 		List<Order> orderList = orderService.list(lambdaQueryWrapper);
 
 		BigDecimal total = new BigDecimal("0.00");
@@ -457,8 +479,8 @@ public class AppPartsController extends BladeController {
 		order.setBillType("XS");
 		order.setTradeType("YPJ");
 		List<Order> orderList = orderService.turnoverAnalysisList("XS", null, statusDate, endDate);
-		if (orderList.size()>0 && !income.equals(new BigDecimal("0.00"))){
-			averageAmount = averageAmount.add(income.divide(new BigDecimal(orderList.size()),MathContext.DECIMAL32).setScale(2,BigDecimal.ROUND_HALF_UP));
+		if (orderList.size() > 0 && !income.equals(new BigDecimal("0.00"))) {
+			averageAmount = averageAmount.add(income.divide(new BigDecimal(orderList.size()), MathContext.DECIMAL32).setScale(2, BigDecimal.ROUND_HALF_UP));
 		}
 		map.put("income", income);
 		map.put("expenditure", expenditure);
@@ -479,7 +501,7 @@ public class AppPartsController extends BladeController {
 		lambdaQueryWrapper.eq(Order::getTenantId, AuthUtil.getTenantId());//租户id
 		lambdaQueryWrapper.eq(Order::getIsDeleted, 0);//订单是否有效
 		if (ObjectUtils.isNotNull(order.getCorpsName())) {
-			String corpsName = order.getCorpsName().replaceAll(" ","");
+			String corpsName = order.getCorpsName().replaceAll(" ", "");
 			List<Long> ids = corpsDescClient.listCorpIdByName(corpsName);
 			if (ObjectUtils.isNotNull(ids) && ids.size() > 0) {
 				lambdaQueryWrapper.in(Order::getCorpId, ids);//客户id
@@ -532,7 +554,7 @@ public class AppPartsController extends BladeController {
 		lambdaQueryWrapper.eq(Order::getTenantId, AuthUtil.getTenantId());//租户id
 		lambdaQueryWrapper.eq(Order::getIsDeleted, 0);//订单是否有效
 		if (ObjectUtils.isNotNull(order.getCorpsName())) {
-			String corpsName = order.getCorpsName().replaceAll(" ","");
+			String corpsName = order.getCorpsName().replaceAll(" ", "");
 			List<Long> ids = corpsDescClient.listCorpIdByName(corpsName);
 			if (ObjectUtils.isNotNull(ids) && ids.size() > 0) {
 				lambdaQueryWrapper.in(Order::getCorpId, ids);//客户id
@@ -573,4 +595,38 @@ public class AppPartsController extends BladeController {
 		ExcelUtil.export(response, "导出应收明细信息", "导出数据表", BeanUtil.copy(list, AnalysisDetailsExcel.class), AnalysisDetailsExcel.class);
 	}
 
+	/**
+	 * 销售或采购订单表(app 退货退款)
+	 */
+	@PostMapping("/returnGoodsRefund")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入order")
+	public R returnGoodsRefund(@Valid @RequestBody Order order) {
+		order.setTradeType(OrderTypeEnum.PARTS.getType());
+		return orderService.returnGoodsRefund(order);
+	}
+
+	/**
+	 * 销售或采购订单表(发货)
+	 */
+	@PostMapping("/shippingOrder")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入order")
+	public R shippingOrder(@Valid @RequestBody Order order) {
+		order.setTradeType(OrderTypeEnum.PARTS.getType());
+		return orderService.shippingOrder(order);
+	}
+
+	/**
+	 * 获得小程序个人信息(配件系统)
+	 *
+	 * @param tenantId
+	 * @return
+	 */
+	@GetMapping("/personalInformation")
+	@ApiOperation(value = "获得小程序个人信息", notes = "传入order")
+	public R personalInformation(@RequestParam(value = "tenantId",required = false) String tenantId) {
+		return orderService.personalInformation(tenantId);
+	}
+
 }

+ 8 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/IOrderService.java

@@ -383,4 +383,12 @@ public interface IOrderService extends IService<Order> {
 	int corpAnalysis(Order order);
 
 	List<Order> turnoverAnalysisList(String billType,String type, String statusDate, String endDate);
+
+	R returnGoodsRefund(Order order);
+
+    R payPrepay(Long orderId);
+
+	R personalInformation(String tenantId);
+
+	R shippingOrder(Order order);
 }

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 663 - 78
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/impl/OrderServiceImpl.java


+ 131 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/tonglianPayment/controller/TongLianPaymentController.java

@@ -0,0 +1,131 @@
+/*
+ *      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.purchase.sales.tonglianPayment.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.purchase.sales.entity.Order;
+import org.springblade.purchase.sales.service.IOrderService;
+import org.springblade.purchase.sales.tonglianPayment.method.NotifyServlet;
+import org.springblade.purchase.sales.tonglianPayment.utils.AnalysisMapUtils;
+import org.springblade.purchase.sales.tonglianPayment.utils.SybConstants;
+import org.springblade.purchase.sales.tonglianPayment.utils.SybUtil;
+import org.springblade.system.cache.ParamCache;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+import springfox.documentation.annotations.ApiIgnore;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Date;
+import java.util.TreeMap;
+
+import static org.springblade.common.constant.TenantConstant.PAYMENT_PARAMETER;
+
+/**
+ * 通联支付 控制器
+ *
+ * @author BladeX
+ * @since 2021-09-26
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/tongLianPayment")
+@Api(value = "通联支付", tags = "微信支付")
+public class TongLianPaymentController extends BladeController {
+
+	private final IOrderService orderService;
+
+
+	/**
+	 * 获取支付的请求参数
+	 */
+	@ApiOperation(value = "获取支付的请求参数")
+	@PostMapping("prepay")
+	public R payPrepay(Long orderId) {
+		return R.data(orderService.payPrepay(orderId));
+	}
+
+	/**
+	 * 微信订单回调接口
+	 *
+	 * @return
+	 */
+	@ApiIgnore
+	@RequestMapping(value = "/notify", method = RequestMethod.POST, produces = "text/html;charset=UTF-8")
+	public void notify(HttpServletRequest request, HttpServletResponse response) {
+		try {
+			request.setCharacterEncoding("UTF-8");//通知传输的编码为GBK
+			response.setCharacterEncoding("UTF-8");
+			TreeMap<String, String> params = NotifyServlet.getParams(request);
+			String appkey = "";
+			if (ParamCache.getValue(PAYMENT_PARAMETER).equals("0")) {
+				if ("RSA".equals(params.get("signtype")))
+					appkey = SybConstants.SYB_RSATLPUBKEY_TEST;
+				else if ("SM2".equals(params.get("signtype")))
+					appkey = SybConstants.SYB_SM2TLPUBKEY_TEST;
+				else
+					appkey = SybConstants.SYB_MD5_APPKEY_TEST;
+			}else{
+				if ("RSA".equals(params.get("signtype")))
+					appkey = SybConstants.SYB_RSATLPUBKEY;
+				else if ("SM2".equals(params.get("signtype")))
+					appkey = SybConstants.SYB_SM2TLPUBKEY;
+				else
+					appkey = SybConstants.SYB_MD5_APPKEY;
+			}
+			boolean isSign = SybUtil.validSign(params, appkey, params.get("signtype"));// 接受到推送通知,首先验签
+			System.out.println("验签结果:" + isSign);
+			if (isSign) {
+				String trxstatus = AnalysisMapUtils.getString("trxstatus", params);
+				if (trxstatus.equals("0000")) {
+
+					System.out.println("订单" + AnalysisMapUtils.getString("cusorderid", params) + "支付成功");
+					// 业务处理
+					LambdaQueryWrapper<Order> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+					lambdaQueryWrapper.eq(Order::getSysNo, AnalysisMapUtils.getString("cusorderid", params))
+						.eq(Order::getTenantId, AuthUtil.getTenantId())
+						.eq(Order::getIsDeleted, 0);
+					Order orderInfo = orderService.getOne(lambdaQueryWrapper);
+					orderInfo.setActualPaymentStatus(2);
+					orderInfo.setStatus(2);
+					orderInfo.setAccountsCollectionDate(new Date());
+					orderService.updateById(orderInfo);
+					response.getWriter().write(AnalysisMapUtils.setXML("SUCCESS", "OK"));
+				} else {
+					//订单编号
+					System.out.println("订单" + AnalysisMapUtils.getString("cusorderid", params) + "支付失败");
+					response.getWriter().write(AnalysisMapUtils.setXML("error", "OK"));
+				}
+			} else {
+				throw new RuntimeException("签名验证失败");
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			return;
+		}
+	}
+
+
+}

+ 63 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/tonglianPayment/method/ApiTestV2.java

@@ -0,0 +1,63 @@
+package org.springblade.purchase.sales.tonglianPayment.method;
+
+import org.springblade.purchase.sales.tonglianPayment.utils.SybPayService;
+
+import java.util.Map;
+
+
+public class ApiTestV2 {
+	/*public static void main(String[] args) throws Exception {
+		testPay();//统一下单,异步类交易
+		testScanPay();//统一扫码,被扫交易
+		testCancel();//撤销
+		testRefund();//退款
+		testQuery();//查询
+	}*/
+
+
+	public static void testScanPay() throws Exception {
+		// TODO Auto-generated method stub
+		SybPayService service = new SybPayService();
+		String reqsn = String.valueOf(System.currentTimeMillis());
+		Map<String, String> map = service.scanPay(1, reqsn, "标题", "备注", "134775931316089668", "", "", "", "");
+		print(map);
+	}
+
+	public static void testQuery() throws Exception {
+		SybPayService service = new SybPayService();
+		Map<String, String> map = service.query("", "112094120001088317");
+		print(map);
+	}
+
+	public static void testRefund() throws Exception {
+		SybPayService service = new SybPayService();
+		String reqsn = String.valueOf(System.currentTimeMillis());
+		Map<String, String> map = service.refund(1, reqsn, "", "20160712167578.2547");
+		print(map);
+	}
+
+	public static void testCancel() throws Exception {
+		SybPayService service = new SybPayService();
+		String reqsn = String.valueOf(System.currentTimeMillis());
+		Map<String, String> map = service.cancel(1, reqsn, "112094120001088316", "");
+		print(map);
+	}
+
+	public static void testPay() throws Exception {
+		SybPayService service = new SybPayService();
+		String reqsn = String.valueOf(System.currentTimeMillis());
+		Map<String, String> map = service.pay(1, reqsn, "W01", "标题", "备注", "", "123", "https://test.allinpaygd.com/JWeb/NotifyServlet", "", "", "", "", "", "", "", "", "", "", "", "");
+		print(map);
+	}
+
+	public static void print(Map<String, String> map) {
+		System.out.println("返回数据如下:");
+		if (map != null) {
+			for (String key : map.keySet()) {
+				System.out.println(key + ";" + map.get(key));
+			}
+		}
+	}
+
+
+}

+ 68 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/tonglianPayment/method/NotifyServlet.java

@@ -0,0 +1,68 @@
+package org.springblade.purchase.sales.tonglianPayment.method;
+
+import org.springblade.purchase.sales.tonglianPayment.utils.SybConstants;
+import org.springblade.purchase.sales.tonglianPayment.utils.SybUtil;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.Map;
+import java.util.TreeMap;
+
+
+public class NotifyServlet extends HttpServlet {
+	private static final long serialVersionUID = 1L;
+
+	public NotifyServlet() {
+		super();
+	}
+
+	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+		System.out.println("get method,no deal");
+	}
+
+	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+		System.out.println("接收到通知");
+		request.setCharacterEncoding("UTF-8");//通知传输的编码为GBK
+		response.setCharacterEncoding("UTF-8");
+		TreeMap<String, String> params = getParams(request);//动态遍历获取所有收到的参数,此步非常关键,因为收银宝以后可能会加字段,动态获取可以兼容
+		try {
+			String appkey = "";
+			if ("RSA".equals(params.get("signtype")))
+				appkey = SybConstants.SYB_RSATLPUBKEY;
+			else if ("SM2".equals(params.get("signtype")))
+				appkey = SybConstants.SYB_SM2TLPUBKEY;
+			else
+				appkey = SybConstants.SYB_MD5_APPKEY;
+			boolean isSign = SybUtil.validSign(params, appkey, params.get("signtype"));// 接受到推送通知,首先验签
+			System.out.println("验签结果:" + isSign);
+			//验签完毕进行业务处理
+		} catch (Exception e) {//处理异常
+			// TODO: handle exception
+			e.printStackTrace();
+		} finally {//收到通知,返回success
+			response.getOutputStream().write("success".getBytes());
+			response.flushBuffer();
+		}
+	}
+
+	/**
+	 * 动态遍历获取所有收到的参数,此步非常关键,因为收银宝以后可能会加字段,动态获取可以兼容由于收银宝加字段而引起的签名异常
+	 *
+	 * @param request
+	 * @return
+	 */
+	public static TreeMap<String, String> getParams(HttpServletRequest request) {
+		TreeMap<String, String> map = new TreeMap<String, String>();
+		Map reqMap = request.getParameterMap();
+		for (Object key : reqMap.keySet()) {
+			String value = ((String[]) reqMap.get(key))[0];
+			System.out.println(key + ";" + value);
+			map.put(key.toString(), value);
+		}
+		return map;
+	}
+
+}

+ 33 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/tonglianPayment/utils/AnalysisMapUtils.java

@@ -0,0 +1,33 @@
+package org.springblade.purchase.sales.tonglianPayment.utils;
+
+import java.util.Map;
+
+public class AnalysisMapUtils {
+
+	public static String getString(String key, Map<String, String> map) {
+		if (map == null || key == null)
+			throw new IllegalArgumentException();
+		if (!map.containsKey(key))
+			return null;
+		Object value = map.get(key);
+		if (value == null)
+			return null;
+		return value.toString();
+	}
+
+	/**
+	 * 发送xml格式数据到微信服务器 告知微信服务器回调信息已经收到。
+	 *
+	 * 作者: zhoubang 日期:2015年6月10日 上午9:27:33
+	 *
+	 * @param return_code
+	 * @param return_msg
+	 * @return
+	 */
+	public static String setXML(String return_code, String return_msg) {
+		return "<xml><return_code><![CDATA[" + return_code
+			+ "]]></return_code><return_msg><![CDATA[" + return_msg
+			+ "]]></return_msg></xml>";
+	}
+
+}

+ 124 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/tonglianPayment/utils/HttpConnectionUtil.java

@@ -0,0 +1,124 @@
+package org.springblade.purchase.sales.tonglianPayment.utils;
+
+import java.io.ByteArrayOutputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.URLEncoder;
+import java.util.Map;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.SSLSession;
+
+import org.apache.commons.logging.Log;
+
+public class HttpConnectionUtil {
+	private HttpURLConnection conn;
+	private String connectUrl;
+
+	public HttpConnectionUtil(String connectUrl){
+		this.connectUrl = connectUrl;
+	}
+
+	public void init() throws Exception{
+		URL url = new URL(connectUrl);
+		System.setProperty("java.protocol.handler.pkgs", "javax.net.ssl");
+	    HostnameVerifier hv = new HostnameVerifier() {
+	         public boolean verify(String urlHostName, SSLSession session) {
+	         return urlHostName.equals(session.getPeerHost());
+	         }
+	    };
+	    HttpsURLConnection.setDefaultHostnameVerifier(hv);
+    	URLConnection conn = url.openConnection();
+    	conn.setDoInput(true);
+    	conn.setDoOutput(true);
+    	conn.setReadTimeout(60000);
+    	conn.setConnectTimeout(30000);
+    	if (conn instanceof HttpsURLConnection){
+    		HttpsURLConnection httpsConn = (HttpsURLConnection)conn;
+    		httpsConn.setSSLSocketFactory(SSLUtil.getInstance().getSSLSocketFactory());
+    	} else if (conn instanceof HttpURLConnection){
+    		HttpURLConnection httpConn = (HttpURLConnection)conn;
+    	} else {
+    		throw new Exception("不是http/https协议的url");
+    	}
+    	this.conn = (HttpURLConnection)conn;
+    	initDefaultPost();
+	}
+
+	public void destory(){
+		try{
+			if(this.conn!=null){
+				this.conn.disconnect();
+			}
+		}catch(Exception e){
+
+		}
+	}
+
+    private void initDefaultPost() throws Exception{
+    	conn.setDoOutput(true);
+    	conn.setDoInput(true);
+    	conn.setRequestMethod("POST");
+    	conn.setUseCaches(false);
+    	conn.setInstanceFollowRedirects(true);
+    	conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
+    }
+
+    public byte[] postParams(Map<String, String> params,boolean readreturn) throws IOException {
+    	StringBuilder outBuf = new StringBuilder();
+    	boolean isNotFirst = false;
+    	for (Map.Entry<String, String> entry: params.entrySet()){
+    		if (isNotFirst)
+    			outBuf.append('&');
+    		isNotFirst = true;
+    		outBuf
+    			.append(entry.getKey())
+    			.append('=')
+    			.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
+    	}
+    	System.out.println("参数:"+outBuf.toString());
+    	return postParams(outBuf.toString(),readreturn);
+    }
+
+    public byte[] postParams(String message,boolean readreturn) throws IOException {
+    	DataOutputStream out = new DataOutputStream(conn.getOutputStream());
+    	out.write(message.getBytes("UTF-8"));
+    	out.close();
+    	if(readreturn){
+    		return readBytesFromStream(conn.getInputStream());
+    	}else{
+    		return null;
+    	}
+    }
+
+    public byte[] postParams(byte[] message,boolean readreturn) throws IOException {
+    	DataOutputStream out = new DataOutputStream(conn.getOutputStream());
+    	out.write(message);
+    	out.close();
+    	if(readreturn){
+    		return readBytesFromStream(conn.getInputStream());
+    	}else{
+    		return null;
+    	}
+    }
+
+    private byte[] readBytesFromStream(InputStream is) throws IOException{
+    	ByteArrayOutputStream baos = new ByteArrayOutputStream();
+    	int readLen;
+    	byte[] tmpBuf = new byte[4096];
+    	while ((readLen = is.read(tmpBuf)) > 0)
+    		baos.write(tmpBuf, 0, readLen);
+    	is.close();
+    	return baos.toByteArray();
+    }
+
+	public HttpURLConnection getConn() {
+		return conn;
+	}
+
+}

+ 50 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/tonglianPayment/utils/RandomStringUtils.java

@@ -0,0 +1,50 @@
+package org.springblade.purchase.sales.tonglianPayment.utils;
+
+import java.util.Random;
+
+public class RandomStringUtils {
+	public static String getRandomString(int length) {
+
+		//1. 定义一个字符串(A-Z,a-z,0-9)即62个数字字母;
+
+		String str = "zxcvbnmlkjhgfdsaqwertyuiopQWERTYUIOPASDFGHJKLZXCVBNM1234567890";
+
+		//2. 由Random生成随机数
+
+		Random random = new Random();
+
+		StringBuffer sb = new StringBuffer();
+
+		//3. 长度为几就循环几次
+
+		for (
+			int i = 0;
+			i < length; ++i) {
+
+			//从62个的数字或字母中选择
+
+			int number = random.nextInt(62);
+
+			//将产生的数字通过length次承载到sb中
+
+			sb.append(str.charAt(number));
+
+		}
+
+		//将承载的字符转换成字符串
+
+		return sb.toString();
+
+	}
+
+	/*public static void main(String[] args) {
+
+		//这里的32是生成32位随机码,根据你的需求,自定义
+
+		String random1 = getRandomString(32);
+
+		System.out.println(random1);
+
+	}*/
+
+}

+ 54 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/tonglianPayment/utils/SSLUtil.java

@@ -0,0 +1,54 @@
+package org.springblade.purchase.sales.tonglianPayment.utils;
+
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+
+/**
+ * SSL管理助手类
+ * @author Administrator
+ *
+ */
+public class SSLUtil implements X509TrustManager {
+	private SSLSocketFactory sslFactory = null;
+
+	private SSLUtil(){
+	}
+
+	public void checkClientTrusted(X509Certificate[] arg0, String arg1)
+			throws CertificateException {
+	}
+
+	public void checkServerTrusted(X509Certificate[] arg0, String arg1)
+			throws CertificateException {
+	}
+
+	public X509Certificate[] getAcceptedIssuers() {
+		return null;
+	}
+
+	/** 获取SSL Socket工厂 */
+	public SSLSocketFactory getSSLSocketFactory(){
+		return sslFactory;
+	}
+
+	private static SSLUtil _instance = null;
+
+	/** 获取SSL管理助手类实例 */
+	synchronized public static SSLUtil getInstance() throws NoSuchAlgorithmException, KeyManagementException {
+		if (_instance == null){
+			_instance = new SSLUtil();
+			SSLContext sc = SSLContext.getInstance("SSLv3");
+			sc.init(null, new TrustManager[]{new SSLUtil()}, null);
+			_instance.sslFactory = sc.getSocketFactory();
+		}
+		return _instance;
+	}
+
+}

+ 138 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/tonglianPayment/utils/SmUtil.java

@@ -0,0 +1,138 @@
+package org.springblade.purchase.sales.tonglianPayment.utils;
+
+import java.io.IOException;
+import java.math.BigInteger;
+import java.security.KeyFactory;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.SecureRandom;
+import java.security.Security;
+import java.security.Signature;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.Arrays;
+
+import org.apache.commons.codec.binary.Base64;
+import org.bouncycastle.asn1.ASN1EncodableVector;
+import org.bouncycastle.asn1.ASN1Integer;
+import org.bouncycastle.asn1.ASN1Sequence;
+import org.bouncycastle.asn1.DERSequence;
+import org.bouncycastle.jcajce.spec.SM2ParameterSpec;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.bouncycastle.util.encoders.Hex;
+
+public class SmUtil {
+	static{
+        Security.addProvider(new BouncyCastleProvider());
+    }
+	/**算法常量:SM3withSM2*/
+	public static final String ALGORITHM_SM3SM2_BCPROV  		 = "SM3withSM2";
+	private final static int SM3withSM2_RS_LEN=32;
+
+	/*public static void main(String[] args) throws Exception {
+		*//**商户平台分配的appid,也是签名的certid**//*
+		String appid = "00000156";
+		*//**商户sm2私钥,用于向通联发起请求前进行签名**//*
+		String cusPrivateKey = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgjj4Rk+b0YjwO+UwXofnHf4bK+kaaY5Btkd8nMP2VimmgCgYIKoEcz1UBgi2hRANCAAQqlALW4qGC3bP1x3wo5QsKxaCMEZJ2ODTTwOQ+d8UGU7GoK/y/WMBQWf5upMnFU06p5FxGooXYYoBtldgm03hq";
+		*//**商户sm2公钥,需要配置到通联商户平台**//*
+		String cusPubKey = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEKpQC1uKhgt2z9cd8KOULCsWgjBGSdjg008DkPnfFBlOxqCv8v1jAUFn+bqTJxVNOqeRcRqKF2GKAbZXYJtN4ag==";
+
+		*//**通联平台sm2公钥,用于请求返回或者通联通知的验签**//*
+		String tlPubKey = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE/BnA8BawehBtH0ksPyayo4pmzL/u1FQ2sZcqwOp6bjVqQX4tjo930QAvHZPJ2eez8sCz/RYghcqv4LvMq+kloQ==";
+
+		String blankStr = "请求待签名数据";
+		PrivateKey privkey = privKeySM2FromBase64Str(cusPrivateKey);
+		String sign = signSM3SM2RetBase64(privkey, appid, blankStr.getBytes("UTF-8"));//签名
+		System.out.println(sign);
+
+		String rspBlankStr = "返回待验签数据";//通联返回的明文
+		String rspSign = "AovBKQGUe0xuJ0ox7FgIIX+yB3DzbudgUsnNvJmDV0IdHZtU2Y8vdeUY1pd2vmPUf08hNgdkoz+4WP/D/ktOcA==";//通联返回的签名
+		PublicKey publicKey = pubKeySM2FromBase64Str(tlPubKey);
+		boolean isOk = verifySM3SM2(publicKey, "Allinpay", Base64.decodeBase64(rspSign), rspBlankStr.getBytes("UTF-8"));
+		System.out.println("验签结果:"+isOk);
+
+
+	}*/
+
+	/**签名并BASE64编码-SM3WithSM2 */
+	public static String signSM3SM2RetBase64(final PrivateKey privateKey,String certid,final byte[] data) throws Exception{
+		return Base64.encodeBase64String(signSM3SM2(privateKey, certid, data));
+	}
+
+	/**签名-SM3WithSM2 */
+	public static byte[] signSM3SM2(final PrivateKey privateKey,String certid,final byte[] data) throws Exception{
+		SM2ParameterSpec parameterSpec = new SM2ParameterSpec(certid.getBytes());
+		Signature signer = Signature.getInstance(ALGORITHM_SM3SM2_BCPROV, "BC");
+		signer.setParameter(parameterSpec);
+		signer.initSign(privateKey, new SecureRandom());
+		signer.update(data);
+		return byteAsn12BytePlain(signer.sign());
+	}
+
+	/** 验证签名-SM3WithSM2*/
+	public static boolean verifySM3SM2(final PublicKey publicKey,String certid,final byte[] signData, final byte[] srcData) throws Exception {
+        SM2ParameterSpec parameterSpec = new SM2ParameterSpec(certid.getBytes());
+        Signature verifier = Signature.getInstance(ALGORITHM_SM3SM2_BCPROV, "BC");
+        verifier.setParameter(parameterSpec);
+        verifier.initVerify(publicKey);
+        verifier.update(srcData);
+        return verifier.verify(bytePlain2ByteAsn1(signData));
+	}
+
+	/**从字符串读取私钥-目前支持PKCS8(keystr为BASE64格式)*/
+	public static PrivateKey privKeySM2FromBase64Str(String keystr) throws Exception {
+		KeyFactory keyFactory = KeyFactory.getInstance("EC");
+		return keyFactory.generatePrivate(new PKCS8EncodedKeySpec(Base64.decodeBase64(keystr)));
+	}
+
+	/**从字符串读取RSA公钥(keystr为BASE64格式)*/
+	public static PublicKey pubKeySM2FromBase64Str(String keystr) throws Exception {
+		KeyFactory keyFactory = KeyFactory.getInstance("EC");
+		return keyFactory.generatePublic(new X509EncodedKeySpec(Base64.decodeBase64(keystr)));
+	}
+
+	/**
+	 * 将普通字节数组转换为ASN1字节数组 适用于SM3withSM2验签时验签明文转换
+	 */
+	private static byte[] bytePlain2ByteAsn1(byte[] data) {
+		if (data.length != SM3withSM2_RS_LEN * 2) throw new RuntimeException("err data. ");
+		BigInteger r = new BigInteger(1, Arrays.copyOfRange(data, 0, SM3withSM2_RS_LEN));
+		BigInteger s = new BigInteger(1, Arrays.copyOfRange(data, SM3withSM2_RS_LEN, SM3withSM2_RS_LEN * 2));
+		ASN1EncodableVector v = new ASN1EncodableVector();
+		v.add(new ASN1Integer(r));
+		v.add(new ASN1Integer(s));
+		try {
+			return new DERSequence(v).getEncoded("DER");
+		} catch (IOException e) {
+			throw new RuntimeException(e);
+		}
+	}
+	/**
+	 * 将ASN1字节数组转换为普通字节数组 适用于SM3withSM2签名时签名结果转换
+	 */
+	private static byte[] byteAsn12BytePlain(byte[] dataAsn1) {
+		ASN1Sequence seq = ASN1Sequence.getInstance(dataAsn1);
+		byte[] r = bigIntToFixexLengthBytes(ASN1Integer.getInstance(seq.getObjectAt(0)).getValue());
+		byte[] s = bigIntToFixexLengthBytes(ASN1Integer.getInstance(seq.getObjectAt(1)).getValue());
+		byte[] result = new byte[SM3withSM2_RS_LEN * 2];
+		System.arraycopy(r, 0, result, 0, r.length);
+		System.arraycopy(s, 0, result, SM3withSM2_RS_LEN, s.length);
+		return result;
+	}
+
+	private static byte[] bigIntToFixexLengthBytes(BigInteger rOrS) {
+		byte[] rs = rOrS.toByteArray();
+		if (rs.length == SM3withSM2_RS_LEN) return rs;
+		else if (rs.length == SM3withSM2_RS_LEN + 1 && rs[0] == 0)
+			return Arrays.copyOfRange(rs, 1, SM3withSM2_RS_LEN + 1);
+		else if (rs.length < SM3withSM2_RS_LEN) {
+			byte[] result = new byte[SM3withSM2_RS_LEN];
+			Arrays.fill(result, (byte) 0);
+			System.arraycopy(rs, 0, result, SM3withSM2_RS_LEN - rs.length, rs.length);
+			return result;
+		} else {
+			throw new RuntimeException("err rs: " + Hex.toHexString(rs));
+		}
+	}
+
+}

+ 37 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/tonglianPayment/utils/SybConstants.java

@@ -0,0 +1,37 @@
+package org.springblade.purchase.sales.tonglianPayment.utils;
+
+public class SybConstants {
+
+
+	//正式环境测试参数
+	public static final String SYB_ORGID = "";//集团/机构模式下该参数不为空,且appid与key是与次参数对应
+	public static final String SYB_CUSID = "990440148166000";
+	public static final String SYB_APPID = "00000003";
+	public static final String SYB_MD5_APPKEY = "a0ea3fa20dbd7bb4d5abf1d59d63bae8";
+	public static final String SYB_APIURL = "https://vsp.allinpay.com/apiweb/unitorder";//生产环境
+	public static final String SIGN_TYPE = "SM2";
+	public static final String SYB_RSACUSPRIKEY = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAO0HpPUP+eHk//Ba6ZOePvoZVDpOCRtt943oeVfCTllye43bqja1jVIaebX0MgX+yPYnWIQIOJ9ubSH0R4iyY9y1/HR00qkUpfW3/0usBPt9qn7r0xtFHerhVCd4dT2rKb2Oc5IhKOg05cw/BmMFohMkFsqt0jlrUXI8zJOlLIcxAgMBAAECgYA9lt/pAYa3iK5sQOMyhUrt54j4QXCiXPeXOxHUmNuM6G9sU+itoI0hCVoYymP5JNQJCf45CH3WB3Z5/SRdQ6Uoo1cjao6cCohPLxMSfJglsZCHckPH53o25RKEza4njIgKC+yN7HAhanKymhw/yYQ6i0aXq38zFIk8djMtE7R6xQJBAP6jvNy7UhPKO5rxGFKR+MvvbO3qnYH6x0jZCGY3FlxuGfbavueOiFtMeK67FuDv683dcUKi+M48yR4kH5CfIusCQQDuS9KF6mlm3kHAiZWgVhE8VVNYGpRLCRDgAKm4InGmvk5mUv+O1yAtAFVAEHWIgD4awC7Eqf1YFrSF/It9HV9TAkEAsXiU7JJxhfFw0XAvL30lFZ1tIfReinSp6A+7VuIV552k4vNaEjC4wEjv43fpXiRZCEXJ5lOHbNXYpfUvOrBuuQJAOpow8rf8Jc0g1G3Be0XPRUwii/c1YuKe4Meo9VybIIuKkkV1Dba/9fEwBepGTURkgYWjur+nSyOCT7UUxLcVewJAPLig8dVfKpsiNwYuveEYMcFaO5xoRuiB7v+CMmvxpuuK+rrFS+d7RdmwDbnBiDV4JkTgFObUiGvB7MtS+LGfhw==";
+	public static final String SYB_RSATLPUBKEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCm9OV6zH5DYH/ZnAVYHscEELdCNfNTHGuBv1nYYEY9FrOzE0/4kLl9f7Y9dkWHlc2ocDwbrFSm0Vqz0q2rJPxXUYBCQl5yW3jzuKSXif7q1yOwkFVtJXvuhf5WRy+1X5FOFoMvS7538No0RpnLzmNi3ktmiqmhpcY/1pmt20FHQQIDAQAB";
+//	/**商户sm2私钥,用于向通联发起请求前进行签名**/
+	public static final String SYB_SM2PPRIVATEKEY = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgjj4Rk+b0YjwO+UwXofnHf4bK+kaaY5Btkd8nMP2VimmgCgYIKoEcz1UBgi2hRANCAAQqlALW4qGC3bP1x3wo5QsKxaCMEZJ2ODTTwOQ+d8UGU7GoK/y/WMBQWf5upMnFU06p5FxGooXYYoBtldgm03hq";
+//	/**通联平台sm2公钥,用于请求返回或者通联通知的验签**/
+	public static final String SYB_SM2TLPUBKEY = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEBQicgWm0KAMqhO3bdqMUEDrKQvYg8cCXHhdGwq7CGE6oJDzJ1P/94HpuVdBf1KidmPxr7HOH+0DAnpeCcx9TcQ==";
+
+	//测试环境调试参数
+	public static final String SYB_ORGID_TEST = "";
+	public static final String SYB_CUSID_TEST = "990581007426001";
+	public static final String SYB_APPID_TEST = "00000051";
+	public static final String SYB_MD5_APPKEY_TEST = "allinpay888";
+	public static final String SYB_APIURL_TEST = "https://test.allinpaygd.com/apiweb/unitorder";//生产环境
+	public static final String SIGN_TYPE_TEST = "MD5";
+	/**商户RSA私钥,用于向通联发起请求前进行签名**/
+	public static final String SYB_RSACUSPRIKEY_TEST = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAK5aIo+E1eyWwEIgMB8ZEZRAaWjSAglmfKVhzy8N1eLjAlqPjJgOCqXGEYt/r61AyIjCCJiYVDTHzcqstmbBU7HKpYjTsquCLjRWcL/fhMwMGBSg2bP5mqw5locSOz1gtRujmd3kZo9OIJuWtfG2+wgPPdKUdGZS+5K8WtWCF4z1AgMBAAECgYAPvvqvkPzb9tpqrmsCJ/qvM6kBazP9Ytjfe8ehFYQLT1qrUJsPMXdzNMHpYhD82eSyeymZFGrIcIIMq4/2lD+pYOMQTMGGjoVb2wnQhZFqPdgjXgOQ90E43X69jD3p5F8CuKVNa13I4l3iyfzlVIL780JPdJdug7yKEFdSeOQZUQJBAONlFpIqz87pbnwzfgO5kRTbbI7DcyObb8OEeCK3VlGB3r9P4NoMEDaXm+HnIdv53gnFq+xgbREWUt2nFq9dSUUCQQDESOIdSvIBc3KQTYR+cnlQTH0SOvm0Tlx4KekBCLxTFAFyBqnOBLdVyQb6Z1wxGz855AjnNbHy1rFhUYQ6hPfxAkAIRZUcnBITJMqwGe9rk0SDzbeVOebmVLEsG5WDLcgmDuNbcjxrsiSk178D6LSCnARHtrkaUCenh3hcN8fLeUlBAkABNP2G9pYEYkRbFM7yxBtw3feK7Cfq7uxspL1VD0uxKxdTLy1OIgNKmMDdO1N6zdMWtQtE+LSObLmMgqbQgU7RAkBFX5kl4+B3k+/aCYB/ndqd1nQIr4SNAtLFJDtlW2xah9W2lQL/7KQDT4o4dUMY51m7Bu61SAmKtralv7Hf25yf";
+	/**通联平台RSA公钥,用于请求返回或者通联通知的验签**/
+	public static final String SYB_RSATLPUBKEY_TEST = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYXfu4b7xgDSmEGQpQ8Sn3RzFgl5CE4gL4TbYrND4FtCYOrvbgLijkdFgIrVVWi2hUW4K0PwBsmlYhXcbR+JSmqv9zviVXZiym0lK3glJGVCN86r9EPvNTusZZPm40TOEKMVENSYaUjCxZ7JzeZDfQ4WCeQQr2xirqn6LdJjpZ5wIDAQAB";
+
+	/**商户sm2私钥,用于向通联发起请求前进行签名**/
+	public static final String SYB_SM2PPRIVATEKEY_TEST = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgjj4Rk+b0YjwO+UwXofnHf4bK+kaaY5Btkd8nMP2VimmgCgYIKoEcz1UBgi2hRANCAAQqlALW4qGC3bP1x3wo5QsKxaCMEZJ2ODTTwOQ+d8UGU7GoK/y/WMBQWf5upMnFU06p5FxGooXYYoBtldgm03hq";
+	/**通联平台sm2公钥,用于请求返回或者通联通知的验签**/
+	public static final String SYB_SM2TLPUBKEY_TEST = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE/BnA8BawehBtH0ksPyayo4pmzL/u1FQ2sZcqwOp6bjVqQX4tjo930QAvHZPJ2eez8sCz/RYghcqv4LvMq+kloQ==";
+
+}

+ 334 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/tonglianPayment/utils/SybPayService.java

@@ -0,0 +1,334 @@
+package org.springblade.purchase.sales.tonglianPayment.utils;
+
+import org.springblade.system.cache.ParamCache;
+
+import java.util.Map;
+import java.util.TreeMap;
+
+import static org.springblade.common.constant.TenantConstant.PAYMENT_PARAMETER;
+
+public class SybPayService {
+	/**
+	 * @param trxamt
+	 * @param reqsn
+	 * @param paytype
+	 * @param body
+	 * @param remark
+	 * @param acct
+	 * @param validtime
+	 * @param notify_url
+	 * @param limit_pay
+	 * @param idno
+	 * @param truename
+	 * @param asinfo
+	 * @param sub_appid
+	 * @param goods_tag           单品优惠信息
+	 * @param chnlstoreid
+	 * @param subbranch
+	 * @param extendparams具体见接口文档
+	 * @param cusip               限云闪付JS支付业务
+	 * @param fqnum               限支付宝分期业务
+	 * @return
+	 * @throws Exception
+	 */
+	public Map<String, String> pay(long trxamt, String reqsn, String paytype, String body, String remark, String acct, String validtime, String notify_url, String limit_pay,
+								   String idno, String truename, String asinfo, String sub_appid, String goods_tag, String benefitdetail, String chnlstoreid, String subbranch, String extendparams, String cusip, String fqnum) throws Exception {
+
+
+		TreeMap<String, String> params = new TreeMap<String, String>();
+		String url = "";
+		if (ParamCache.getValue(PAYMENT_PARAMETER).equals("0")) {
+			params.put("cusid", SybConstants.SYB_CUSID_TEST);
+			params.put("appid", SybConstants.SYB_APPID_TEST);
+			url = SybConstants.SYB_APIURL_TEST;
+		} else {
+			params.put("cusid", SybConstants.SYB_CUSID);
+			params.put("appid", SybConstants.SYB_APPID);
+			url = SybConstants.SYB_APIURL;
+		}
+		HttpConnectionUtil http = new HttpConnectionUtil(url + "/pay");
+		http.init();
+		if (!SybUtil.isEmpty(SybConstants.SYB_ORGID))
+			params.put("orgid", SybConstants.SYB_ORGID);
+		params.put("version", "11");
+		params.put("trxamt", String.valueOf(trxamt));
+		params.put("reqsn", reqsn);
+		params.put("paytype", paytype);
+		params.put("randomstr", SybUtil.getValidatecode(8));
+		params.put("body", body);
+		params.put("remark", remark);
+		params.put("validtime", validtime);
+		params.put("acct", acct);
+		params.put("notify_url", notify_url);
+		params.put("limit_pay", limit_pay);
+		params.put("sub_appid", sub_appid);
+		params.put("goods_tag", goods_tag);
+		params.put("benefitdetail", benefitdetail);
+		params.put("chnlstoreid", chnlstoreid);
+		params.put("subbranch", subbranch);
+		params.put("extendparams", extendparams);
+		params.put("cusip", cusip);
+		params.put("fqnum", fqnum);
+		params.put("idno", idno);
+		params.put("truename", truename);
+		params.put("asinfo", asinfo);
+		if (ParamCache.getValue(PAYMENT_PARAMETER).equals("0")) {
+			params.put("signtype", SybConstants.SIGN_TYPE_TEST);
+			String appkey = "";
+			if (SybConstants.SIGN_TYPE_TEST.equals("RSA"))
+				appkey = SybConstants.SYB_RSACUSPRIKEY_TEST;
+			else if (SybConstants.SIGN_TYPE_TEST.equals("SM2"))
+				appkey = SybConstants.SYB_SM2PPRIVATEKEY_TEST;
+			else
+				appkey = SybConstants.SYB_MD5_APPKEY_TEST;
+			params.put("sign", SybUtil.unionSign(params, appkey, SybConstants.SIGN_TYPE_TEST));
+		} else {
+			params.put("signtype", SybConstants.SIGN_TYPE);
+			String appkey = "";
+			if (SybConstants.SIGN_TYPE.equals("RSA"))
+				appkey = SybConstants.SYB_RSACUSPRIKEY;
+			else if (SybConstants.SIGN_TYPE.equals("SM2"))
+				appkey = SybConstants.SYB_SM2PPRIVATEKEY;
+			else
+				appkey = SybConstants.SYB_MD5_APPKEY;
+			params.put("sign", SybUtil.unionSign(params, appkey, SybConstants.SIGN_TYPE));
+		}
+
+		byte[] bys = http.postParams(params, true);
+		String result = new String(bys, "UTF-8");
+		Map<String, String> map = handleResult(result);
+		return map;
+
+	}
+
+	public Map<String, String> cancel(long trxamt, String reqsn, String oldtrxid, String oldreqsn) throws Exception {
+		TreeMap<String, String> params = new TreeMap<String, String>();
+		if (!SybUtil.isEmpty(SybConstants.SYB_ORGID))
+			params.put("orgid", SybConstants.SYB_ORGID);
+		String url = "";
+		if (ParamCache.getValue(PAYMENT_PARAMETER).equals("0")) {
+			params.put("cusid", SybConstants.SYB_CUSID_TEST);
+			params.put("appid", SybConstants.SYB_APPID_TEST);
+			url = SybConstants.SYB_APIURL_TEST;
+		} else {
+			params.put("cusid", SybConstants.SYB_CUSID);
+			params.put("appid", SybConstants.SYB_APPID);
+			url = SybConstants.SYB_APIURL;
+		}
+		HttpConnectionUtil http = new HttpConnectionUtil(url + "/cancel");
+		http.init();
+		params.put("version", "11");
+		params.put("trxamt", String.valueOf(trxamt));
+		params.put("reqsn", reqsn);
+		params.put("oldtrxid", oldtrxid);
+		params.put("oldreqsn", oldreqsn);
+		params.put("randomstr", SybUtil.getValidatecode(8));
+		if (ParamCache.getValue(PAYMENT_PARAMETER).equals("0")) {
+			params.put("signtype", SybConstants.SIGN_TYPE_TEST);
+			String appkey = "";
+			if (SybConstants.SIGN_TYPE_TEST.equals("RSA"))
+				appkey = SybConstants.SYB_RSACUSPRIKEY_TEST;
+			else if (SybConstants.SIGN_TYPE_TEST.equals("SM2"))
+				appkey = SybConstants.SYB_SM2PPRIVATEKEY_TEST;
+			else
+				appkey = SybConstants.SYB_MD5_APPKEY_TEST;
+			params.put("sign", SybUtil.unionSign(params, appkey, SybConstants.SIGN_TYPE_TEST));
+		} else {
+			params.put("signtype", SybConstants.SIGN_TYPE);
+			String appkey = "";
+			if (SybConstants.SIGN_TYPE.equals("RSA"))
+				appkey = SybConstants.SYB_RSACUSPRIKEY;
+			else if (SybConstants.SIGN_TYPE.equals("SM2"))
+				appkey = SybConstants.SYB_SM2PPRIVATEKEY;
+			else
+				appkey = SybConstants.SYB_MD5_APPKEY;
+			params.put("sign", SybUtil.unionSign(params, appkey, SybConstants.SIGN_TYPE));
+		}
+		byte[] bys = http.postParams(params, true);
+		String result = new String(bys, "UTF-8");
+		Map<String, String> map = handleResult(result);
+		return map;
+	}
+
+	public Map<String, String> refund(long trxamt, String reqsn, String oldtrxid, String oldreqsn) throws Exception {
+		TreeMap<String, String> params = new TreeMap<String, String>();
+		if (!SybUtil.isEmpty(SybConstants.SYB_ORGID))
+			params.put("orgid", SybConstants.SYB_ORGID);
+		String url = "";
+		if (ParamCache.getValue(PAYMENT_PARAMETER).equals("0")) {
+			params.put("cusid", SybConstants.SYB_CUSID_TEST);
+			params.put("appid", SybConstants.SYB_APPID_TEST);
+			url = SybConstants.SYB_APIURL_TEST;
+		} else {
+			params.put("cusid", SybConstants.SYB_CUSID);
+			params.put("appid", SybConstants.SYB_APPID);
+			url = SybConstants.SYB_APIURL;
+		}
+		HttpConnectionUtil http = new HttpConnectionUtil(url + "/refund");
+		http.init();
+		params.put("version", "11");
+		params.put("trxamt", String.valueOf(trxamt));
+		params.put("reqsn", reqsn);
+		params.put("oldreqsn", oldreqsn);
+		params.put("oldtrxid", oldtrxid);
+		params.put("randomstr", SybUtil.getValidatecode(8));
+		if (ParamCache.getValue(PAYMENT_PARAMETER).equals("0")) {
+			params.put("signtype", SybConstants.SIGN_TYPE_TEST);
+			String appkey = "";
+			if (SybConstants.SIGN_TYPE_TEST.equals("RSA"))
+				appkey = SybConstants.SYB_RSACUSPRIKEY_TEST;
+			else if (SybConstants.SIGN_TYPE_TEST.equals("SM2"))
+				appkey = SybConstants.SYB_SM2PPRIVATEKEY_TEST;
+			else
+				appkey = SybConstants.SYB_MD5_APPKEY_TEST;
+			params.put("sign", SybUtil.unionSign(params, appkey, SybConstants.SIGN_TYPE_TEST));
+		} else {
+			params.put("signtype", SybConstants.SIGN_TYPE);
+			String appkey = "";
+			if (SybConstants.SIGN_TYPE.equals("RSA"))
+				appkey = SybConstants.SYB_RSACUSPRIKEY;
+			else if (SybConstants.SIGN_TYPE.equals("SM2"))
+				appkey = SybConstants.SYB_SM2PPRIVATEKEY;
+			else
+				appkey = SybConstants.SYB_MD5_APPKEY;
+			params.put("sign", SybUtil.unionSign(params, appkey, SybConstants.SIGN_TYPE));
+		}
+		byte[] bys = http.postParams(params, true);
+		String result = new String(bys, "UTF-8");
+		Map<String, String> map = handleResult(result);
+		return map;
+	}
+
+	public Map<String, String> query(String reqsn, String trxid) throws Exception {
+		TreeMap<String, String> params = new TreeMap<String, String>();
+		if (!SybUtil.isEmpty(SybConstants.SYB_ORGID))
+			params.put("orgid", SybConstants.SYB_ORGID);
+		String url = "";
+		if (ParamCache.getValue(PAYMENT_PARAMETER).equals("0")) {
+			params.put("cusid", SybConstants.SYB_CUSID_TEST);
+			params.put("appid", SybConstants.SYB_APPID_TEST);
+			url = SybConstants.SYB_APIURL_TEST;
+		} else {
+			params.put("cusid", SybConstants.SYB_CUSID);
+			params.put("appid", SybConstants.SYB_APPID);
+			url = SybConstants.SYB_APIURL;
+		}
+		HttpConnectionUtil http = new HttpConnectionUtil(url + "/query");
+		http.init();
+		params.put("version", "11");
+		params.put("reqsn", reqsn);
+		params.put("trxid", trxid);
+		params.put("randomstr", SybUtil.getValidatecode(8));
+		if (ParamCache.getValue(PAYMENT_PARAMETER).equals("0")) {
+			params.put("signtype", SybConstants.SIGN_TYPE_TEST);
+			String appkey = "";
+			if (SybConstants.SIGN_TYPE_TEST.equals("RSA"))
+				appkey = SybConstants.SYB_RSACUSPRIKEY_TEST;
+			else if (SybConstants.SIGN_TYPE_TEST.equals("SM2"))
+				appkey = SybConstants.SYB_SM2PPRIVATEKEY_TEST;
+			else
+				appkey = SybConstants.SYB_MD5_APPKEY_TEST;
+			params.put("sign", SybUtil.unionSign(params, appkey, SybConstants.SIGN_TYPE_TEST));
+		} else {
+			params.put("signtype", SybConstants.SIGN_TYPE);
+			String appkey = "";
+			if (SybConstants.SIGN_TYPE.equals("RSA"))
+				appkey = SybConstants.SYB_RSACUSPRIKEY;
+			else if (SybConstants.SIGN_TYPE.equals("SM2"))
+				appkey = SybConstants.SYB_SM2PPRIVATEKEY;
+			else
+				appkey = SybConstants.SYB_MD5_APPKEY;
+			params.put("sign", SybUtil.unionSign(params, appkey, SybConstants.SIGN_TYPE));
+		}
+		byte[] bys = http.postParams(params, true);
+		String result = new String(bys, "UTF-8");
+		Map<String, String> map = handleResult(result);
+		return map;
+	}
+
+
+	@SuppressWarnings({"rawtypes", "unchecked"})
+	public static Map<String, String> handleResult(String result) throws Exception {
+		System.out.println("ret:" + result);
+		Map map = SybUtil.json2Obj(result, Map.class);
+		if (map == null) {
+			throw new Exception("返回数据错误");
+		}
+		if ("SUCCESS".equals(map.get("retcode"))) {
+			TreeMap tmap = new TreeMap();
+			tmap.putAll(map);
+			String appkey = "";
+			if (SybConstants.SIGN_TYPE.equals("RSA"))
+				appkey = SybConstants.SYB_RSATLPUBKEY;
+			else if (SybConstants.SIGN_TYPE.equals("SM2"))
+				appkey = SybConstants.SYB_SM2TLPUBKEY;
+			else
+				appkey = SybConstants.SYB_MD5_APPKEY;
+			if (SybUtil.validSign(tmap, appkey, SybConstants.SIGN_TYPE)) {
+				System.out.println("签名成功");
+				return map;
+			} else {
+				throw new Exception("验证签名失败");
+			}
+
+		} else {
+			throw new Exception(map.get("retmsg").toString());
+		}
+	}
+
+	public Map<String, String> scanPay(long trxamt, String reqsn, String body, String remark, String authcode, String limit_pay, String idno, String truename, String asinfo) throws Exception {
+		// TODO Auto-generated method stub
+
+		TreeMap<String, String> params = new TreeMap<String, String>();
+		if (!SybUtil.isEmpty(SybConstants.SYB_ORGID))
+			params.put("orgid", SybConstants.SYB_ORGID);
+		String url = "";
+		if (ParamCache.getValue(PAYMENT_PARAMETER).equals("0")) {
+			params.put("cusid", SybConstants.SYB_CUSID_TEST);
+			params.put("appid", SybConstants.SYB_APPID_TEST);
+			url = SybConstants.SYB_APIURL_TEST;
+		} else {
+			params.put("cusid", SybConstants.SYB_CUSID);
+			params.put("appid", SybConstants.SYB_APPID);
+			url = SybConstants.SYB_APIURL;
+		}
+		HttpConnectionUtil http = new HttpConnectionUtil(url + "/scanqrpay");
+		http.init();
+		params.put("version", "11");
+		params.put("trxamt", String.valueOf(trxamt));
+		params.put("reqsn", reqsn);
+		params.put("randomstr", SybUtil.getValidatecode(8));
+		params.put("body", body);
+		params.put("remark", remark);
+		params.put("authcode", authcode);
+		params.put("limit_pay", limit_pay);
+		params.put("asinfo", asinfo);
+		if (ParamCache.getValue(PAYMENT_PARAMETER).equals("0")) {
+			params.put("signtype", SybConstants.SIGN_TYPE_TEST);
+			String appkey = "";
+			if (SybConstants.SIGN_TYPE_TEST.equals("RSA"))
+				appkey = SybConstants.SYB_RSACUSPRIKEY_TEST;
+			else if (SybConstants.SIGN_TYPE_TEST.equals("SM2"))
+				appkey = SybConstants.SYB_SM2PPRIVATEKEY_TEST;
+			else
+				appkey = SybConstants.SYB_MD5_APPKEY_TEST;
+			params.put("sign", SybUtil.unionSign(params, appkey, SybConstants.SIGN_TYPE_TEST));
+		} else {
+			params.put("signtype", SybConstants.SIGN_TYPE);
+			String appkey = "";
+			if (SybConstants.SIGN_TYPE.equals("RSA"))
+				appkey = SybConstants.SYB_RSACUSPRIKEY;
+			else if (SybConstants.SIGN_TYPE.equals("SM2"))
+				appkey = SybConstants.SYB_SM2PPRIVATEKEY;
+			else
+				appkey = SybConstants.SYB_MD5_APPKEY;
+			params.put("sign", SybUtil.unionSign(params, appkey, SybConstants.SIGN_TYPE));
+		}
+		byte[] bys = http.postParams(params, true);
+		String result = new String(bys, "UTF-8");
+		Map<String, String> map = handleResult(result);
+		return map;
+	}
+
+
+}

+ 227 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/tonglianPayment/utils/SybUtil.java

@@ -0,0 +1,227 @@
+package org.springblade.purchase.sales.tonglianPayment.utils;
+
+import com.alibaba.fastjson.JSONObject;
+import org.apache.commons.codec.binary.Base64;
+
+import java.security.*;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.Map;
+import java.util.Random;
+import java.util.TreeMap;
+
+public class SybUtil {
+	/**
+	 * js转化为实体
+	 *
+	 * @param <T>
+	 * @param jsonstr
+	 * @param cls
+	 * @return
+	 */
+	public static <T> T json2Obj(String jsonstr, Class<T> cls) {
+		JSONObject jo = JSONObject.parseObject(jsonstr);
+		T obj = (T) JSONObject.toJavaObject(jo, cls);
+		return obj;
+//		return null;
+	}
+
+	/**
+	 * md5
+	 *
+	 * @param b
+	 * @return
+	 */
+	public static String md5(byte[] b) {
+		try {
+			MessageDigest md = MessageDigest.getInstance("MD5");
+			md.reset();
+			md.update(b);
+			byte[] hash = md.digest();
+			StringBuffer outStrBuf = new StringBuffer(32);
+			for (int i = 0; i < hash.length; i++) {
+				int v = hash[i] & 0xFF;
+				if (v < 16) {
+					outStrBuf.append('0');
+				}
+				outStrBuf.append(Integer.toString(v, 16).toLowerCase());
+			}
+			return outStrBuf.toString();
+		} catch (NoSuchAlgorithmException e) {
+			e.printStackTrace();
+			return new String(b);
+		}
+	}
+
+	/**
+	 * 判断字符串是否为空
+	 *
+	 * @param s
+	 * @return
+	 */
+	public static boolean isEmpty(String s) {
+		if (s == null || "".equals(s.trim()))
+			return true;
+		return false;
+	}
+
+	/**
+	 * 生成随机码
+	 *
+	 * @param n
+	 * @return
+	 */
+	public static String getValidatecode(int n) {
+		Random random = new Random();
+		String sRand = "";
+		n = n == 0 ? 4 : n;// default 4
+		for (int i = 0; i < n; i++) {
+			String rand = String.valueOf(random.nextInt(10));
+			sRand += rand;
+		}
+		return sRand;
+	}
+
+
+	public static boolean validSign(TreeMap<String, String> param,
+									String appkey, String signType) throws Exception {
+		if (param != null && !param.isEmpty()) {
+			if (!param.containsKey("sign"))
+				return false;
+			String sign = param.remove("sign");
+			if ("MD5".equals(signType)) {// 如果是md5则需要把md5的key加入到排序
+				param.put("key", appkey);
+			}
+			StringBuilder sb = new StringBuilder();
+			for (Map.Entry<String, String> entry : param.entrySet()) {
+				if (entry.getValue() != null && entry.getValue().length() > 0) {
+					sb.append(entry.getKey()).append("=")
+						.append(entry.getValue()).append("&");
+				}
+			}
+			if (sb.length() > 0) {
+				sb.deleteCharAt(sb.length() - 1);
+			}
+			if ("MD5".equals(signType)) {
+				return sign.toLowerCase().equals(
+					md5(sb.toString().getBytes("UTF-8")).toLowerCase());
+			} else if ("SM2".equals(signType)) {
+				PublicKey publicKey = SmUtil.pubKeySM2FromBase64Str(appkey);
+				return SmUtil.verifySM3SM2(publicKey, "Allinpay", Base64.decodeBase64(sign), sb.toString().getBytes("UTF-8"));
+			} else {
+				return rsaVerifyPublickey(sb.toString(), sign, appkey, "UTF-8");
+			}
+		}
+		return false;
+	}
+
+	public static boolean rsaVerifyPublickey(String content, String sign,
+											 String publicKey, String charset) throws Exception {
+		try {
+			PublicKey pubKey = getPublicKeyFromX509("RSA",
+				Base64.decodeBase64(publicKey.getBytes()));
+			return rsaVerifyPublickey(content, sign, pubKey, charset);
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new Exception("RSAcontent = " + content + ",sign=" + sign
+				+ ",charset = " + charset, e);
+		}
+	}
+
+	public static boolean rsaVerifyPublickey(String content, String sign,
+											 PublicKey pubKey, String charset) throws Exception {
+		try {
+			java.security.Signature signature = java.security.Signature
+				.getInstance("SHA1WithRSA");
+
+			signature.initVerify(pubKey);
+
+			if (charset == null || "".equals(charset)) {
+				signature.update(content.getBytes());
+			} else {
+				signature.update(content.getBytes(charset));
+			}
+
+			return signature.verify(Base64.decodeBase64(sign.getBytes()));
+		} catch (Exception e) {
+			throw e;
+		}
+	}
+
+	public static String unionSign(TreeMap<String, String> params, String appkey,
+								   String signType) throws Exception {
+		// TODO Auto-generated method stub
+
+		params.remove("sign");
+		if ("MD5".equals(signType)) {// 如果是md5则需要把md5的key加入到排序
+			params.put("key", appkey);
+		}
+		StringBuilder sb = new StringBuilder();
+		for (Map.Entry<String, String> entry : params.entrySet()) {
+			if (entry.getValue() != null && entry.getValue().length() > 0) {
+				sb.append(entry.getKey()).append("=").append(entry.getValue())
+					.append("&");
+			}
+		}
+		if (sb.length() > 0) {
+			sb.deleteCharAt(sb.length() - 1);
+		}
+		String sign = "";
+		if ("MD5".equals(signType)) {
+			System.out.println(sb.toString());
+			sign = md5(sb.toString().getBytes("UTF-8"));// 记得是md5编码的加签
+			params.remove("key");
+		} else if ("SM2".equals(signType)) {
+			System.out.println(sb.toString());
+			PrivateKey privkey = SmUtil.privKeySM2FromBase64Str(appkey);
+			sign = SmUtil.signSM3SM2RetBase64(privkey, params.get("appid"), sb.toString().getBytes("UTF-8"));//签名
+		} else {
+			System.out.println(sb.toString());
+			sign = rsaSign(sb.toString(), appkey, "UTF-8");
+		}
+		return sign;
+	}
+
+	public static String rsaSign(String content, String privateKey,
+								 String charset) throws Exception {
+		PrivateKey priKey = getPrivateKeyFromPKCS8("RSA",
+			Base64.decodeBase64(privateKey.getBytes()));
+		return rsaSign(content, priKey, charset);
+	}
+
+	public static String rsaSign(String content, byte[] privateKey,
+								 String charset) throws Exception {
+		PrivateKey priKey = getPrivateKeyFromPKCS8("RSA", privateKey);
+		return rsaSign(content, priKey, charset);
+	}
+
+	public static String rsaSign(String content, PrivateKey priKey,
+								 String charset) throws Exception {
+		java.security.Signature signature = java.security.Signature
+			.getInstance("SHA1WithRSA");
+		signature.initSign(priKey);
+		if (charset == null || "".equals(charset)) {
+			signature.update(content.getBytes());
+		} else {
+			signature.update(content.getBytes(charset));
+		}
+		byte[] signed = signature.sign();
+
+		return new String(Base64.encodeBase64(signed));
+	}
+
+	public static PrivateKey getPrivateKeyFromPKCS8(String algorithm,
+													byte[] encodedKey) throws Exception {
+
+		KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
+
+		return keyFactory.generatePrivate(new PKCS8EncodedKeySpec(encodedKey));
+	}
+
+	public static PublicKey getPublicKeyFromX509(String algorithm,
+												 byte[] encodedKey) throws Exception {
+		KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
+
+		return keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));
+	}
+}

+ 125 - 2
blade-service/blade-stock/src/main/java/org/springblade/stock/controller/StockGoodsController.java

@@ -16,19 +16,21 @@
  */
 package org.springblade.stock.controller;
 
+import com.alibaba.cloud.commons.lang.StringUtils;
 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.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 io.swagger.annotations.ApiParam;
 import lombok.AllArgsConstructor;
+import org.springblade.client.entity.CorpsAttn;
 import org.springblade.client.entity.CorpsDesc;
 import org.springblade.client.entity.StorageDesc;
+import org.springblade.client.feign.ICorpsAttnClient;
 import org.springblade.client.feign.ICorpsDescClient;
 import org.springblade.client.feign.IGoodsDescClient;
 import org.springblade.client.feign.IStorageClient;
@@ -41,6 +43,7 @@ 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.Func;
+import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.stock.entity.StockGoods;
 import org.springblade.stock.excel.StockGoodsExcel;
 import org.springblade.stock.service.IStockGoodsService;
@@ -90,6 +93,11 @@ public class StockGoodsController extends BladeController {
 	private final IStorageClient iStorageClient;
 
 	/**
+	 * 库区信息
+	 */
+	private final ICorpsAttnClient corpsAttnClient;
+
+	/**
 	 * 详情
 	 */
 	@GetMapping("/detail")
@@ -405,9 +413,27 @@ public class StockGoodsController extends BladeController {
 	 */
 	@GetMapping("/app-stockPartsPage")
 	public R<IPage<AppStockPartsVO>> stockPartsPage(AppStockPartsVO appStockPartsVO, Query query) {
+		if (appStockPartsVO.getLabel() != null && appStockPartsVO.getLabel().length > 0) {
+			appStockPartsVO.setLabels(StringUtil.join(appStockPartsVO.getLabel(), ","));
+		}
 		IPage<AppStockPartsVO> pages = stockGoodsService.selectAppStockPartsPage(Condition.getPage(query), appStockPartsVO);
 		List<AppStockPartsVO> records = pages.getRecords();
 		if (CollectionUtils.isNotEmpty(records)) {
+			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();
+					}
+				}
+			}
+			String finalShoppingMall = shoppingMall;
 			records.forEach(item -> {
 				//获取商品信息
 				R<GoodsDescVO> goodsMessage = goodsDescClient.selectGoodsMessage(item.getGoodsId());
@@ -418,7 +444,33 @@ public class StockGoodsController extends BladeController {
 					if (StringUtils.isNotBlank(goodsMessage.getData().getBrandItem())) {
 						item.setBrandItem(goodsMessage.getData().getBrandItem());
 					}
+					if (StringUtils.isNotBlank(goodsMessage.getData().getLabel())) {
+						item.setLabel(goodsMessage.getData().getLabel().split(","));
+					} else {
+						item.setLabel(new String[]{});
+					}
+					item.setUnit(goodsMessage.getData().getUnit());
 					item.setUrl(goodsMessage.getData().getUrl());
+					if ("零售价1".equals(finalShoppingMall)) {
+						item.setSalesPrice(goodsMessage.getData().getStandardPrice());
+					} else if ("零售价2".equals(finalShoppingMall)) {
+						item.setSalesPrice(goodsMessage.getData().getWholesalePrice());
+					} else if ("零售价3".equals(finalShoppingMall)) {
+						item.setSalesPrice(goodsMessage.getData().getRepairDepotPrice());
+					} else if ("零售价4".equals(finalShoppingMall)) {
+						item.setSalesPrice(goodsMessage.getData().getStorePrice());
+					} else if ("零售价5".equals(finalShoppingMall)) {
+						item.setSalesPrice(goodsMessage.getData().getPrice());
+					} else if ("特价".equals(finalShoppingMall)) {
+						item.setSalesPrice(goodsMessage.getData().getSpecialOffer());
+					} else {
+						item.setSalesPrice(goodsMessage.getData().getSpecialOffer());
+					}
+					if (ObjectUtils.isNull(item.getSalesPrice())) {
+						item.setSalesPrice(new BigDecimal("0.00"));
+					}
+				} else {
+					item.setLabel(new String[]{});
 				}
 			});
 		}
@@ -426,6 +478,77 @@ public class StockGoodsController extends BladeController {
 	}
 
 	/**
+	 * 手机端库存商品详情(新-配件)
+	 */
+	@GetMapping("/app-stockPartsDetails")
+	public R<AppStockPartsVO> stockPartsDetails(AppStockPartsVO appStockPartsVO) {
+		AppStockPartsVO appStockPartsVO1 = stockGoodsService.stockPartsDetails(appStockPartsVO);
+		if (ObjectUtils.isNotNull(appStockPartsVO1)) {
+			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();
+					}
+				}
+			}
+			String finalShoppingMall = shoppingMall;
+			//获取商品信息
+			R<GoodsDescVO> goodsMessage = goodsDescClient.selectGoodsMessage(appStockPartsVO1.getGoodsId());
+			if (goodsMessage.isSuccess() && goodsMessage.getData() != null) {
+				if (StringUtils.isNotBlank(goodsMessage.getData().getBrand())) {
+					appStockPartsVO1.setBrand(goodsMessage.getData().getBrand());
+				}
+				if (StringUtils.isNotBlank(goodsMessage.getData().getBrandItem())) {
+					appStockPartsVO1.setBrandItem(goodsMessage.getData().getBrandItem());
+				}
+				if (StringUtils.isNotBlank(goodsMessage.getData().getLabel())) {
+					appStockPartsVO1.setLabel(goodsMessage.getData().getLabel().split(","));
+				} else {
+					appStockPartsVO1.setLabel(new String[]{});
+				}
+				appStockPartsVO1.setUnit(goodsMessage.getData().getUnit());
+				appStockPartsVO1.setUrl(goodsMessage.getData().getUrl());
+				if (ObjectUtils.isNotNull(goodsMessage.getData().getLabel()) && goodsMessage.getData().getLabel().contains("特价")) {
+					appStockPartsVO1.setSalesPrice(goodsMessage.getData().getSpecialOffer());
+					appStockPartsVO1.setStandardPrice(goodsMessage.getData().getStandardPrice());
+				}else{
+					if ("零售价1".equals(finalShoppingMall)) {
+						appStockPartsVO1.setSalesPrice(goodsMessage.getData().getStandardPrice());
+					} else if ("零售价2".equals(finalShoppingMall)) {
+						appStockPartsVO1.setSalesPrice(goodsMessage.getData().getWholesalePrice());
+					} else if ("零售价3".equals(finalShoppingMall)) {
+						appStockPartsVO1.setSalesPrice(goodsMessage.getData().getRepairDepotPrice());
+					} else if ("零售价4".equals(finalShoppingMall)) {
+						appStockPartsVO1.setSalesPrice(goodsMessage.getData().getStorePrice());
+					} else if ("零售价5".equals(finalShoppingMall)) {
+						appStockPartsVO1.setSalesPrice(goodsMessage.getData().getPrice());
+					} else if ("特价".equals(finalShoppingMall)) {
+						appStockPartsVO1.setSalesPrice(goodsMessage.getData().getSpecialOffer());
+						appStockPartsVO1.setStandardPrice(goodsMessage.getData().getStandardPrice());
+					} else {
+						appStockPartsVO1.setSalesPrice(goodsMessage.getData().getSpecialOffer());
+						appStockPartsVO1.setStandardPrice(goodsMessage.getData().getStandardPrice());
+					}
+				}
+				if (ObjectUtils.isNull(appStockPartsVO1.getSalesPrice())) {
+					appStockPartsVO1.setSalesPrice(new BigDecimal("0.00"));
+					appStockPartsVO1.setStandardPrice(new BigDecimal("0.00"));
+				}
+			} else {
+				appStockPartsVO1.setLabel(new String[]{});
+			}
+		}
+		return R.data(appStockPartsVO1);
+	}
+
+	/**
 	 * 自定义分页 手机端库存
 	 */
 	@GetMapping("/appStatistics")
@@ -471,7 +594,7 @@ public class StockGoodsController extends BladeController {
 			R<GoodsDescVO> goodsMessage = goodsDescClient.selectGoodsMessage(stockGoods.getGoodsId());
 			if (goodsMessage.isSuccess() && goodsMessage.getData() != null) {
 				GoodsDescDto goodsDescDto = new GoodsDescDto();
-				BeanUtils.copyProperties(goodsMessage.getData(),goodsDescDto);
+				BeanUtils.copyProperties(goodsMessage.getData(), goodsDescDto);
 				stockGoods.setGoodsDescDto(goodsDescDto);
 			}
 		}

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

@@ -63,4 +63,6 @@ public interface StockGoodsMapper extends BaseMapper<StockGoods> {
 	List<AppStockPartsVO> selectAppStockPartsPage(IPage<AppStockPartsVO> page, @Param("stock") AppStockPartsVO appStockPartsVO);
 
 	List<AppStockPartsVO> selectAppStockStatistics(@Param("stock") AppStockPartsVO appStockPartsVO);
+
+	AppStockPartsVO stockPartsDetails(@Param("stock") AppStockPartsVO appStockPartsVO);
 }

+ 85 - 1
blade-service/blade-stock/src/main/java/org/springblade/stock/mapper/StockGoodsMapper.xml

@@ -136,12 +136,15 @@
         t1.surplus_route_quantity AS balance,
         t1.lower_limit AS lowerLimit,
         t1.stock_price AS stockPrice,
+        t1.storage_id AS storageId,
         t2.cname AS storage,
         t3.cname AS goods,
         t3.id AS goodsId,
         t3.brand_item AS brandItem,
         t3.standard_price AS salesPrice,
         t3.purchase_price AS purchasePrice,
+        t3.label AS labels,
+        t3.upper_frame AS upperFrame,
         t4.cname AS goodsType,
         t5.url AS url,
         t1.remarks AS remarks,
@@ -162,6 +165,9 @@
             <if test="stock.goods != null and stock.goods != ''">
                 and (t3.cname like concat('%', #{stock.goods}, '%') or t3.cname_int like concat('%', #{stock.goods}, '%'))
             </if>
+            <if test="stock.upperFrame != null and stock.upperFrame != ''">
+                and t3.upper_frame = #{stock.upperFrame}
+            </if>
             <if test="stock.brand != null and stock.brand != ''">
                 and t3.brand = #{stock.brand}
             </if>
@@ -169,7 +175,13 @@
                 and t4.id = #{stock.goodsTypeId}
             </if>
             <if test="stock.labels != null and stock.labels != ''">
-                and find_in_set(t3.label,#{stock.labels})
+                and find_in_set(#{stock.labels},t3.label)
+            </if>
+            <if test="stock.storageId != null">
+                and t1.storage_id = #{stock.storageId}
+            </if>
+            <if test="stock.goodsId != null">
+                and t1.goods_id = #{stock.goodsId}
             </if>
             <if test="stock.status != null and stock.status != ''">
                 and t1.status = #{stock.status}
@@ -225,6 +237,7 @@
         t1.surplus_route_quantity AS balance,
         t1.lower_limit AS lowerLimit,
         t1.stock_price AS stockPrice,
+        t1.storage_id AS storageId,
         t2.cname AS STORAGE,
         t3.cname AS goods,
         t3.id AS goodsId,
@@ -301,6 +314,77 @@
             </if>
         </where>
     </select>
+    <select id="stockPartsDetails" resultType="org.springblade.stock.vo.AppStockPartsVO">
+        SELECT
+        t1.id,
+        t1.surplus_route_quantity AS balance,
+        t1.lower_limit AS lowerLimit,
+        t1.stock_price AS stockPrice,
+        t1.storage_id AS storageId,
+        t2.cname AS storage,
+        t3.cname AS goods,
+        t3.id AS goodsId,
+        t3.brand_item AS brandItem,
+        t3.standard_price AS salesPrice,
+        t3.purchase_price AS purchasePrice,
+        t3.label AS labels,
+        t3.upper_frame AS upperFrame,
+        t4.cname AS goodsType,
+        t5.url AS url,
+        t1.remarks AS remarks,
+        t1.update_time AS updateTime,
+        t1.arrears AS arrears,
+        t1.status AS status,
+        t1.balance_amount AS balanceAmount
+        FROM
+        business_stock_goods t1
+        LEFT JOIN basic_storage_desc t2 ON t1.storage_id = t2.id
+        LEFT JOIN basic_goods_desc t3 ON t1.goods_id = t3.id
+        LEFT JOIN basic_goods_type t4 ON t3.goods_type_id = t4.id
+        LEFT JOIN basic_goods_files t5 ON t3.id = t5.pid
+        AND t5.version = '0'
+        <where>
+            t1.is_deleted = 0
+            and t1.tenant_id = #{stock.tenantId}
+            and t1.surplus_route_quantity IS NOT NULL
+            <if test="stock.id != null">
+                and t1.id = #{stock.id}
+            </if>
+            <if test="stock.goods != null and stock.goods != ''">
+                and (t3.cname like concat('%', #{stock.goods}, '%') or t3.cname_int like concat('%', #{stock.goods}, '%'))
+            </if>
+            <if test="stock.upperFrame != null and stock.upperFrame != ''">
+                and t3.upper_frame = #{stock.upperFrame}
+            </if>
+            <if test="stock.brand != null and stock.brand != ''">
+                and t3.brand = #{stock.brand}
+            </if>
+            <if test="stock.goodsTypeId != null">
+                and t4.id = #{stock.goodsTypeId}
+            </if>
+            <if test="stock.labels != null and stock.labels != ''">
+                and find_in_set(#{stock.labels},t3.label)
+            </if>
+            <if test="stock.status != null and stock.status != ''">
+                and t1.status = #{stock.status}
+            </if>
+            <if test="stock.inventoryBalance != null and stock.inventoryBalance != '' and stock.inventoryBalance == 0">
+                and t1.surplus_route_quantity > 0
+            </if>
+            <if test="stock.inventoryBalance != null and stock.inventoryBalance != '' and stock.inventoryBalance == 1">
+                and t1.surplus_route_quantity &lt;= 0
+            </if>
+            <if test="stock.date != null and stock.date != '' and stock.date == 0">
+                and date_format(t1.in_date, '%Y %m') = date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y %m')
+            </if>
+            <if test="stock.date != null and stock.date != '' and stock.date == 1">
+                and YEARWEEK(date_format(t1.in_date,'%Y-%m-%d'),1) = YEARWEEK(now(),7)
+            </if>
+            <if test="stock.date != null and stock.date != '' and stock.date == 2">
+                and date_format(t1.in_date, '%Y %m') = date_format(DATE_SUB(curdate(), INTERVAL 0 MONTH),'%Y %m')
+            </if>
+        </where>
+    </select>
     <update id="updateStockGoods" parameterType="org.springblade.stock.entity.StockGoods">
         UPDATE business_stock_goods
         SET surplus_route_quantity = #{surplusRouteQuantity},

+ 2 - 0
blade-service/blade-stock/src/main/java/org/springblade/stock/service/IStockGoodsService.java

@@ -136,4 +136,6 @@ public interface IStockGoodsService extends IService<StockGoods> {
 	IPage<AppStockPartsVO> selectAppStockPartsPage(IPage<AppStockPartsVO> page, AppStockPartsVO appStockPartsVO);
 
 	List<AppStockPartsVO> selectAppStockStatistics(AppStockPartsVO appStockPartsVO);
+
+	AppStockPartsVO stockPartsDetails(AppStockPartsVO appStockPartsVO);
 }

+ 6 - 0
blade-service/blade-stock/src/main/java/org/springblade/stock/service/impl/StockGoodsServiceImpl.java

@@ -361,4 +361,10 @@ public class StockGoodsServiceImpl extends ServiceImpl<StockGoodsMapper, StockGo
 		return baseMapper.selectAppStockStatistics(appStockPartsVO);
 	}
 
+	@Override
+	public AppStockPartsVO stockPartsDetails(AppStockPartsVO appStockPartsVO) {
+		appStockPartsVO.setTenantId(AuthUtil.getTenantId());
+		return baseMapper.stockPartsDetails(appStockPartsVO);
+	}
+
 }

+ 8 - 0
blade-service/blade-system/src/main/java/org/springblade/system/feign/SysClient.java

@@ -200,6 +200,14 @@ public class SysClient implements ISysClient {
 	}
 
 	@Override
+	@GetMapping(TENANT_ID_BY_APP_ID)
+	public R<Tenant> getTenantByAppId(String appId) {
+		LambdaQueryWrapper<Tenant> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(Tenant::getIsDeleted,0).eq(Tenant::getAppId,appId);
+		return R.data(tenantService.getOne(lambdaQueryWrapper));
+	}
+
+	@Override
 	@GetMapping(TENANT_ID)
 	public R<Tenant> getTenant(String tenantId) {
 		return R.data(tenantService.getByTenantId(tenantId));

+ 3 - 1
blade-service/blade-user/src/main/java/org/springblade/system/user/feign/UserClient.java

@@ -153,10 +153,12 @@ public class UserClient implements IUserClient {
 	 * @return
 	 */
 	@Override
-	public User loginByAccount(String account, String phone) {
+	public User loginByAccount(String account, String phone, String userType, String tenantId) {
 		LambdaQueryWrapper<User> userLambdaQueryWrapper = new LambdaQueryWrapper<>();
 		userLambdaQueryWrapper.eq(ObjectUtils.isNotNull(account),User::getAccount, account);
 		userLambdaQueryWrapper.eq(ObjectUtils.isNotNull(phone),User::getPhone, phone);
+		userLambdaQueryWrapper.eq(ObjectUtils.isNotNull(userType),User::getUserType, userType);
+		userLambdaQueryWrapper.eq(ObjectUtils.isNotNull(tenantId),User::getTenantId, tenantId);
 		userLambdaQueryWrapper.eq(User::getIsDeleted, 0);
 		return service.getOne(userLambdaQueryWrapper);
 	}

+ 6 - 1
blade-service/trade-finance/src/main/java/org/springblade/finance/service/impl/SettlementServiceImpl.java

@@ -2516,7 +2516,12 @@ public class SettlementServiceImpl extends ServiceImpl<SettlementMapper, Settlem
 					model.setTenantId(AuthUtil.getTenantId());
 					model.setCreateTime(new Date());
 					model.setCreateUser(AuthUtil.getUserId());
-					model.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+					String[] arr = AuthUtil.getDeptId().split(",");
+					if (arr.length > 0) {
+						model.setCreateDept(Long.valueOf(AuthUtil.getDeptId().split(",")[0]));
+					} else {
+						model.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+					}
 					model.setAccId(acc.getId());
 					model.setAccount(settlement.getAccount());
 					model.setOverPayment(settlement.getOverPayment());

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä