Ver código fonte

Merge branch 'refs/heads/dev' into ecp

liyuan 6 dias atrás
pai
commit
f8a675c8ac
16 arquivos alterados com 955 adições e 210 exclusões
  1. 2 2
      blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java
  2. 4 0
      blade-ops/blade-xxljob-admin/src/main/java/com/xxl/job/admin/JobAdminApplication.java
  3. 11 0
      blade-ops/blade-xxljob-admin/src/main/java/com/xxl/job/admin/controller/u9cloud/config/FeignConfig.java
  4. 55 0
      blade-ops/blade-xxljob-admin/src/main/java/com/xxl/job/admin/controller/u9cloud/feign/U9CloudFeignClient.java
  5. 76 0
      blade-ops/blade-xxljob-admin/src/main/java/com/xxl/job/admin/controller/u9cloud/feign/U9CloudFeignClientFallbackFactory.java
  6. 284 0
      blade-ops/blade-xxljob-admin/src/main/java/com/xxl/job/admin/controller/u9cloud/feign/U9CloudTaskJob.java
  7. 14 0
      blade-service-api/blade-factory-api/src/main/java/org/springblade/factory/entity/ViewCustomerSel.java
  8. 27 0
      blade-service-api/blade-factory-api/src/main/java/org/springblade/factory/entity/ViewItemSel.java
  9. 99 78
      blade-service-api/blade-factory-api/src/main/java/org/springblade/factory/entity/ViewShipSel.java
  10. 19 0
      blade-service-api/blade-u9cloud-api/src/main/java/org/springblade/u9cloud/entity/ZcrmViewItemSel.java
  11. 0 2
      blade-service-api/blade-u9cloud-api/src/main/java/org/springblade/u9cloud/entity/ZcrmViewShipSel.java
  12. 187 24
      blade-service/blade-factory/src/main/java/org/springblade/factory/api/controller/SalesForecastSummaryController.java
  13. 173 68
      blade-service/blade-factory/src/main/java/org/springblade/factory/api/controller/SalesOrderController.java
  14. 0 19
      blade-service/blade-factory/src/main/java/org/springblade/factory/api/controller/SurveyController.java
  15. 1 2
      blade-service/blade-factory/src/main/java/org/springblade/factory/service/impl/PcBladeSalesForecastMainServiceImpl.java
  16. 3 15
      blade-service/blade-u9cloud/src/main/java/org/springblade/u9cloud/config/FeignConfig.java

+ 2 - 2
blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java

@@ -29,8 +29,8 @@ public interface LauncherConstant {
 	/**
 	 * 命名空间 bladex
 	 */
-	String NACOS_NAME_SPACE = "gubersail";
-//	String NACOS_NAME_SPACE = "public";
+//	String NACOS_NAME_SPACE = "gubersail";
+	String NACOS_NAME_SPACE = "public";
 
 	/**
 	 * nacos dev 地址

+ 4 - 0
blade-ops/blade-xxljob-admin/src/main/java/com/xxl/job/admin/JobAdminApplication.java

@@ -3,11 +3,15 @@ package com.xxl.job.admin;
 import org.springblade.common.constant.LauncherConstant;
 import org.springblade.core.launch.BladeApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 /**
  * @author xuxueli 2018-10-28 00:38:13
  */
 @SpringBootApplication
+@EnableFeignClients(basePackages = "com.xxl.job.admin.controller.u9cloud.feign") // 扫描Feign客户端所在包
+@EnableScheduling // 若使用Spring定时任务,保留此注解
 public class JobAdminApplication {
 
 	public static void main(String[] args) {

+ 11 - 0
blade-ops/blade-xxljob-admin/src/main/java/com/xxl/job/admin/controller/u9cloud/config/FeignConfig.java

@@ -0,0 +1,11 @@
+package com.xxl.job.admin.controller.u9cloud.config;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@Slf4j
+public class FeignConfig {
+
+
+}

+ 55 - 0
blade-ops/blade-xxljob-admin/src/main/java/com/xxl/job/admin/controller/u9cloud/feign/U9CloudFeignClient.java

@@ -0,0 +1,55 @@
+package com.xxl.job.admin.controller.u9cloud.feign;
+
+import com.xxl.job.admin.controller.u9cloud.config.FeignConfig;
+import org.springblade.core.tool.api.R;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+
+// 基础Feign客户端
+@FeignClient(
+	name = "blade-u9cloud", // 服务名称,根据实际服务名修改
+	configuration = FeignConfig.class,
+	fallbackFactory = U9CloudFeignClientFallbackFactory.class
+)
+public interface U9CloudFeignClient {
+
+	// 客户数据同步
+	@GetMapping("/api/viewCustomerSel/executionSynchronization")
+	R<Boolean> syncCustomerData();
+
+	// 部门数据同步
+	@GetMapping("/api/viewDepartmentSel/executionSynchronization")
+	R<Boolean> syncDepartmentData();
+
+	// 料品数据同步
+	@GetMapping("/api/viewItemSel/executionSynchronization")
+	R<Boolean> syncItemData();
+
+	// 业务员数据同步
+	@GetMapping("/api/viewOperatorsSel/executionSynchronization")
+	R<Boolean> syncOperatorsData();
+
+	// 标准出货数据同步
+	@GetMapping("/api/viewShipSel/executionSynchronization")
+	R<Boolean> syncShipData();
+
+	// 供应商数据同步
+	@GetMapping("/api/viewSupplierSel/executionSynchronization")
+	R<Boolean> syncSupplierData();
+
+	// 库存数据同步
+	@GetMapping("/api/viewWhqohSel/executionSynchronization")
+	R<Boolean> syncWhqohData();
+
+	// 应收单数据同步
+	@GetMapping("/api/viewARBillHeadSel/executionSynchronization")
+	R<Boolean> syncARBillData();
+
+	// 收款单数据同步
+	@GetMapping("/viewRecBillHeadSel/executionSynchronization")
+	R<Boolean> syncRecBillData();
+
+	// 销售价目表数据同步
+	@GetMapping("/api/viewSalepriceSel/executionSynchronization")
+	R<Boolean> syncSalepriceData();
+}

+ 76 - 0
blade-ops/blade-xxljob-admin/src/main/java/com/xxl/job/admin/controller/u9cloud/feign/U9CloudFeignClientFallbackFactory.java

@@ -0,0 +1,76 @@
+package com.xxl.job.admin.controller.u9cloud.feign;
+
+import feign.hystrix.FallbackFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.springblade.core.tool.api.R;
+import org.springframework.stereotype.Component;
+
+@Component
+@Slf4j
+public class U9CloudFeignClientFallbackFactory implements FallbackFactory<U9CloudFeignClient> {
+
+	@Override
+	public U9CloudFeignClient create(Throwable cause) {
+		return new U9CloudFeignClient() {
+			@Override
+			public R<Boolean> syncCustomerData() {
+				log.error("同步客户数据服务降级", cause);
+				return R.fail("同步客户数据服务不可用");
+			}
+
+			@Override
+			public R<Boolean> syncDepartmentData() {
+				log.error("同步部门数据服务降级", cause);
+				return R.fail("同步部门数据服务不可用");
+			}
+
+			@Override
+			public R<Boolean> syncItemData() {
+				log.error("同步物料数据服务降级", cause);
+				return R.fail("同步物料数据服务不可用");
+			}
+
+			@Override
+			public R<Boolean> syncOperatorsData() {
+				log.error("同步操作员数据服务降级", cause);
+				return R.fail("同步操作员数据服务不可用");
+			}
+
+			@Override
+			public R<Boolean> syncShipData() {
+				log.error("同步物流数据服务降级", cause);
+				return R.fail("同步物流数据服务不可用");
+			}
+
+			@Override
+			public R<Boolean> syncSupplierData() {
+				log.error("同步供应商数据服务降级", cause);
+				return R.fail("同步供应商数据服务不可用");
+			}
+
+			@Override
+			public R<Boolean> syncWhqohData() {
+				log.error("同步库存数据服务降级", cause);
+				return R.fail("同步库存数据服务不可用");
+			}
+
+			@Override
+			public R<Boolean> syncARBillData() {
+				log.error("同步应收单数据服务降级", cause);
+				return R.fail("同步应收单数据服务不可用");
+			}
+
+			@Override
+			public R<Boolean> syncRecBillData() {
+				log.error("同步收款单数据服务降级", cause);
+				return R.fail("同步收款单数据服务不可用");
+			}
+
+			@Override
+			public R<Boolean> syncSalepriceData() {
+				log.error("同步销售价目表数据服务降级", cause);
+				return R.fail("同步销售价目表数据服务不可用");
+			}
+		};
+	}
+}

+ 284 - 0
blade-ops/blade-xxljob-admin/src/main/java/com/xxl/job/admin/controller/u9cloud/feign/U9CloudTaskJob.java

@@ -0,0 +1,284 @@
+package com.xxl.job.admin.controller.u9cloud.feign;
+
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springblade.core.tool.api.R;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.function.Supplier;
+
+/**
+ * U9同步数据定时任务(通过Feign调用微服务)
+ * 每个方法对应一种数据的同步,支持单独调度
+ *
+ * @author
+ */
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class U9CloudTaskJob {
+
+	// 注入Feign客户端
+	@Autowired
+	private U9CloudFeignClient u9CloudFeignClient;
+
+	/**
+	 * 同步客户数据(单独任务)
+	 */
+	@XxlJob("syncCustomerDataHandler")
+	@Transactional(rollbackFor = Exception.class)
+	public void syncCustomerData() throws Exception {
+		log.info("XXL-JOB: 开始执行客户数据同步任务");
+		executeSyncTask(
+			() -> u9CloudFeignClient.syncCustomerData(),
+			"客户数据"
+		);
+		log.info("XXL-JOB: 客户数据同步任务执行完成");
+	}
+
+	/**
+	 * 同步部门数据(单独任务)
+	 */
+	@XxlJob("syncDepartmentDataHandler")
+	@Transactional(rollbackFor = Exception.class)
+	public void syncDepartmentData() throws Exception {
+		log.info("XXL-JOB: 开始执行部门数据同步任务");
+		executeSyncTask(
+			() -> u9CloudFeignClient.syncDepartmentData(),
+			"部门数据"
+		);
+		log.info("XXL-JOB: 部门数据同步任务执行完成");
+	}
+
+	/**
+	 * 同步物料数据(单独任务)
+	 */
+	@XxlJob("syncItemDataHandler")
+	@Transactional(rollbackFor = Exception.class)
+	public void syncItemData() throws Exception {
+		log.info("XXL-JOB: 开始执行物料数据同步任务");
+		executeSyncTask(
+			() -> u9CloudFeignClient.syncItemData(),
+			"物料数据"
+		);
+		log.info("XXL-JOB: 物料数据同步任务执行完成");
+	}
+
+	/**
+	 * 同步操作员数据(单独任务)
+	 */
+	@XxlJob("syncOperatorsDataHandler")
+	@Transactional(rollbackFor = Exception.class)
+	public void syncOperatorsData() throws Exception {
+		log.info("XXL-JOB: 开始执行操作员数据同步任务");
+		executeSyncTask(
+			() -> u9CloudFeignClient.syncOperatorsData(),
+			"操作员数据"
+		);
+		log.info("XXL-JOB: 操作员数据同步任务执行完成");
+	}
+
+	/**
+	 * 同步物流数据(单独任务)
+	 */
+	@XxlJob("syncShipDataHandler")
+	@Transactional(rollbackFor = Exception.class)
+	public void syncShipData() throws Exception {
+		log.info("XXL-JOB: 开始执行物流数据同步任务");
+		executeSyncTask(
+			() -> u9CloudFeignClient.syncShipData(),
+			"物流数据"
+		);
+		log.info("XXL-JOB: 物流数据同步任务执行完成");
+	}
+
+	/**
+	 * 同步供应商数据(单独任务)
+	 */
+	@XxlJob("syncSupplierDataHandler")
+	@Transactional(rollbackFor = Exception.class)
+	public void syncSupplierData() throws Exception {
+		log.info("XXL-JOB: 开始执行供应商数据同步任务");
+		executeSyncTask(
+			() -> u9CloudFeignClient.syncSupplierData(),
+			"供应商数据"
+		);
+		log.info("XXL-JOB: 供应商数据同步任务执行完成");
+	}
+
+	/**
+	 * 同步库存数据(单独任务)
+	 */
+	@XxlJob("syncWhqohDataHandler")
+	@Transactional(rollbackFor = Exception.class)
+	public void syncWhqohData() throws Exception {
+		log.info("XXL-JOB: 开始执行库存数据同步任务");
+		executeSyncTask(
+			() -> u9CloudFeignClient.syncWhqohData(),
+			"库存数据"
+		);
+		log.info("XXL-JOB: 库存数据同步任务执行完成");
+	}
+
+	/**
+	 * 同步应收单数据(单独任务)
+	 */
+	@XxlJob("syncARBillDataHandler")
+	@Transactional(rollbackFor = Exception.class)
+	public void syncARBillData() throws Exception {
+		log.info("XXL-JOB: 开始执行应收单数据同步任务");
+		executeSyncTask(
+			() -> u9CloudFeignClient.syncARBillData(),
+			"应收单数据"
+		);
+		log.info("XXL-JOB: 应收单数据同步任务执行完成");
+	}
+
+	/**
+	 * 同步收款单数据(单独任务)
+	 */
+	@XxlJob("syncRecBillDataHandler")
+	@Transactional(rollbackFor = Exception.class)
+	public void syncRecBillData() throws Exception {
+		log.info("XXL-JOB: 开始执行收款单数据同步任务");
+		executeSyncTask(
+			() -> u9CloudFeignClient.syncRecBillData(),
+			"收款单数据"
+		);
+		log.info("XXL-JOB: 收款单数据同步任务执行完成");
+	}
+
+	/**
+	 * 同步销售价目表数据(单独任务)
+	 */
+	@XxlJob("syncSalepriceDataHandler")
+	@Transactional(rollbackFor = Exception.class)
+	public void syncSalepriceData() throws Exception {
+		log.info("XXL-JOB: 开始执行销售价目表数据同步任务");
+		executeSyncTask(
+			() -> u9CloudFeignClient.syncSalepriceData(),
+			"销售价目表数据"
+		);
+		log.info("XXL-JOB: 销售价目表数据同步任务执行完成");
+	}
+
+	/**
+	 * 同步所有U9数据(完整同步)
+	 */
+	@XxlJob("syncAllDataHandler")
+	@Transactional(rollbackFor = Exception.class)
+	public void syncAllData() throws Exception {
+		log.info("XXL-JOB: ===== 开始执行U9数据完整同步 =====");
+
+		long startTime = System.currentTimeMillis();
+
+		try {
+			// 按业务顺序执行同步
+			log.info("XXL-JOB: 开始同步部门数据");
+			syncDepartmentData();
+
+			log.info("XXL-JOB: 开始同步客户数据");
+			syncCustomerData();
+
+			log.info("XXL-JOB: 开始同步物料数据");
+			syncItemData();
+
+			log.info("XXL-JOB: 开始同步操作员数据");
+			syncOperatorsData();
+
+			log.info("XXL-JOB: 开始同步供应商数据");
+			syncSupplierData();
+
+			log.info("XXL-JOB: 开始同步物流数据");
+			syncShipData();
+
+			log.info("XXL-JOB: 开始同步库存数据");
+			syncWhqohData();
+
+			log.info("XXL-JOB: 开始同步应收单数据");
+			syncARBillData();
+
+			log.info("XXL-JOB: 开始同步收款单数据");
+			syncRecBillData();
+
+			log.info("XXL-JOB: 开始同步销售价目表数据");
+			syncSalepriceData();
+
+			long endTime = System.currentTimeMillis();
+			String successMsg = String.format("XXL-JOB: ===== U9数据完整同步完成,耗时:%s ms =====", (endTime - startTime));
+			log.info(successMsg);
+
+		} catch (Exception e) {
+			String errorMsg = "XXL-JOB: U9数据完整同步失败:" + e.getMessage();
+			log.error(errorMsg, e);
+			throw e;
+		}
+	}
+
+	/**
+	 * 通用同步逻辑(通过Feign调用)
+	 *
+	 * @param syncTask 同步任务的具体逻辑
+	 * @param dataName 数据类型名称(用于日志和异常信息)
+	 */
+	private void executeSyncTask(Supplier<R<Boolean>> syncTask, String dataName) {
+		long startTime = System.currentTimeMillis();
+
+		try {
+			String startMsg = "XXL-JOB: 开始通过Feign同步U9【" + dataName + "】";
+			log.info(startMsg);
+
+			// 通过Feign调用远程服务
+			R<Boolean> result = syncTask.get();
+
+			// 独立判断逻辑,不依赖Func工具类
+			if (isSyncSuccess(result)) {
+				long endTime = System.currentTimeMillis();
+				String successMsg = String.format("XXL-JOB: U9【%s】同步成功,耗时:%s ms", dataName, (endTime - startTime));
+				log.info(successMsg);
+			} else {
+				String errorMsg = buildErrorMessage(dataName, result);
+				log.error(errorMsg);
+				throw new RuntimeException(errorMsg);
+			}
+
+		} catch (RuntimeException e) {
+			// 已知的业务异常,直接抛出
+			log.error("XXL-JOB: 业务异常:" + e.getMessage());
+			throw e;
+		} catch (Exception e) {
+			String errorMsg = "XXL-JOB: U9【" + dataName + "】同步失败:" + e.getMessage();
+			log.error(errorMsg, e);
+			throw new RuntimeException(errorMsg, e);
+		}
+	}
+
+	/**
+	 * 判断同步是否成功
+	 */
+	private boolean isSyncSuccess(R<Boolean> result) {
+		return result != null
+			&& result.isSuccess()
+			&& result.getData() != null
+			&& result.getData();
+	}
+
+	/**
+	 * 构建错误信息
+	 */
+	private String buildErrorMessage(String dataName, R<Boolean> result) {
+		if (result == null) {
+			return String.format("XXL-JOB: U9【%s】同步失败:返回结果为空", dataName);
+		} else if (!result.isSuccess()) {
+			return String.format("XXL-JOB: U9【%s】同步失败:%s", dataName, result.getMsg());
+		} else if (result.getData() == null) {
+			return String.format("XXL-JOB: U9【%s】同步失败:返回数据为空", dataName);
+		} else {
+			return String.format("XXL-JOB: U9【%s】同步失败:返回结果为false", dataName);
+		}
+	}
+}

+ 14 - 0
blade-service-api/blade-factory-api/src/main/java/org/springblade/factory/entity/ViewCustomerSel.java

@@ -226,5 +226,19 @@ public class ViewCustomerSel extends BaseEntity {
 	@JsonProperty("ARConfirmTerm_NAME")
 	@TableField("ARConfirmTerm_NAME")
 	private String arConfirmTermName;
+
+
+	@JsonProperty("PubDescSeg4_Code")
+	@TableField("PubDescSeg4_Code")
+	private String pubDescSeg4Code;
+
+	@JsonProperty("PubDescSeg4_Name")
+	@TableField("PubDescSeg4_Name")
+	private String pubDescSeg4Name;
+
+
+
+
+
 }
 

+ 27 - 0
blade-service-api/blade-factory-api/src/main/java/org/springblade/factory/entity/ViewItemSel.java

@@ -136,5 +136,32 @@ public class ViewItemSel extends BaseEntity {
 	@JsonProperty("Item_Price")
 	@TableField("Item_Price")
 	private BigDecimal itemPrice;
+
+
+	// 在 ViewItemSel 实体类中修改这两个字段:
+	@JsonProperty("PubDescSeg4_Code")
+	@TableField(value = "PubDescSeg4_Code") // 添加 exist = false
+	private String pubDescSeg4Code;
+
+	@JsonProperty("PubDescSeg4_Name")
+	@TableField(value = "PubDescSeg4_Name") // 添加 exist = false
+	private String pubDescSeg4Name;
+
+	// 在ViewItemSel中找到以下字段,添加@TableField(exist = false)
+	@JsonProperty("volume")
+	@TableField(value = "volume") // 标记为非数据库字段
+	private String volume;
+
+	@JsonProperty("pattern")
+	@TableField(value = "pattern") // 标记为非数据库字段
+	private String pattern;
+
+	@JsonProperty("layer")
+	@TableField(value = "layer") // 标记为非数据库字段
+	private String layer;
+
+	@JsonProperty("speed")
+	@TableField(value = "speed") // 标记为非数据库字段
+	private String speed;
 }
 

+ 99 - 78
blade-service-api/blade-factory-api/src/main/java/org/springblade/factory/entity/ViewShipSel.java

@@ -15,108 +15,129 @@ public class ViewShipSel extends BaseEntity {
 
 	private static final long serialVersionUID = 1L;
 
-	@JsonProperty("Org_ID")
-	@TableField("Org_ID")
-	private Long orgId;
 
-	@JsonProperty("Org_Code")
-	@TableField("Org_Code")
-	private String orgCode;
+	@Data
+	@TableName("zcrm_view_ship_sel")
+	public class ZcrmViewShipSel extends BaseEntity {
 
-	@JsonProperty("Org_Name")
-	@TableField("Org_Name")
-	private String orgName;
+		private static final long serialVersionUID = 1L;
 
-	@JsonProperty("DocType_ID")
-	@TableField("DocType_ID")
-	private Long docTypeId;
+		@JsonProperty("Org_ID")
+		@TableField("Org_ID")
+		private Long orgId;
 
-	@JsonProperty("DocType_Code")
-	@TableField("DocType_Code")
-	private String docTypeCode;
+		@JsonProperty("Org_Code")
+		@TableField("Org_Code")
+		private String orgCode;
 
-	@JsonProperty("DocType_Name")
-	@TableField("DocType_Name")
-	private String docTypeName;
+		@JsonProperty("Org_Name")
+		@TableField("Org_Name")
+		private String orgName;
 
-	@JsonProperty("DocNo")
-	@TableField("DocNo")
-	private String docNo;
+		@JsonProperty("DocType_ID")
+		@TableField("DocType_ID")
+		private Long docTypeId;
 
-	@JsonProperty("BusinessDate")
-	@TableField("BusinessDate")
-	private LocalDateTime businessDate;
+		@JsonProperty("DocType_Code")
+		@TableField("DocType_Code")
+		private String docTypeCode;
 
-	@JsonProperty("Status")
-	@TableField("Status")
-	private Integer status;
+		@JsonProperty("DocType_Name")
+		@TableField("DocType_Name")
+		private String docTypeName;
 
-	@JsonProperty("Customer_ID")
-	@TableField("Customer_ID")
-	private Long customerId;
+		@JsonProperty("DocNo")
+		@TableField("DocNo")
+		private String docNo;
 
-	@JsonProperty("Customer_Code")
-	@TableField("Customer_Code")
-	private String customerCode;
+		@JsonProperty("BusinessDate")
+		@TableField("BusinessDate")
+		private LocalDateTime businessDate;
 
-	@JsonProperty("Customer_Name")
-	@TableField("Customer_Name")
-	private String customerName;
+		@JsonProperty("Status")
+		@TableField("Status")
+		private Integer status;
 
-	@JsonProperty("Item_ID")
-	@TableField("Item_ID")
-	private Long itemId;
+		@JsonProperty("Customer_ID")
+		@TableField("Customer_ID")
+		private Long customerId;
 
-	@JsonProperty("Item_Code")
-	@TableField("Item_Code")
-	private String itemCode;
+		@JsonProperty("Customer_Code")
+		@TableField("Customer_Code")
+		private String customerCode;
 
-	@JsonProperty("Item_Name")
-	@TableField("Item_Name")
-	private String itemName;
+		@JsonProperty("Customer_Name")
+		@TableField("Customer_Name")
+		private String customerName;
 
-	@JsonProperty("SPECS")
-	@TableField("SPECS")
-	private String specs;
+		@JsonProperty("Item_ID")
+		@TableField("Item_ID")
+		private Long itemId;
 
-	@JsonProperty("Qty")
-	@TableField("Qty")
-	private BigDecimal qty;
+		@JsonProperty("Item_Code")
+		@TableField("Item_Code")
+		private String itemCode;
 
-	@JsonProperty("OrderPrice")
-	@TableField("OrderPrice")
-	private BigDecimal orderPrice;
+		@JsonProperty("Item_Name")
+		@TableField("Item_Name")
+		private String itemName;
 
-	@JsonProperty("FinallyPrice")
-	@TableField("FinallyPrice")
-	private BigDecimal finallyPrice;
+		@JsonProperty("SPECS")
+		@TableField("SPECS")
+		private String specs;
 
-	@JsonProperty("TotalMoneyTC")
-	@TableField("TotalMoneyTC")
-	private BigDecimal totalMoneyTc;
+		@JsonProperty("Qty")
+		@TableField("Qty")
+		private BigDecimal qty;
 
-	@JsonProperty("TotalNetMoneyTC")
-	@TableField("TotalNetMoneyTC")
-	private BigDecimal totalNetMoneyTc;
+		@JsonProperty("OrderPrice")
+		@TableField("OrderPrice")
+		private BigDecimal orderPrice;
 
-	@JsonProperty("TotalTaxTC")
-	@TableField("TotalTaxTC")
-	private BigDecimal totalTaxTc;
+		@JsonProperty("FinallyPrice")
+		@TableField("FinallyPrice")
+		private BigDecimal finallyPrice;
 
-	@JsonProperty("WH_ID")
-	@TableField("WH_ID")
-	private Long whId;
+		@JsonProperty("TotalMoneyTC")
+		@TableField("TotalMoneyTC")
+		private BigDecimal totalMoneyTc;
 
-	@JsonProperty("WH_Code")
-	@TableField("WH_Code")
-	private String whCode;
+		@JsonProperty("TotalNetMoneyTC")
+		@TableField("TotalNetMoneyTC")
+		private BigDecimal totalNetMoneyTc;
 
-	@JsonProperty("WH_Name")
-	@TableField("WH_Name")
-	private String whName;
+		@JsonProperty("TotalTaxTC")
+		@TableField("TotalTaxTC")
+		private BigDecimal totalTaxTc;
 
-	@JsonProperty("LineStatus")
-	@TableField("LineStatus")
-	private Integer lineStatus;
+		@JsonProperty("WH_ID")
+		@TableField("WH_ID")
+		private Long whId;
+
+		@JsonProperty("WH_Code")
+		@TableField("WH_Code")
+		private String whCode;
+
+		@JsonProperty("WH_Name")
+		@TableField("WH_Name")
+		private String whName;
+
+		@JsonProperty("LineStatus")
+		@TableField("LineStatus")
+		private Integer lineStatus;
+
+		@JsonProperty("SoDocNo")
+		@TableField("SoDocNo")
+		private String soDocNo;
+
+		@JsonProperty("SoDocLineNo")
+		@TableField("SoDocLineNo")
+		private Integer soDocLineNo;
+
+		@JsonProperty("ShipAddress")
+		@TableField("ShipAddress")
+		private String shipAddress;
+
+	}
 }
 

+ 19 - 0
blade-service-api/blade-u9cloud-api/src/main/java/org/springblade/u9cloud/entity/ZcrmViewItemSel.java

@@ -145,4 +145,23 @@ public class ZcrmViewItemSel extends BaseEntity {
 	@JsonProperty("PubDescSeg4_Name")
 	@TableField("PubDescSeg4_Name")
 	private String pubDescSeg4Name;
+
+
+
+	@JsonProperty("volume")
+	@TableField("volume")
+	private String volume;
+
+	@JsonProperty("pattern")
+	@TableField("pattern")
+	private String pattern;
+
+	@JsonProperty("layer")
+	@TableField("layer")
+	private String layer;
+
+	@JsonProperty("speed")
+	@TableField("speed")
+	private String speed;
+
 }

+ 0 - 2
blade-service-api/blade-u9cloud-api/src/main/java/org/springblade/u9cloud/entity/ZcrmViewShipSel.java

@@ -131,6 +131,4 @@ public class ZcrmViewShipSel extends BaseEntity {
 	@TableField("ShipAddress")
 	private String shipAddress;
 
-
-
 }

+ 187 - 24
blade-service/blade-factory/src/main/java/org/springblade/factory/api/controller/SalesForecastSummaryController.java

@@ -1,9 +1,10 @@
 package org.springblade.factory.api.controller;
 
 
-import com.alibaba.excel.util.CollectionUtils;
+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.extension.plugins.pagination.Page;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
@@ -12,8 +13,6 @@ import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
-import org.redisson.api.RLock;
-import org.redisson.api.RedissonClient;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.BladeUser;
@@ -23,9 +22,7 @@ import org.springblade.factory.entity.*;
 import org.springblade.factory.service.*;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
-import org.springblade.u9cloud.entity.ZcrmViewCustomerSel;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.dao.DuplicateKeyException;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
@@ -40,7 +37,6 @@ import java.security.Principal;
 import java.time.LocalDate;
 import java.time.format.DateTimeParseException;
 import java.util.*;
-import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -62,6 +58,10 @@ public class SalesForecastSummaryController {
 
 	private final PcBladeSalesForecastMainService salesForecastMainService;
 
+	private final ZcrmViewItemSelService itemSelService;
+
+	private final ZcrmViewWhqohSelService whqohSelService;
+
 	@Autowired
 	private IUserClient userClient;
 
@@ -388,8 +388,9 @@ public class SalesForecastSummaryController {
 			return R.fail("年份和月份参数无效");
 		}
 
-		Long customerId = AuthUtil.getUserId();
-		List<PcBladeSalesForecastSummary> list = forecastService.getForecastByUserAndMonth(customerId, year, month);
+		Long userId = AuthUtil.getUserId();
+		R<User> user =  userClient.userInfoById(userId);
+		List<PcBladeSalesForecastSummary> list = forecastService.getForecastByUserAndMonth(user.getData().getCustomerId(), year, month);
 		return R.data(list);
 	}
 
@@ -767,6 +768,27 @@ public class SalesForecastSummaryController {
 
 	private final PjpfBrandDescService brandService;
 
+//	/**
+//	 * 品牌列表
+//	 */
+//	@GetMapping("/brand-desc")
+//	@ApiOperation(value = "品牌列表", notes = "传入cname,status,type等查询条件")
+//	@ApiOperationSupport(order = 1)
+//	public R<IPage<PjpfBrandDesc>> brandDesc(
+//		@ApiIgnore @RequestParam Map<String, Object> brandParams,
+//		Query query,
+//		BladeUser bladeUser) {
+//		// 构建查询条件
+//		QueryWrapper<PjpfBrandDesc> queryWrapper = Condition.getQueryWrapper(brandParams, PjpfBrandDesc.class);
+//		// 执行分页查询
+//		IPage<PjpfBrandDesc> pages = brandService.page(Condition.getPage(query), queryWrapper);
+//		// 转换VO并返回
+//		return R.data(pages);
+//	}
+
+
+
+
 	/**
 	 * 品牌列表
 	 */
@@ -777,14 +799,45 @@ public class SalesForecastSummaryController {
 		@ApiIgnore @RequestParam Map<String, Object> brandParams,
 		Query query,
 		BladeUser bladeUser) {
-		// 构建查询条件
-		QueryWrapper<PjpfBrandDesc> queryWrapper = Condition.getQueryWrapper(brandParams, PjpfBrandDesc.class);
-		// 执行分页查询
-		IPage<PjpfBrandDesc> pages = brandService.page(Condition.getPage(query), queryWrapper);
+
+		Page<ViewItemSel> page = new Page<>();
+		LambdaQueryWrapper<ViewItemSel> queryWrapper = new LambdaQueryWrapper<>();
+		IPage<ViewItemSel> itemPage = itemSelService.page(page, queryWrapper);
+
+		// 2. 手动映射为PjpfBrandDesc分页数据
+		IPage<PjpfBrandDesc> brandPage = new Page<>(itemPage.getCurrent(), itemPage.getSize(), itemPage.getTotal());
+		List<PjpfBrandDesc> brandList = itemPage.getRecords().stream().map(item -> {
+			PjpfBrandDesc brand = new PjpfBrandDesc();
+			// 字段映射(根据业务逻辑调整)
+			brand.setId(item.getItemId()); // 料品ID -> 品牌主键
+			brand.setTenantId(String.valueOf(item.getOrgId())); // 组织ID -> 租户ID
+			brand.setCname(item.getItemName()); // 料品名称 -> 品牌名称
+			brand.setSalesCompanyId(item.getOrgId()); // 组织ID -> 所属公司ID
+			brand.setSalesCompanyName(item.getOrgName()); // 组织名称 -> 所属公司名称
+			brand.setType(item.getMainItemCategoryCode()); // 主分类编码 -> 类型
+			brand.setWhetherIntegral("");
+			return brand;
+		}).collect(Collectors.toList());
+		brandPage.setRecords(brandList);
 		// 转换VO并返回
-		return R.data(pages);
+		return R.data(brandPage);
 	}
 
+
+
+
+//	/**
+//	 * 单条查询
+//	 */
+//	@GetMapping("/brand-desc/{id}")
+//	@ApiOperation(value = "单条查询", notes = "传入品牌ID")
+//	@ApiImplicitParam(name = "id", value = "品牌ID", required = true, paramType = "path")
+//	@ApiOperationSupport(order = 2)
+//	public R<PjpfBrandDesc> getBrandDesc(@PathVariable("id") Long id) {
+//		PjpfBrandDesc brand = brandService.getById(id);
+//		return R.data(brand);
+//	}
+
 	/**
 	 * 单条查询
 	 */
@@ -793,15 +846,54 @@ public class SalesForecastSummaryController {
 	@ApiImplicitParam(name = "id", value = "品牌ID", required = true, paramType = "path")
 	@ApiOperationSupport(order = 2)
 	public R<PjpfBrandDesc> getBrandDesc(@PathVariable("id") Long id) {
-		PjpfBrandDesc brand = brandService.getById(id);
+
+		QueryWrapper<ViewItemSel> queryWrapper = new QueryWrapper<>();
+		queryWrapper.eq("Item_ID", id);
+		ViewItemSel viewItemSel = itemSelService.getOne(queryWrapper);
+		if (viewItemSel == null) {
+			R.fail("料品数据不存在");
+		}
+
+		PjpfBrandDesc brand = new PjpfBrandDesc();
+		// 字段映射(根据业务逻辑调整)
+		brand.setId(viewItemSel.getItemId()); // 料品ID -> 品牌主键
+		brand.setTenantId(String.valueOf(viewItemSel.getOrgId())); // 组织ID -> 租户ID
+		brand.setCname(viewItemSel.getItemName()); // 料品名称 -> 品牌名称
+		brand.setSalesCompanyId(viewItemSel.getOrgId()); // 组织ID -> 所属公司ID
+		brand.setSalesCompanyName(viewItemSel.getOrgName()); // 组织名称 -> 所属公司名称
+		brand.setType(viewItemSel.getMainItemCategoryCode()); // 主分类编码 -> 类型
+		brand.setWhetherIntegral("");
+
 		return R.data(brand);
 	}
 
 
 
+
+
 	/* ========== 库存表 ========== */
 	private final PjpfStockDescService stockService;
 
+//	/**
+//	 * 库存列表
+//	 */
+//	@GetMapping("brand-stock")
+//	@ApiOperation(value = "库存列表", notes = "传入cname,goodsId,brandId等查询条件")
+//	@ApiOperationSupport(order = 1)
+//	public R<IPage<PjpfStockDesc>> brandStock(
+//		@ApiIgnore @RequestParam Map<String, Object> stockParams,
+//		Query query,
+//		BladeUser bladeUser) {
+//		// 构建查询条件
+//		QueryWrapper<PjpfStockDesc> queryWrapper = Condition.getQueryWrapper(stockParams, PjpfStockDesc.class);
+//		// 执行分页查询
+//		IPage<PjpfStockDesc> pages = stockService.page(Condition.getPage(query), queryWrapper);
+//		// 转换VO并返回
+//		return R.data(pages);
+//	}
+
+
+
 	/**
 	 * 库存列表
 	 */
@@ -812,28 +904,99 @@ public class SalesForecastSummaryController {
 		@ApiIgnore @RequestParam Map<String, Object> stockParams,
 		Query query,
 		BladeUser bladeUser) {
-		// 构建查询条件
-		QueryWrapper<PjpfStockDesc> queryWrapper = Condition.getQueryWrapper(stockParams, PjpfStockDesc.class);
-		// 执行分页查询
-		IPage<PjpfStockDesc> pages = stockService.page(Condition.getPage(query), queryWrapper);
+
+		QueryWrapper<ViewWhqohSel> queryWrapper = new QueryWrapper<>();
+		Page<ViewWhqohSel> page = new Page<>();
+
+		// 3. 查询库存视图数据
+		IPage<ViewWhqohSel> whqohPage = whqohSelService.page(page, queryWrapper);
+
+		// 4. 手动映射为PjpfStockDesc分页数据
+		IPage<PjpfStockDesc> stockPage = new Page<>(
+			whqohPage.getCurrent(),
+			whqohPage.getSize(),
+			whqohPage.getTotal()
+		);
+
+		List<PjpfStockDesc> stockList = whqohPage.getRecords().stream().map(whqoh -> {
+			PjpfStockDesc stock = new PjpfStockDesc();
+			// 字段映射(根据业务逻辑调整)
+			stock.setId(whqoh.getItemId()); // 商品ID作为主键
+			stock.setTenantId(whqoh.getOrgId().toString()); // 组织ID作为租户ID
+			stock.setStorageId(whqoh.getWarehouseId()); // 仓库ID
+			stock.setStorageName(whqoh.getWarehouseName()); // 仓库名称
+			stock.setGoodsId(whqoh.getItemId()); // 商品ID
+			stock.setCode(whqoh.getItemCode()); // 物料编号(商品编码)
+			stock.setCname(whqoh.getItemName()); // 商品名称
+			stock.setTypeNo(whqoh.getItemPecs()); // 规格型号(映射自Item_PECS)
+			stock.setProductDescription(whqoh.getItemDescription()); // 商品描述
+			stock.setSalesCompanyId(whqoh.getOrgId()); // 所属公司ID(组织ID)
+			stock.setSalesCompanyName(whqoh.getOrgName()); // 所属公司名称(组织名称)
+			stock.setBalanceQuantity(whqoh.getStoreQty()); // 结余数量(总)
+			stock.setStoreInventory(whqoh.getStoreQty()); // 商城库存(假设与总库存一致)
+			// 其他需要的字段继续映射...
+			return stock;
+		}).collect(Collectors.toList());
+
+		stockPage.setRecords(stockList);
+
 		// 转换VO并返回
-		return R.data(pages);
+		return R.data(stockPage);
 	}
 
+
+
+
+//	/**
+//	 * 单条查询
+//	 */
+//	@GetMapping("/brand-stock/{id}")
+//	@ApiOperation(value = "单条查询", notes = "传入库存ID")
+//	@ApiImplicitParam(name = "id", value = "库存ID", required = true, paramType = "path")
+//	@ApiOperationSupport(order = 2)
+//	public R<PjpfStockDesc> getBrandStock(@PathVariable("id") Long id) {
+//		PjpfStockDesc stock = stockService.getById(id);
+//		return R.data(stock);
+//	}
+
 	/**
 	 * 单条查询
 	 */
 	@GetMapping("/brand-stock/{id}")
-	@ApiOperation(value = "单条查询", notes = "传入库存ID")
-	@ApiImplicitParam(name = "id", value = "库存ID", required = true, paramType = "path")
+	@ApiOperation(value = "单条查询", notes = "传入库存对应的商品ID")
+	@ApiImplicitParam(name = "id", value = "商品ID", required = true, paramType = "path")
 	@ApiOperationSupport(order = 2)
 	public R<PjpfStockDesc> getBrandStock(@PathVariable("id") Long id) {
-		PjpfStockDesc stock = stockService.getById(id);
-		return R.data(stock);
-	}
+		// 1. 根据商品ID查询原始库存视图数据
+		ViewWhqohSel whqoh = whqohSelService.getOne(
+			new LambdaQueryWrapper<ViewWhqohSel>()
+				.eq(ViewWhqohSel::getItemId, id)
+		);
 
+		if (whqoh == null) {
+			return R.fail("未找到对应的库存信息");
+		}
 
+		// 2. 手动映射为PjpfStockDesc对象
+		PjpfStockDesc stock = new PjpfStockDesc();
+		stock.setId(whqoh.getItemId()); // 商品ID作为主键
+		stock.setTenantId(whqoh.getOrgId().toString()); // 组织ID作为租户ID
+		stock.setStorageId(whqoh.getWarehouseId()); // 仓库ID
+		stock.setStorageName(whqoh.getWarehouseName()); // 仓库名称
+		stock.setGoodsId(whqoh.getItemId()); // 商品ID
+		stock.setCode(whqoh.getItemCode()); // 物料编号(商品编码)
+		stock.setCname(whqoh.getItemName()); // 商品名称
+		stock.setTypeNo(whqoh.getItemPecs()); // 规格型号
+		stock.setProductDescription(whqoh.getItemDescription()); // 商品描述
+		stock.setSalesCompanyId(whqoh.getOrgId()); // 所属公司ID
+		stock.setSalesCompanyName(whqoh.getOrgName()); // 所属公司名称
+		stock.setBalanceQuantity(whqoh.getStoreQty()); // 结余数量
+		stock.setStoreInventory(whqoh.getStoreQty()); // 商城库存
+
+		// 其他需要的字段继续映射...
 
+		return R.data(stock);
+	}
 
 	/* ========== 工厂端审核 ========== */
 

+ 173 - 68
blade-service/blade-factory/src/main/java/org/springblade/factory/api/controller/SalesOrderController.java

@@ -26,6 +26,7 @@ import org.springblade.system.user.feign.IUserClient;
 import org.springblade.u9cloud.entity.ZcrmU9cWebapiSo;
 import org.springblade.u9cloud.entity.ZcrmU9cWebapiSoApprove;
 import org.springblade.u9cloud.entity.ZcrmU9cWebapiSoSubmit;
+import org.springblade.u9cloud.entity.ZcrmViewCustomerSel;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
@@ -71,6 +72,10 @@ public class SalesOrderController {
 	private final PjpfStockDescService stockService;
 
 	private final PjpfBrandDescService brandService;
+	@Autowired
+	private ZcrmViewItemSelService zcrmViewItemSelService;
+	@Autowired
+	private ZcrmViewWhqohSelService zcrmViewWhqohSelService;
 
 
 	/**
@@ -531,6 +536,9 @@ public class SalesOrderController {
 	private ZcrmViewWhqohSelService whqohService;
 	// 获取品牌 -- 接口
 
+
+
+
 	// 检查库存 -- 接口
 	/**
 	 * 仓库库存列表
@@ -585,6 +593,12 @@ public class SalesOrderController {
 	@Autowired
 	private ZcrmViewItemSelService itemService;
 
+	// TODO 增加关联接口,可以根据料品查询到库存的关联接口
+	// TODO 查询单条数据,查询列表数据【包含分页功能和不包含分页功能】
+
+
+
+
 	/**
 	 * 料品档案列表
 	 */
@@ -738,82 +752,177 @@ public class SalesOrderController {
 
 
 
-	// 用户关联品牌和商品业务接口
+	// TODO 修改这个接口---考虑关联关系和映射方式
+//	// 用户关联品牌和商品业务接口
+//	@GetMapping("/getUserLinkGoods")
+//	@ApiOperation(value = "用户关联品牌和商品业务接口", notes = "获取当前用户关联的品牌和商品信息")
+//	public R<?> getUserLinkGoods() {
+//		// 获取当前登录用户ID
+//		Long userId = AuthUtil.getUserId();
+//		System.err.println();
+//		if (userId == null) {
+//			return R.fail("未获取到登录用户信息,请先登录");
+//		}
+//
+//		//修改---重要修复   userID需要修改成CUSTOMER_ID传参
+//		R<User> user = userClient.userInfoById(userId);
+//		Long customer_id = new Long("0");
+//		if (user.getData() == null && user.getData().getCustomerId() == null) {
+//			return R.fail("用户不存在");
+//		} else {
+//			customer_id = user.getData().getCustomerId();
+//		}
+//
+//		// 构建查询条件
+//		QueryWrapper<PcBladeUserLinkGoods> queryWrapper = new QueryWrapper<>();
+//		queryWrapper.eq("CUSTOMER_ID", customer_id)
+//			.eq("is_deleted", 0);  // 先只过滤已删除状态
+//
+//		// 增加调试信息:显示当前用户ID和查询条件
+//		Map<String, Object> debugInfo = new HashMap<>();
+//		debugInfo.put("currentUserId", userId);
+//		debugInfo.put("queryCondition", queryWrapper.getEntity());
+//
+//		// 查询所有状态的关联记录(用于调试)
+//		List<PcBladeUserLinkGoods> allStatusList = pcBladeUserLinkGoodsService.list(queryWrapper);
+//		debugInfo.put("totalRecords", allStatusList.size());
+//		debugInfo.put("statusDistribution", allStatusList.stream()
+//			.collect(Collectors.groupingBy(PcBladeUserLinkGoods::getStatus, Collectors.counting())));
+//
+//		// 应用状态过滤
+//		queryWrapper.eq("status", 1);  // 只查询状态为1的记录
+//		List<PcBladeUserLinkGoods> userLinkGoodsList = pcBladeUserLinkGoodsService.list(queryWrapper);
+//
+//		if (CollectionUtils.isEmpty(userLinkGoodsList)) {
+//			// 返回调试信息帮助排查问题
+//			Map<String, Object> result = new HashMap<>();
+//			result.put("debug", debugInfo);
+//			return R.data(result, "未查询到关联的品牌和商品数据");
+//		}
+//
+//		// 收集需要查询的ID,使用Set去重
+//		Set<Long> stockIds = new HashSet<>();
+//		Set<Long> brandIds = new HashSet<>();
+//
+//		for (PcBladeUserLinkGoods linkGoods : userLinkGoodsList) {
+//			System.err.println(linkGoods);
+//			if (linkGoods.getStockDescId() != null) {
+//				stockIds.add(linkGoods.getStockDescId());
+//			}
+//			if (linkGoods.getBrandId() != null) {
+//				brandIds.add(linkGoods.getBrandId());
+//			}
+//		}
+//
+//		// 批量查询库存信息
+//		List<PjpfStockDesc> stockList = stockIds.isEmpty() ?
+//			Collections.emptyList() :
+//			stockService.listByIds(stockIds);
+//
+//		// 批量查询品牌信息
+//		List<PjpfBrandDesc> brandList = brandIds.isEmpty() ?
+//			Collections.emptyList() :
+//			brandService.listByIds(brandIds);
+//
+//		// 组装返回结果
+//		Map<String, Object> resultMap = new HashMap<>();
+//		resultMap.put("pjpfStockDescList", stockList);
+//		resultMap.put("pjpfBrandDescList", brandList);
+////		resultMap.put("debug", debugInfo);  // 包含调试信息
+//
+//		return R.data(resultMap, "获取成功");
+//	}
+
+
+
+	/**
+	 * 用户关联品牌和商品业务接口
+	 */
 	@GetMapping("/getUserLinkGoods")
 	@ApiOperation(value = "用户关联品牌和商品业务接口", notes = "获取当前用户关联的品牌和商品信息")
 	public R<?> getUserLinkGoods() {
 		// 获取当前登录用户ID
-		Long userId = AuthUtil.getUserId();
-		System.err.println();
-		if (userId == null) {
+		String userAccount = AuthUtil.getUserAccount();
+		if (userAccount == null) {
 			return R.fail("未获取到登录用户信息,请先登录");
 		}
 
-		//修改---重要修复   userID需要修改成CUSTOMER_ID传参
-		R<User> user = userClient.userInfoById(userId);
-		Long customer_id = new Long("0");
-		if (user.getData() == null && user.getData().getCustomerId() == null) {
-			return R.fail("用户不存在");
-		} else {
-			customer_id = user.getData().getCustomerId();
-		}
-
-		// 构建查询条件
-		QueryWrapper<PcBladeUserLinkGoods> queryWrapper = new QueryWrapper<>();
-		queryWrapper.eq("CUSTOMER_ID", customer_id)
-			.eq("is_deleted", 0);  // 先只过滤已删除状态
-
-		// 增加调试信息:显示当前用户ID和查询条件
-		Map<String, Object> debugInfo = new HashMap<>();
-		debugInfo.put("currentUserId", userId);
-		debugInfo.put("queryCondition", queryWrapper.getEntity());
-
-		// 查询所有状态的关联记录(用于调试)
-		List<PcBladeUserLinkGoods> allStatusList = pcBladeUserLinkGoodsService.list(queryWrapper);
-		debugInfo.put("totalRecords", allStatusList.size());
-		debugInfo.put("statusDistribution", allStatusList.stream()
-			.collect(Collectors.groupingBy(PcBladeUserLinkGoods::getStatus, Collectors.counting())));
-
-		// 应用状态过滤
-		queryWrapper.eq("status", 1);  // 只查询状态为1的记录
-		List<PcBladeUserLinkGoods> userLinkGoodsList = pcBladeUserLinkGoodsService.list(queryWrapper);
-
-		if (CollectionUtils.isEmpty(userLinkGoodsList)) {
-			// 返回调试信息帮助排查问题
-			Map<String, Object> result = new HashMap<>();
-			result.put("debug", debugInfo);
-			return R.data(result, "未查询到关联的品牌和商品数据");
-		}
-
-		// 收集需要查询的ID,使用Set去重
-		Set<Long> stockIds = new HashSet<>();
-		Set<Long> brandIds = new HashSet<>();
-
-		for (PcBladeUserLinkGoods linkGoods : userLinkGoodsList) {
-			System.err.println(linkGoods);
-			if (linkGoods.getStockDescId() != null) {
-				stockIds.add(linkGoods.getStockDescId());
-			}
-			if (linkGoods.getBrandId() != null) {
-				brandIds.add(linkGoods.getBrandId());
-			}
-		}
-
-		// 批量查询库存信息
-		List<PjpfStockDesc> stockList = stockIds.isEmpty() ?
-			Collections.emptyList() :
-			stockService.listByIds(stockIds);
-
-		// 批量查询品牌信息
-		List<PjpfBrandDesc> brandList = brandIds.isEmpty() ?
-			Collections.emptyList() :
-			brandService.listByIds(brandIds);
+		QueryWrapper<ViewCustomerSel> queryWrapper = new QueryWrapper<>();
+		queryWrapper.eq("Customer_CODE", userAccount);
+		ViewCustomerSel viewCustomerSel = zcrmViewCustomerSelService.getOne(queryWrapper);
+		if (viewCustomerSel == null) {
+			return R.fail("未查询到用户关联信息");
+		}
+		System.err.println(viewCustomerSel);
+		String pubDescSeg4Name = viewCustomerSel.getPubDescSeg4Name();
+		if (Objects.equals(pubDescSeg4Name, "") || pubDescSeg4Name == null) {
+			Map<String, Object> resultMap1 = new HashMap<>();
+			resultMap1.put("pjpfStockDescList", new ArrayList<>());
+			resultMap1.put("pjpfBrandDescList", new ArrayList<>());
+			return R.data(resultMap1, "获取成功");
+		}
+		System.err.println(pubDescSeg4Name);
+		// 按逗号分割成数组(处理null或空字符串)
+		String[] codeArray = pubDescSeg4Name != null && !pubDescSeg4Name.isEmpty()
+			? pubDescSeg4Name.split(";")
+			: new String[0];
+
+		// 查询料品档案并映射为品牌列表
+		QueryWrapper<ViewItemSel> itemQuery = new QueryWrapper<>();
+		itemQuery.in(codeArray.length > 0, "PubDescSeg4_Name", codeArray);
+		List<ViewItemSel> viewItemSelList = zcrmViewItemSelService.list(itemQuery);
+		System.err.println("料品档案查询结果数量:" + viewItemSelList.size());
+		if (viewItemSelList.isEmpty()) {
+			System.err.println("料品档案无匹配数据,查询条件:" + Arrays.toString(codeArray));
+		}
+		List<PjpfBrandDesc> brandList = viewItemSelList.stream().map(item -> {
+			PjpfBrandDesc brand = new PjpfBrandDesc();
+			brand.setId(item.getItemId());
+			brand.setTenantId(String.valueOf(item.getOrgId()));
+			brand.setCname(item.getItemName());
+			brand.setSalesCompanyId(item.getOrgId());
+			brand.setSalesCompanyName(item.getOrgName());
+			brand.setType(item.getMainItemCategoryCode());
+			// 可根据实际业务补充其他字段(如启用状态默认0启用)
+			brand.setEnableOrNot(0);
+			return brand;
+		}).collect(Collectors.toList());
+
+		String[] codeArray1 = new String[viewItemSelList.size()];
+		for (int i = 0; i < viewItemSelList.size(); i++) {
+			codeArray1[i] = viewItemSelList.get(i).getItemCode();
+		}
+
+		// 查询库存视图并映射为库存列表
+		QueryWrapper<ViewWhqohSel> stockQuery = new QueryWrapper<>();
+		stockQuery.in(codeArray.length > 0, "Item_Code", codeArray1);
+		List<ViewWhqohSel> viewWhqohSelList = zcrmViewWhqohSelService.list(stockQuery);
+		System.err.println("库存视图查询结果数量:" + viewWhqohSelList.size());
+		if (viewWhqohSelList.isEmpty()) {
+			System.err.println("库存视图无匹配数据,查询条件:" + Arrays.toString(codeArray1));
+		}
+		List<PjpfStockDesc> stockList = viewWhqohSelList.stream().map(whqoh -> {
+			PjpfStockDesc stock = new PjpfStockDesc();
+			stock.setId(whqoh.getItemId());
+			stock.setTenantId(String.valueOf(whqoh.getOrgId()));
+			stock.setStorageId(whqoh.getWarehouseId());
+			stock.setStorageName(whqoh.getWarehouseName());
+			stock.setGoodsId(whqoh.getItemId());
+			stock.setCode(whqoh.getItemCode());
+			stock.setCname(whqoh.getItemName());
+			stock.setTypeNo(whqoh.getItemPecs());
+			stock.setProductDescription(whqoh.getItemDescription());
+			stock.setSalesCompanyId(whqoh.getOrgId());
+			stock.setSalesCompanyName(whqoh.getOrgName());
+			stock.setBalanceQuantity(whqoh.getStoreQty());
+			stock.setStoreInventory(whqoh.getStoreQty());
+			return stock;
+		}).collect(Collectors.toList());
 
 		// 组装返回结果
 		Map<String, Object> resultMap = new HashMap<>();
 		resultMap.put("pjpfStockDescList", stockList);
 		resultMap.put("pjpfBrandDescList", brandList);
-//		resultMap.put("debug", debugInfo);  // 包含调试信息
 
 		return R.data(resultMap, "获取成功");
 	}
@@ -821,8 +930,4 @@ public class SalesOrderController {
 
 
 
-
-
-
-
 }

+ 0 - 19
blade-service/blade-factory/src/main/java/org/springblade/factory/api/controller/SurveyController.java

@@ -21,23 +21,4 @@ import org.springframework.web.bind.annotation.RestController;
 @AllArgsConstructor
 public class SurveyController {
 
-
-	/**
-	 * 获取文件调查列表
-	 * @return
-	 */
-//	@GetMapping("/getCustomerInfo")
-//	public R<ViewCustomerSel> getCustomerInfo() {
-//
-//
-//
-//
-//
-//	}
-
-
-
-
-
-
 }

+ 1 - 2
blade-service/blade-factory/src/main/java/org/springblade/factory/service/impl/PcBladeSalesForecastMainServiceImpl.java

@@ -417,8 +417,7 @@ public class PcBladeSalesForecastMainServiceImpl extends BaseServiceImpl<PcBlade
 		QueryWrapper<PcBladeSalesForecastMain> queryWrapper = new QueryWrapper<>();
 		queryWrapper.eq("year", year)
 			.eq("month", month)
-			.eq("customer_id", customerId);
-
+			.eq("CUSTOMER_ID", customerId);
 		// 存在相同条件的主表记录则返回true
 		return baseMapper.selectCount(queryWrapper) > 0;
 	}

+ 3 - 15
blade-service/blade-u9cloud/src/main/java/org/springblade/u9cloud/config/FeignConfig.java

@@ -1,23 +1,11 @@
 package org.springblade.u9cloud.config;
 
-import org.springblade.core.tool.api.R;
-import org.springblade.u9cloud.entity.ZcrmViewCustomerSel;
-import org.springblade.u9cloud.feign.IZcrmViewCustomerSel;
-import org.springframework.context.annotation.Bean;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.annotation.Configuration;
 
 @Configuration
+@Slf4j
 public class FeignConfig {
 
-	// 手动创建Feign接口的Bean(实际项目中不推荐,应让Feign自动生成)
-//	@Bean
-//	public IZcrmViewCustomerSel zcrmViewCustomerSel() {
-//		// 返回一个模拟实现(仅用于测试,避免启动报错)
-//		return new IZcrmViewCustomerSel() {
-//			@Override
-//			public R<String> u9cloudAdd(ZcrmViewCustomerSel zcrmViewCustomerSel) {
-//				return R.data("模拟返回结果");
-//			}
-//		};
-//	}
+
 }