Browse Source

2024年4月2日17:43:46

纪新园 1 year ago
parent
commit
1b4c105623

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

@@ -295,5 +295,16 @@ public class PjCorpsDesc implements Serializable {
 	 */
 	@ApiModelProperty(value = "额度")
 	private BigDecimal limitAmount;
+	/**
+	 * 品牌
+	 */
+	@ApiModelProperty(value = "品牌")
+	private String brandId;
+
+	/**
+	 * 品牌
+	 */
+	@ApiModelProperty(value = "品牌")
+	private String brandName;
 
 }

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

@@ -0,0 +1,65 @@
+package org.springblade.los.business.sea.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.core.tool.api.R;
+import org.springblade.los.business.sea.entity.Bills;
+import org.springblade.los.business.sea.entity.Containers;
+import org.springblade.los.business.sea.service.ITemplateImportService;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * 业务-海运进出口接口
+ *
+ * @author :jixinyuan
+ * @date : 2024/4/2
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/templateImport")
+@Api(value = "业务-海运出口模版导入", tags = "业务-海运出口模版导入")
+public class HYCKTemplateImportController {
+
+	private final ITemplateImportService templateImportService;
+
+	/**
+	 * 海运出口模版导入(ONE样本模板)
+	 */
+	@GetMapping("/importOne")
+	public R<Bills> importHYCK(@RequestParam("file") MultipartFile file) throws Exception {
+		return templateImportService.importOne(file);
+	}
+
+	/**
+	 * 海运出口模版导入(PIL订舱)
+	 */
+	@GetMapping("/importPilBooking")
+	public R<Bills> importPilBooking(@RequestParam("file") MultipartFile file) throws Exception {
+		return templateImportService.importPilBooking(file);
+	}
+
+	/**
+	 * 海运出口模版导入(PIL截单)
+	 */
+	@GetMapping("/importPilCutOffOrders")
+	public R<Bills> importPilCutOffOrders(@RequestParam("file") MultipartFile file) throws Exception {
+		return templateImportService.importPilCutOffOrders(file);
+	}
+
+	/**
+	 * 海运出口模版导入(海信组)
+	 */
+	@GetMapping("/importHisense")
+	public R<List<Containers>> importHisense(@RequestParam("file") MultipartFile file) throws Exception {
+		return templateImportService.importHisense(file);
+	}
+
+}

+ 43 - 0
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/ITemplateImportService.java

@@ -0,0 +1,43 @@
+/*
+ *      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.los.business.sea.service;
+
+import org.springblade.core.tool.api.R;
+import org.springblade.los.basic.cntr.entity.BCntrTypes;
+import org.springblade.los.business.sea.entity.Bills;
+import org.springblade.los.business.sea.entity.Containers;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * 业务-海运进出口接口 服务类
+ *
+ * @author BladeX
+ * @date : 2024/4/2
+ */
+public interface ITemplateImportService {
+
+
+	R<Bills> importOne(MultipartFile file)throws Exception;
+
+	R<Bills> importPilBooking(MultipartFile file)throws Exception ;
+
+	R<Bills> importPilCutOffOrders(MultipartFile file)throws Exception ;
+
+	R<List<Containers>> importHisense(MultipartFile file)throws Exception ;
+}

+ 907 - 0
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/TemplateImportServiceImpl.java

@@ -0,0 +1,907 @@
+package org.springblade.los.business.sea.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import lombok.AllArgsConstructor;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.springblade.core.tool.api.R;
+import org.springblade.los.business.sea.entity.Bills;
+import org.springblade.los.business.sea.entity.Containers;
+import org.springblade.los.business.sea.service.ITemplateImportService;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.FileInputStream;
+import java.math.BigDecimal;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardCopyOption;
+import java.util.List;
+
+/**
+ * @author :jixinyuan
+ * @date : 2024/4/2
+ */
+@Service
+@AllArgsConstructor
+public class TemplateImportServiceImpl implements ITemplateImportService {
+
+
+	@Override
+	public R<Bills> importOne(MultipartFile file) throws Exception {
+		Bills bills = new Bills();
+		// 创建临时文件
+		Path tempFile = Files.createTempFile("prefix", "suffix");
+		// 将MultipartFile的内容复制到临时文件
+		Files.copy(file.getInputStream(), tempFile, StandardCopyOption.REPLACE_EXISTING);
+
+		// 创建FileInputStream来读取临时文件
+		FileInputStream fis = new FileInputStream(tempFile.toFile());
+		Workbook workbook = new HSSFWorkbook(fis);
+		Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表
+
+		//TO
+		if (ObjectUtils.isNotNull(sheet.getRow(1).getCell(1))) {
+			String to = sheet.getRow(1).getCell(1).getStringCellValue();
+			System.out.println("TO:" + to);
+		}
+		//ATTN
+		if (ObjectUtils.isNotNull(sheet.getRow(2).getCell(1))) {
+			String attn = sheet.getRow(2).getCell(1).getStringCellValue();
+			System.out.println("attn:" + attn);
+		}
+		//SHIPPER
+		StringBuilder shipper = new StringBuilder();
+		for (int i = 3; i <= 7; i++) {
+			if (ObjectUtils.isNotNull(sheet.getRow(i).getCell(1))) {
+				shipper.append(sheet.getRow(i).getCell(1).getStringCellValue());
+			}
+		}
+		if (ObjectUtils.isNotNull(shipper)) {
+			bills.setHshipperDetails(shipper.toString());
+			System.out.println("shipper:" + shipper);
+		} else {
+			throw new RuntimeException("发货人提单描述不能为空");
+		}
+		//CONSIGNEE
+		StringBuilder consignee = new StringBuilder();
+		for (int i = 8; i <= 12; i++) {
+			if (ObjectUtils.isNotNull(sheet.getRow(i).getCell(1))) {
+				consignee.append(sheet.getRow(i).getCell(1).getStringCellValue());
+			}
+		}
+		if (ObjectUtils.isNotNull(consignee)) {
+			bills.setHconsigneeDetails(consignee.toString());
+			System.out.println("consignee:" + consignee);
+		} else {
+			throw new RuntimeException("收货人提单描述不能为空");
+		}
+		//NOTIFY PARTY
+		StringBuilder notifyParty = new StringBuilder();
+		for (int i = 13; i <= 17; i++) {
+			if (ObjectUtils.isNotNull(sheet.getRow(i).getCell(1))) {
+				notifyParty.append(sheet.getRow(i).getCell(1).getStringCellValue());
+			}
+		}
+		if (ObjectUtils.isNotNull(notifyParty)) {
+			bills.setHnotifyDetails(notifyParty.toString());
+			System.out.println("notifyParty:" + notifyParty);
+		} else {
+			throw new RuntimeException("通知人提单描述不能为空");
+		}
+		//B/L NO
+		if (ObjectUtils.isNotNull(sheet.getRow(18).getCell(1))) {
+			String blno = sheet.getRow(18).getCell(1).getStringCellValue();
+			System.out.println("blno:" + blno);
+			bills.setMblno(blno);
+		} else {
+			throw new RuntimeException("提单号不能为空");
+		}
+		//VSL/VOY
+		if (ObjectUtils.isNotNull(sheet.getRow(18).getCell(4))) {
+			String vslVoy = sheet.getRow(18).getCell(4).getStringCellValue();
+			if (vslVoy.contains("/")) {
+				String vsl = vslVoy.substring(0, vslVoy.indexOf("/"));
+				String voy = vslVoy.substring(vslVoy.indexOf("/"));
+				bills.setVesselEnName(vsl);
+				bills.setVoyageNo(voy);
+				System.out.println("vsl:" + vsl);
+				System.out.println("voy:" + voy);
+				System.out.println("vslVoy:" + vslVoy);
+			} else {
+				throw new RuntimeException("船名航次不能为空");
+			}
+		} else {
+			throw new RuntimeException("船名航次不能为空");
+		}
+		//POR
+		if (ObjectUtils.isNotNull(sheet.getRow(19).getCell(1))) {
+			String por = sheet.getRow(19).getCell(1).getStringCellValue();
+			System.out.println("por:" + por);
+			bills.setPlaceReceiptName(por);
+		} else {
+			throw new RuntimeException("收货港不能为空");
+		}
+		//POL
+		if (ObjectUtils.isNotNull(sheet.getRow(19).getCell(4))) {
+			String pol = sheet.getRow(19).getCell(4).getStringCellValue();
+			System.out.println("pol:" + pol);
+			bills.setPolEnName(pol);
+		} else {
+			throw new RuntimeException("装运港不能为空");
+		}
+		//POD
+		if (ObjectUtils.isNotNull(sheet.getRow(20).getCell(1))) {
+			String pod = sheet.getRow(20).getCell(1).getStringCellValue();
+			System.out.println("pod:" + pod);
+			bills.setPodEnName(pod);
+		} else {
+			throw new RuntimeException("卸货港不能为空");
+		}
+		//PLACE OF DELIVERY
+		if (ObjectUtils.isNotNull(sheet.getRow(20).getCell(4))) {
+			String placeOfDelivery = sheet.getRow(20).getCell(4).getStringCellValue();
+			System.out.println("placeOfDelivery:" + placeOfDelivery);
+			bills.setDestinationName(placeOfDelivery);
+		} else {
+			throw new RuntimeException("目的港不能为空");
+		}
+		//KIND OF B/L
+		if (ObjectUtils.isNotNull(sheet.getRow(21).getCell(1))) {
+			String kindOfBl = sheet.getRow(21).getCell(1).getStringCellValue();
+			System.out.println("kindOfBl:" + kindOfBl);
+			bills.setIssueType(kindOfBl);
+		} else {
+			throw new RuntimeException("签单方式不能为空");
+		}
+		//PAYMODE
+		if (ObjectUtils.isNotNull(sheet.getRow(21).getCell(4))) {
+			String payMode = sheet.getRow(21).getCell(4).getStringCellValue();
+			System.out.println("payMode:" + payMode);
+			bills.setHpaymode(payMode);
+		} else {
+			throw new RuntimeException("运费支付方式不能为空");
+		}
+		//PLACE OF ISSUE
+		if (ObjectUtils.isNotNull(sheet.getRow(22).getCell(1))) {
+			String placeOfIssue = sheet.getRow(22).getCell(1).getStringCellValue();
+			System.out.println("placeOfIssue:" + placeOfIssue);
+			bills.setIssueAt(placeOfIssue);
+		} else {
+			throw new RuntimeException("签单地不能为空");
+		}
+		//FREIGHT PAYABLE AT
+		if (ObjectUtils.isNotNull(sheet.getRow(22).getCell(4))) {
+			String freightPayAbleAt = sheet.getRow(22).getCell(4).getStringCellValue();
+			System.out.println("freightPayAbleAt:" + freightPayAbleAt);
+			bills.setHpayplace(freightPayAbleAt);
+		} else {
+			throw new RuntimeException("付费地不能为空");
+		}
+		//CONTRACTNO
+		if (ObjectUtils.isNotNull(sheet.getRow(23).getCell(1))) {
+			String contractno = sheet.getRow(23).getCell(1).getStringCellValue();
+			System.out.println("contractno:" + contractno);
+			bills.setCorpArgreementNo(contractno);
+		} else {
+			throw new RuntimeException("约号不能为空");
+		}
+		//VOLUME
+		if (ObjectUtils.isNotNull(sheet.getRow(23).getCell(4))) {
+			String volume = sheet.getRow(23).getCell(4).getStringCellValue();
+			System.out.println("volume:" + volume);
+			bills.setQuantityCntrDescr(volume);
+		} else {
+			throw new RuntimeException("箱型箱量不能为空");
+		}
+		//MARKS
+		StringBuilder marks = new StringBuilder();
+		for (int i = 25; i <= 46; i++) {
+			if (ObjectUtils.isNotNull(sheet.getRow(i).getCell(0))) {
+				marks.append(sheet.getRow(i).getCell(0).getStringCellValue());
+			}
+		}
+		if (ObjectUtils.isNotNull(marks)) {
+			System.out.println("marks:" + marks);
+			bills.setMarks(marks.toString());
+		} else {
+			throw new RuntimeException("唛头不能为空");
+		}
+		//BAGS
+		if (ObjectUtils.isNotNull(sheet.getRow(25).getCell(1))) {
+			double bags = sheet.getRow(25).getCell(1).getNumericCellValue();
+			System.out.println("bags:" + bags);
+			bills.setQuantity(new BigDecimal(bags));
+		} else {
+			throw new RuntimeException("件数不能为空");
+		}
+		//DESCRIPTION
+		StringBuilder description = new StringBuilder();
+		for (int i = 25; i <= 46; i++) {
+			if (ObjectUtils.isNotNull(sheet.getRow(i).getCell(2))) {
+				description.append(sheet.getRow(i).getCell(2).getStringCellValue());
+			}
+		}
+		if (ObjectUtils.isNotNull(description)) {
+			System.out.println("description:" + description);
+			bills.setCommodityDescr(description.toString());
+		} else {
+			throw new RuntimeException("提单上货物描述不能为空");
+		}
+		//G.W.
+		if (ObjectUtils.isNotNull(sheet.getRow(25).getCell(4))) {
+			double gw = sheet.getRow(25).getCell(4).getNumericCellValue();
+			System.out.println("gw:" + gw);
+			bills.setGrossWeight(new BigDecimal(gw));
+		} else {
+			throw new RuntimeException("毛重不能为空");
+		}
+		//MEAS
+		if (ObjectUtils.isNotNull(sheet.getRow(25).getCell(6))) {
+			double meas = sheet.getRow(25).getCell(6).getNumericCellValue();
+			System.out.println("meas:" + meas);
+			bills.setMeasurement(new BigDecimal(meas));
+		} else {
+			throw new RuntimeException("体积不能为空");
+		}
+		//REMARK
+		StringBuilder remark = new StringBuilder();
+		for (int i = 47; i <= 50; i++) {
+			if (ObjectUtils.isNotNull(sheet.getRow(i).getCell(1))) {
+				remark.append(sheet.getRow(i).getCell(1).getStringCellValue());
+			}
+		}
+		if (ObjectUtils.isNotNull(remark)) {
+			System.out.println("remark:" + remark);
+			bills.setRemarks(remark.toString());
+		}
+		//FINAL DESTINATION FOR THE MERCHANT’S REFERENCE
+		if (ObjectUtils.isNotNull(sheet.getRow(51).getCell(4))) {
+			String finalDestination = sheet.getRow(51).getCell(4).getStringCellValue();
+			System.out.println("finalDestination:" + finalDestination);
+			bills.setFinalDestinationName(finalDestination);
+		}
+
+		/*for (int i = 0; i <= sheet.getLastRowNum(); i++) {
+			String rowStr = "";
+			//循环获取sheet页的每一行
+			Row row = sheet.getRow(i);
+			//循环每一行的每一个单元格
+			for (int l = 0; l <= 6; l++) {
+				//判断是否是合并单元格并返回值
+				String value = getValue(sheet, i, row.getCell(l).getColumnIndex());
+				//数值为空说明不是合并单元格或者当前单元格为空,则直接获取当前单元格值
+				if ("".equals(value)) {
+					if (ObjectUtils.isNull(row.getCell(l))) {
+						value = "";
+					} else {
+						CellType cellType = row.getCell(l).getCellTypeEnum();
+						switch (cellType.name()) {
+							case "STRING":
+								value = row.getCell(l).getStringCellValue();
+								// 处理字符串类型的值
+								break;
+							case "NUMERIC":
+								value = row.getCell(l).getNumericCellValue() + "";
+								// 处理数字类型的值
+								break;
+							case "FORMULA":
+								value = row.getCell(l).getNumericCellValue() + "";
+								// 处理数字类型的值
+								break;
+							case "_NONE":
+								value = "";
+								// 处理数字类型的值
+								break;
+							case "BLANK":
+								value = "";
+								// 处理数字类型的值
+								break;
+							case "BOOLEAN":
+								value = "";
+								// 处理数字类型的值
+								break;
+							case "ERROR":
+								value = "";
+								// 处理数字类型的值
+								break;
+							// 可以添加其他类型的处理
+							default:
+								System.out.println("cellType:" + cellType.name());
+								throw new RuntimeException("数据类型错误");
+						}
+					}
+				}
+				rowStr += "--" + value;
+			}
+			for (Cell cell : row) {
+				//判断是否是合并单元格并返回值
+				String value = getValue(sheet, i, cell.getColumnIndex());
+				//数值为空说明不是合并单元格或者当前单元格为空,则直接获取当前单元格值
+				if("".equals(value)){
+					value=cell.getStringCellValue();
+				}
+				rowStr+="--"+value;
+			}*/
+		return R.data(bills);
+	}
+
+	@Override
+	public R<Bills> importPilBooking(MultipartFile file) throws Exception {
+		Bills bills = new Bills();
+		// 创建临时文件
+		Path tempFile = Files.createTempFile("prefix", "suffix");
+		// 将MultipartFile的内容复制到临时文件
+		Files.copy(file.getInputStream(), tempFile, StandardCopyOption.REPLACE_EXISTING);
+
+		// 创建FileInputStream来读取临时文件
+		FileInputStream fis = new FileInputStream(tempFile.toFile());
+		Workbook workbook = new HSSFWorkbook(fis);
+		Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表
+
+		//SHIPPER
+		if (ObjectUtils.isNotNull(sheet.getRow(2).getCell(0))) {
+			String shipper = sheet.getRow(2).getCell(0).getStringCellValue();
+			bills.setHshipperDetails(shipper);
+			System.out.println("shipper:" + shipper);
+		} else {
+			throw new RuntimeException("托运人不能为空");
+		}
+		//CONSIGNEE
+		if (ObjectUtils.isNotNull(sheet.getRow(9).getCell(0))) {
+			String consignee = sheet.getRow(9).getCell(0).getStringCellValue();
+			bills.setHconsigneeDetails(consignee);
+			System.out.println("consignee:" + consignee);
+		} else {
+			throw new RuntimeException("收货人不能为空");
+		}
+		//NOTIFY PARTY
+		if (ObjectUtils.isNotNull(sheet.getRow(16).getCell(0))) {
+			String notifyParty = sheet.getRow(16).getCell(0).getStringCellValue();
+			bills.setHnotifyDetails(notifyParty);
+			System.out.println("notifyParty:" + notifyParty);
+		} else {
+			throw new RuntimeException("通知人不能为空");
+		}
+		//VSL/VOY
+		if (ObjectUtils.isNotNull(sheet.getRow(24).getCell(0))) {
+			String vslVoy = sheet.getRow(24).getCell(0).getStringCellValue();
+			if (vslVoy.contains("/")) {
+				String vsl = vslVoy.substring(0, vslVoy.indexOf("/"));
+				String voy = vslVoy.substring(vslVoy.indexOf("/"));
+				bills.setVesselEnName(vsl);
+				bills.setVoyageNo(voy);
+				System.out.println("vsl:" + vsl);
+				System.out.println("voy:" + voy);
+				System.out.println("vslVoy:" + vslVoy);
+			} else {
+				throw new RuntimeException("船名或船期不能为空");
+			}
+		} else {
+			throw new RuntimeException("船名或船期不能为空");
+		}
+		//POL
+		if (ObjectUtils.isNotNull(sheet.getRow(24).getCell(3))) {
+			String pol = sheet.getRow(24).getCell(3).getStringCellValue();
+			System.out.println("pol:" + pol);
+			bills.setPolEnName(pol);
+		} else {
+			throw new RuntimeException("装货港不能为空");
+		}
+		//POD
+		if (ObjectUtils.isNotNull(sheet.getRow(24).getCell(5))) {
+			String pod = sheet.getRow(24).getCell(5).getStringCellValue();
+			System.out.println("pod:" + pod);
+			bills.setPodEnName(pod);
+		} else {
+			throw new RuntimeException("卸货港不能为空");
+		}
+		//POR
+		if (ObjectUtils.isNotNull(sheet.getRow(26).getCell(0))) {
+			String por = sheet.getRow(26).getCell(0).getStringCellValue();
+			System.out.println("por:" + por);
+			bills.setPlaceReceiptName(por);
+		} else {
+			throw new RuntimeException("收货港不能为空");
+		}
+		//PLACE OF DELIVERY
+		if (ObjectUtils.isNotNull(sheet.getRow(26).getCell(3))) {
+			String placeOfDelivery = sheet.getRow(26).getCell(3).getStringCellValue();
+			System.out.println("placeOfDelivery:" + placeOfDelivery);
+			bills.setDestinationName(placeOfDelivery);
+		} else {
+			throw new RuntimeException("交货地不能为空");
+		}
+		//B/L NO
+		if (ObjectUtils.isNotNull(sheet.getRow(26).getCell(5))) {
+			String blno = sheet.getRow(26).getCell(5).getStringCellValue();
+			System.out.println("blno:" + blno);
+			bills.setMblno(blno);
+		} else {
+			throw new RuntimeException("提单号不能为空");
+		}
+		//KIND OF B/L
+		if (ObjectUtils.isNotNull(sheet.getRow(21).getCell(1))) {
+			String kindOfBl = sheet.getRow(21).getCell(1).getStringCellValue();
+			System.out.println("kindOfBl:" + kindOfBl);
+			bills.setIssueType(kindOfBl);
+		} else {
+			throw new RuntimeException("签单方式不能为空");
+		}
+		//PAYMODE
+		if (ObjectUtils.isNotNull(sheet.getRow(21).getCell(4))) {
+			String payMode = sheet.getRow(21).getCell(4).getStringCellValue();
+			System.out.println("payMode:" + payMode);
+			bills.setHpaymode(payMode);
+		} else {
+			throw new RuntimeException("运费支付方式不能为空");
+		}
+		//PLACE OF ISSUE
+		if (ObjectUtils.isNotNull(sheet.getRow(22).getCell(1))) {
+			String placeOfIssue = sheet.getRow(22).getCell(1).getStringCellValue();
+			System.out.println("placeOfIssue:" + placeOfIssue);
+			bills.setIssueAt(placeOfIssue);
+		} else {
+			throw new RuntimeException("签单地不能为空");
+		}
+		//FREIGHT PAYABLE AT
+		if (ObjectUtils.isNotNull(sheet.getRow(22).getCell(4))) {
+			String freightPayAbleAt = sheet.getRow(22).getCell(4).getStringCellValue();
+			System.out.println("freightPayAbleAt:" + freightPayAbleAt);
+			bills.setHpayplace(freightPayAbleAt);
+		} else {
+			throw new RuntimeException("付费地不能为空");
+		}
+		//CONTRACTNO
+		if (ObjectUtils.isNotNull(sheet.getRow(23).getCell(1))) {
+			String contractno = sheet.getRow(23).getCell(1).getStringCellValue();
+			System.out.println("contractno:" + contractno);
+			bills.setCorpArgreementNo(contractno);
+		} else {
+			throw new RuntimeException("约号不能为空");
+		}
+		//VOLUME
+		if (ObjectUtils.isNotNull(sheet.getRow(23).getCell(4))) {
+			String volume = sheet.getRow(23).getCell(4).getStringCellValue();
+			System.out.println("volume:" + volume);
+			bills.setQuantityCntrDescr(volume);
+		} else {
+			throw new RuntimeException("箱型箱量不能为空");
+		}
+		//MARKS
+		StringBuilder marks = new StringBuilder();
+		for (int i = 25; i <= 46; i++) {
+			if (ObjectUtils.isNotNull(sheet.getRow(i).getCell(0))) {
+				marks.append(sheet.getRow(i).getCell(0).getStringCellValue());
+			}
+		}
+		if (ObjectUtils.isNotNull(marks)) {
+			System.out.println("marks:" + marks);
+			bills.setMarks(marks.toString());
+		} else {
+			throw new RuntimeException("唛头不能为空");
+		}
+		//BAGS
+		if (ObjectUtils.isNotNull(sheet.getRow(25).getCell(1))) {
+			double bags = sheet.getRow(25).getCell(1).getNumericCellValue();
+			System.out.println("bags:" + bags);
+			bills.setQuantity(new BigDecimal(bags));
+		} else {
+			throw new RuntimeException("件数不能为空");
+		}
+		//DESCRIPTION
+		StringBuilder description = new StringBuilder();
+		for (int i = 25; i <= 46; i++) {
+			if (ObjectUtils.isNotNull(sheet.getRow(i).getCell(2))) {
+				description.append(sheet.getRow(i).getCell(2).getStringCellValue());
+			}
+		}
+		if (ObjectUtils.isNotNull(description)) {
+			System.out.println("description:" + description);
+			bills.setCommodityDescr(description.toString());
+		} else {
+			throw new RuntimeException("提单上货物描述不能为空");
+		}
+		//G.W.
+		if (ObjectUtils.isNotNull(sheet.getRow(25).getCell(4))) {
+			double gw = sheet.getRow(25).getCell(4).getNumericCellValue();
+			System.out.println("gw:" + gw);
+			bills.setGrossWeight(new BigDecimal(gw));
+		} else {
+			throw new RuntimeException("毛重不能为空");
+		}
+		//MEAS
+		if (ObjectUtils.isNotNull(sheet.getRow(25).getCell(6))) {
+			double meas = sheet.getRow(25).getCell(6).getNumericCellValue();
+			System.out.println("meas:" + meas);
+			bills.setMeasurement(new BigDecimal(meas));
+		} else {
+			throw new RuntimeException("体积不能为空");
+		}
+		//REMARK
+		StringBuilder remark = new StringBuilder();
+		for (int i = 47; i <= 50; i++) {
+			if (ObjectUtils.isNotNull(sheet.getRow(i).getCell(1))) {
+				remark.append(sheet.getRow(i).getCell(1).getStringCellValue());
+			}
+		}
+		if (ObjectUtils.isNotNull(remark)) {
+			System.out.println("remark:" + remark);
+			bills.setRemarks(remark.toString());
+		}
+		//FINAL DESTINATION FOR THE MERCHANT’S REFERENCE
+		if (ObjectUtils.isNotNull(sheet.getRow(51).getCell(4))) {
+			String finalDestination = sheet.getRow(51).getCell(4).getStringCellValue();
+			System.out.println("finalDestination:" + finalDestination);
+			bills.setFinalDestinationName(finalDestination);
+		}
+
+		/*for (int i = 0; i <= sheet.getLastRowNum(); i++) {
+			String rowStr = "";
+			//循环获取sheet页的每一行
+			Row row = sheet.getRow(i);
+			//循环每一行的每一个单元格
+			for (int l = 0; l <= 6; l++) {
+				//判断是否是合并单元格并返回值
+				String value = getValue(sheet, i, row.getCell(l).getColumnIndex());
+				//数值为空说明不是合并单元格或者当前单元格为空,则直接获取当前单元格值
+				if ("".equals(value)) {
+					if (ObjectUtils.isNull(row.getCell(l))) {
+						value = "";
+					} else {
+						CellType cellType = row.getCell(l).getCellTypeEnum();
+						switch (cellType.name()) {
+							case "STRING":
+								value = row.getCell(l).getStringCellValue();
+								// 处理字符串类型的值
+								break;
+							case "NUMERIC":
+								value = row.getCell(l).getNumericCellValue() + "";
+								// 处理数字类型的值
+								break;
+							case "FORMULA":
+								value = row.getCell(l).getNumericCellValue() + "";
+								// 处理数字类型的值
+								break;
+							case "_NONE":
+								value = "";
+								// 处理数字类型的值
+								break;
+							case "BLANK":
+								value = "";
+								// 处理数字类型的值
+								break;
+							case "BOOLEAN":
+								value = "";
+								// 处理数字类型的值
+								break;
+							case "ERROR":
+								value = "";
+								// 处理数字类型的值
+								break;
+							// 可以添加其他类型的处理
+							default:
+								System.out.println("cellType:" + cellType.name());
+								throw new RuntimeException("数据类型错误");
+						}
+					}
+				}
+				rowStr += "--" + value;
+			}
+			for (Cell cell : row) {
+				//判断是否是合并单元格并返回值
+				String value = getValue(sheet, i, cell.getColumnIndex());
+				//数值为空说明不是合并单元格或者当前单元格为空,则直接获取当前单元格值
+				if("".equals(value)){
+					value=cell.getStringCellValue();
+				}
+				rowStr+="--"+value;
+			}*/
+		return R.data(bills);
+	}
+
+	@Override
+	public R<Bills> importPilCutOffOrders(MultipartFile file) throws Exception {
+		Bills bills = new Bills();
+		// 创建临时文件
+		Path tempFile = Files.createTempFile("prefix", "suffix");
+		// 将MultipartFile的内容复制到临时文件
+		Files.copy(file.getInputStream(), tempFile, StandardCopyOption.REPLACE_EXISTING);
+
+		// 创建FileInputStream来读取临时文件
+		FileInputStream fis = new FileInputStream(tempFile.toFile());
+		Workbook workbook = new HSSFWorkbook(fis);
+		Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表
+
+		//TO
+		if (ObjectUtils.isNotNull(sheet.getRow(1).getCell(1))) {
+			String to = sheet.getRow(1).getCell(1).getStringCellValue();
+			System.out.println("TO:" + to);
+		}
+		//ATTN
+		if (ObjectUtils.isNotNull(sheet.getRow(2).getCell(1))) {
+			String attn = sheet.getRow(2).getCell(1).getStringCellValue();
+			System.out.println("attn:" + attn);
+		}
+		//SHIPPER
+		StringBuilder shipper = new StringBuilder();
+		for (int i = 3; i <= 7; i++) {
+			if (ObjectUtils.isNotNull(sheet.getRow(i).getCell(1))) {
+				shipper.append(sheet.getRow(i).getCell(1).getStringCellValue());
+			}
+		}
+		if (ObjectUtils.isNotNull(shipper)) {
+			bills.setHshipperDetails(shipper.toString());
+			System.out.println("shipper:" + shipper);
+		} else {
+			throw new RuntimeException("发货人提单描述不能为空");
+		}
+		//CONSIGNEE
+		StringBuilder consignee = new StringBuilder();
+		for (int i = 8; i <= 12; i++) {
+			if (ObjectUtils.isNotNull(sheet.getRow(i).getCell(1))) {
+				consignee.append(sheet.getRow(i).getCell(1).getStringCellValue());
+			}
+		}
+		if (ObjectUtils.isNotNull(consignee)) {
+			bills.setHconsigneeDetails(consignee.toString());
+			System.out.println("consignee:" + consignee);
+		} else {
+			throw new RuntimeException("收货人提单描述不能为空");
+		}
+		//NOTIFY PARTY
+		StringBuilder notifyParty = new StringBuilder();
+		for (int i = 13; i <= 17; i++) {
+			if (ObjectUtils.isNotNull(sheet.getRow(i).getCell(1))) {
+				notifyParty.append(sheet.getRow(i).getCell(1).getStringCellValue());
+			}
+		}
+		if (ObjectUtils.isNotNull(notifyParty)) {
+			bills.setHnotifyDetails(notifyParty.toString());
+			System.out.println("notifyParty:" + notifyParty);
+		} else {
+			throw new RuntimeException("通知人提单描述不能为空");
+		}
+		//B/L NO
+		if (ObjectUtils.isNotNull(sheet.getRow(18).getCell(1))) {
+			String blno = sheet.getRow(18).getCell(1).getStringCellValue();
+			System.out.println("blno:" + blno);
+			bills.setMblno(blno);
+		} else {
+			throw new RuntimeException("提单号不能为空");
+		}
+		//VSL/VOY
+		if (ObjectUtils.isNotNull(sheet.getRow(18).getCell(4))) {
+			String vslVoy = sheet.getRow(18).getCell(4).getStringCellValue();
+			if (vslVoy.contains("/")) {
+				String vsl = vslVoy.substring(0, vslVoy.indexOf("/"));
+				String voy = vslVoy.substring(vslVoy.indexOf("/"));
+				bills.setVesselEnName(vsl);
+				bills.setVoyageNo(voy);
+				System.out.println("vsl:" + vsl);
+				System.out.println("voy:" + voy);
+				System.out.println("vslVoy:" + vslVoy);
+			} else {
+				throw new RuntimeException("船名航次不能为空");
+			}
+		} else {
+			throw new RuntimeException("船名航次不能为空");
+		}
+		//POR
+		if (ObjectUtils.isNotNull(sheet.getRow(19).getCell(1))) {
+			String por = sheet.getRow(19).getCell(1).getStringCellValue();
+			System.out.println("por:" + por);
+			bills.setPlaceReceiptName(por);
+		} else {
+			throw new RuntimeException("收货港不能为空");
+		}
+		//POL
+		if (ObjectUtils.isNotNull(sheet.getRow(19).getCell(4))) {
+			String pol = sheet.getRow(19).getCell(4).getStringCellValue();
+			System.out.println("pol:" + pol);
+			bills.setPolEnName(pol);
+		} else {
+			throw new RuntimeException("装运港不能为空");
+		}
+		//POD
+		if (ObjectUtils.isNotNull(sheet.getRow(20).getCell(1))) {
+			String pod = sheet.getRow(20).getCell(1).getStringCellValue();
+			System.out.println("pod:" + pod);
+			bills.setPodEnName(pod);
+		} else {
+			throw new RuntimeException("卸货港不能为空");
+		}
+		//PLACE OF DELIVERY
+		if (ObjectUtils.isNotNull(sheet.getRow(20).getCell(4))) {
+			String placeOfDelivery = sheet.getRow(20).getCell(4).getStringCellValue();
+			System.out.println("placeOfDelivery:" + placeOfDelivery);
+			bills.setDestinationName(placeOfDelivery);
+		} else {
+			throw new RuntimeException("目的港不能为空");
+		}
+		//KIND OF B/L
+		if (ObjectUtils.isNotNull(sheet.getRow(21).getCell(1))) {
+			String kindOfBl = sheet.getRow(21).getCell(1).getStringCellValue();
+			System.out.println("kindOfBl:" + kindOfBl);
+			bills.setIssueType(kindOfBl);
+		} else {
+			throw new RuntimeException("签单方式不能为空");
+		}
+		//PAYMODE
+		if (ObjectUtils.isNotNull(sheet.getRow(21).getCell(4))) {
+			String payMode = sheet.getRow(21).getCell(4).getStringCellValue();
+			System.out.println("payMode:" + payMode);
+			bills.setHpaymode(payMode);
+		} else {
+			throw new RuntimeException("运费支付方式不能为空");
+		}
+		//PLACE OF ISSUE
+		if (ObjectUtils.isNotNull(sheet.getRow(22).getCell(1))) {
+			String placeOfIssue = sheet.getRow(22).getCell(1).getStringCellValue();
+			System.out.println("placeOfIssue:" + placeOfIssue);
+			bills.setIssueAt(placeOfIssue);
+		} else {
+			throw new RuntimeException("签单地不能为空");
+		}
+		//FREIGHT PAYABLE AT
+		if (ObjectUtils.isNotNull(sheet.getRow(22).getCell(4))) {
+			String freightPayAbleAt = sheet.getRow(22).getCell(4).getStringCellValue();
+			System.out.println("freightPayAbleAt:" + freightPayAbleAt);
+			bills.setHpayplace(freightPayAbleAt);
+		} else {
+			throw new RuntimeException("付费地不能为空");
+		}
+		//CONTRACTNO
+		if (ObjectUtils.isNotNull(sheet.getRow(23).getCell(1))) {
+			String contractno = sheet.getRow(23).getCell(1).getStringCellValue();
+			System.out.println("contractno:" + contractno);
+			bills.setCorpArgreementNo(contractno);
+		} else {
+			throw new RuntimeException("约号不能为空");
+		}
+		//VOLUME
+		if (ObjectUtils.isNotNull(sheet.getRow(23).getCell(4))) {
+			String volume = sheet.getRow(23).getCell(4).getStringCellValue();
+			System.out.println("volume:" + volume);
+			bills.setQuantityCntrDescr(volume);
+		} else {
+			throw new RuntimeException("箱型箱量不能为空");
+		}
+		//MARKS
+		StringBuilder marks = new StringBuilder();
+		for (int i = 25; i <= 46; i++) {
+			if (ObjectUtils.isNotNull(sheet.getRow(i).getCell(0))) {
+				marks.append(sheet.getRow(i).getCell(0).getStringCellValue());
+			}
+		}
+		if (ObjectUtils.isNotNull(marks)) {
+			System.out.println("marks:" + marks);
+			bills.setMarks(marks.toString());
+		} else {
+			throw new RuntimeException("唛头不能为空");
+		}
+		//BAGS
+		if (ObjectUtils.isNotNull(sheet.getRow(25).getCell(1))) {
+			double bags = sheet.getRow(25).getCell(1).getNumericCellValue();
+			System.out.println("bags:" + bags);
+			bills.setQuantity(new BigDecimal(bags));
+		} else {
+			throw new RuntimeException("件数不能为空");
+		}
+		//DESCRIPTION
+		StringBuilder description = new StringBuilder();
+		for (int i = 25; i <= 46; i++) {
+			if (ObjectUtils.isNotNull(sheet.getRow(i).getCell(2))) {
+				description.append(sheet.getRow(i).getCell(2).getStringCellValue());
+			}
+		}
+		if (ObjectUtils.isNotNull(description)) {
+			System.out.println("description:" + description);
+			bills.setCommodityDescr(description.toString());
+		} else {
+			throw new RuntimeException("提单上货物描述不能为空");
+		}
+		//G.W.
+		if (ObjectUtils.isNotNull(sheet.getRow(25).getCell(4))) {
+			double gw = sheet.getRow(25).getCell(4).getNumericCellValue();
+			System.out.println("gw:" + gw);
+			bills.setGrossWeight(new BigDecimal(gw));
+		} else {
+			throw new RuntimeException("毛重不能为空");
+		}
+		//MEAS
+		if (ObjectUtils.isNotNull(sheet.getRow(25).getCell(6))) {
+			double meas = sheet.getRow(25).getCell(6).getNumericCellValue();
+			System.out.println("meas:" + meas);
+			bills.setMeasurement(new BigDecimal(meas));
+		} else {
+			throw new RuntimeException("体积不能为空");
+		}
+		//REMARK
+		StringBuilder remark = new StringBuilder();
+		for (int i = 47; i <= 50; i++) {
+			if (ObjectUtils.isNotNull(sheet.getRow(i).getCell(1))) {
+				remark.append(sheet.getRow(i).getCell(1).getStringCellValue());
+			}
+		}
+		if (ObjectUtils.isNotNull(remark)) {
+			System.out.println("remark:" + remark);
+			bills.setRemarks(remark.toString());
+		}
+		//FINAL DESTINATION FOR THE MERCHANT’S REFERENCE
+		if (ObjectUtils.isNotNull(sheet.getRow(51).getCell(4))) {
+			String finalDestination = sheet.getRow(51).getCell(4).getStringCellValue();
+			System.out.println("finalDestination:" + finalDestination);
+			bills.setFinalDestinationName(finalDestination);
+		}
+
+		/*for (int i = 0; i <= sheet.getLastRowNum(); i++) {
+			String rowStr = "";
+			//循环获取sheet页的每一行
+			Row row = sheet.getRow(i);
+			//循环每一行的每一个单元格
+			for (int l = 0; l <= 6; l++) {
+				//判断是否是合并单元格并返回值
+				String value = getValue(sheet, i, row.getCell(l).getColumnIndex());
+				//数值为空说明不是合并单元格或者当前单元格为空,则直接获取当前单元格值
+				if ("".equals(value)) {
+					if (ObjectUtils.isNull(row.getCell(l))) {
+						value = "";
+					} else {
+						CellType cellType = row.getCell(l).getCellTypeEnum();
+						switch (cellType.name()) {
+							case "STRING":
+								value = row.getCell(l).getStringCellValue();
+								// 处理字符串类型的值
+								break;
+							case "NUMERIC":
+								value = row.getCell(l).getNumericCellValue() + "";
+								// 处理数字类型的值
+								break;
+							case "FORMULA":
+								value = row.getCell(l).getNumericCellValue() + "";
+								// 处理数字类型的值
+								break;
+							case "_NONE":
+								value = "";
+								// 处理数字类型的值
+								break;
+							case "BLANK":
+								value = "";
+								// 处理数字类型的值
+								break;
+							case "BOOLEAN":
+								value = "";
+								// 处理数字类型的值
+								break;
+							case "ERROR":
+								value = "";
+								// 处理数字类型的值
+								break;
+							// 可以添加其他类型的处理
+							default:
+								System.out.println("cellType:" + cellType.name());
+								throw new RuntimeException("数据类型错误");
+						}
+					}
+				}
+				rowStr += "--" + value;
+			}
+			for (Cell cell : row) {
+				//判断是否是合并单元格并返回值
+				String value = getValue(sheet, i, cell.getColumnIndex());
+				//数值为空说明不是合并单元格或者当前单元格为空,则直接获取当前单元格值
+				if("".equals(value)){
+					value=cell.getStringCellValue();
+				}
+				rowStr+="--"+value;
+			}*/
+		return R.data(bills);
+	}
+
+	@Override
+	public R<List<Containers>> importHisense(MultipartFile file) throws Exception {
+		return null;
+	}
+}

+ 7 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/corps/controller/CorpsDescController.java

@@ -660,3 +660,10 @@ public class CorpsDescController extends BladeController {
 	}
 
 }
+
+/**
+ * 鸿鹰轮胎235/50ZR19RUBYG-31  103WXL    331   鸿鹰轮胎 235/50ZR19 RUBYG-31 103WXL ****
+ * 鸿鹰轮胎245/40R18G31  93Y    289   鸿鹰轮胎 245/40R18 G-31 93Y  ***
+ * 鸿鹰轮胎265/65R17G60    460       鸿鹰轮胎 265/65R17 G60   **
+ * 鸿鹰轮胎275/35RF19G-31-RFT  593   鸿鹰轮胎 275/35RF19 G-31-RFT   ***
+ */

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

@@ -47,6 +47,7 @@ import org.springblade.salesPart.goods.service.IGoodsFilesService;
 import org.springblade.salesPart.goods.service.IGoodsTypeService;
 import org.springblade.salesPart.order.service.IOrderItemsService;
 import org.springblade.salesPart.productLaunch.service.IProductLaunchService;
+import org.springblade.salesPart.ship.service.IShipItemsService;
 import org.springblade.salesPart.stock.service.IStockDescService;
 import org.springblade.salesPart.vo.GoodsDescVO;
 import org.springframework.web.bind.annotation.*;
@@ -77,6 +78,7 @@ public class GoodsDescController extends BladeController {
 	private final IGoodsDescService goodsDescService;
 	private final IProductLaunchService productLaunchService;
 	private final IOrderItemsService orderItemsService;
+	private final IShipItemsService shipItemsService;
 	private final IGoodsFilesService goodsFilesService;
 	private final IBrandFilesService brandFilesService;
 	private final IStockDescService stockDescService;
@@ -225,6 +227,12 @@ public class GoodsDescController extends BladeController {
 				.in(PjOrderItems::getGoodsId, list)) > 0) {
 				throw new RuntimeException("产品已创建业务数据,删除失败");
 			}
+			if (shipItemsService.count(new LambdaQueryWrapper<PjShipItems>()
+				.eq(PjShipItems::getTenantId, AuthUtil.getTenantId())
+				.eq(PjShipItems::getIsDeleted, 0)
+				.in(PjShipItems::getGoodsId, list)) > 0) {
+				throw new RuntimeException("产品已创建业务数据,删除失败");
+			}
 		}
 		return R.status(goodsDescService.removeByIds(list));
 	}

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

@@ -178,6 +178,9 @@ public class GoodsDescServiceImpl extends ServiceImpl<GoodsDescMapper, PjGoodsDe
 			if (countName > 1) {
 				throw new ServiceException("名称已存在");
 			}
+			if (1 == goodsDesc.getEnableOrNot()) {
+				throw new RuntimeException("请先禁用商品在修改");
+			}
 			goodsDesc.setUpdateUser(AuthUtil.getUserId());
 			goodsDesc.setUpdateTime(new Date());
 			goodsDesc.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));

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

@@ -980,7 +980,8 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 		// 保存订单明细
 		if (CollectionUtils.isNotEmpty(ship.getShipItemsList())) {
 			List<PjShipItems> shipItemsList = new ArrayList<>();
-			List<PjStockDesc> pjStockDescArrayList = new ArrayList<>();
+			List<PjStockDesc> pjStockDescArrayListSave = new ArrayList<>();
+			List<PjStockDesc> pjStockDescArrayListUpdate = new ArrayList<>();
 			List<PjProductLaunch> pjProductLaunchList = new ArrayList<>();
 			List<PjOrderItems> pjOrderItemsList = new ArrayList<>();
 			List<Long> goodIds = ship.getShipItemsList().stream().map(PjShipItems::getGoodsId).distinct().collect(Collectors.toList());
@@ -1087,6 +1088,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 					} else {
 						stockDesc.setInventoryCostPrice(item.getPrice());
 					}
+					pjStockDescArrayListSave.add(stockDesc);
 				} else {
 					stockDesc.setId(stockOne.getId());
 					stockDesc.setUpdateTime(new Date());
@@ -1099,15 +1101,20 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 						stockDesc.setInventoryCostPrice(stockDesc.getInventoryAmount().divide(stockDesc.getBalanceQuantity(), MathContext.DECIMAL32).setScale(2, RoundingMode.HALF_UP));
 					}
 					stockDesc.setVersion(stockOne.getVersion());
+					pjStockDescArrayListUpdate.add(stockDesc);
 				}
 				/*boolean count = iStockDescService.saveOrUpdate(stockDesc);
 				if (!count) {
 					throw new RuntimeException(stockOne.getCname() + "该产品库存正在操作,请稍后刷新在进行操作!");
 				}*/
-				pjStockDescArrayList.add(stockDesc);
 			}
 			shipItemsService.saveOrUpdateBatch(shipItemsList);
-			iStockDescService.saveOrUpdateBatch(pjStockDescArrayList);
+			if (!pjStockDescArrayListSave.isEmpty()) {
+				iStockDescService.saveBatch(pjStockDescArrayListSave);
+			}
+			if (!pjStockDescArrayListSave.isEmpty()) {
+				iStockDescService.updateBatchById(pjStockDescArrayListUpdate);
+			}
 			orderItemsService.updateBatchById(pjOrderItemsList);
 			//查询所有上架商品
 			LambdaQueryWrapper<PjProductLaunch> productLaunchQueryWrapper = new LambdaQueryWrapper<>();
@@ -1466,9 +1473,11 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 						throw new RuntimeException(res.getMsg());
 					}*/
 					pjStockDescArrayList.add(stockOne);
+				} else {
+					throw new RuntimeException("未查到库存数据");
 				}
 			}
-			iStockDescService.saveOrUpdateBatch(pjStockDescArrayList);
+			iStockDescService.updateBatchByIdNew(pjStockDescArrayList);
 			List<PjProductLaunch> pjProductLaunchList = new ArrayList<>();
 			List<PjOrderItems> pjOrderItemsList = new ArrayList<>();
 			//查询所有上架商品

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

@@ -108,7 +108,7 @@ public class StockDescController extends BladeController {
 			List<PjGoodsDesc> pjGoodsDescs = goodsDescService.list(new LambdaQueryWrapper<PjGoodsDesc>()
 				.eq(PjGoodsDesc::getTenantId, AuthUtil.getTenantId())
 				.eq(PjGoodsDesc::getIsDeleted, 0)
-				.like(PjGoodsDesc::getCnameInt, stockDesc.getCname()));
+				.and(i -> i.like(PjGoodsDesc::getCname, stockDesc.getCname()).or().like(PjGoodsDesc::getCnameInt, stockDesc.getCname())));
 			if (!pjGoodsDescs.isEmpty()) {
 				List<Long> ids = pjGoodsDescs.stream().map(PjGoodsDesc::getId).collect(Collectors.toList());
 				if ("0".equals(stockDesc.getIfGrounding()) || "1".equals(stockDesc.getIfGrounding())) {
@@ -124,6 +124,7 @@ public class StockDescController extends BladeController {
 						} else {
 							lambdaQueryWrapper.in(PjStockDesc::getGoodsId, goodIds);
 						}
+						lambdaQueryWrapper.like(PjStockDesc::getCname, stockDesc.getCname());
 					}
 				}else{
 					lambdaQueryWrapper.and(i -> i.like(PjStockDesc::getCname, stockDesc.getCname())
@@ -433,7 +434,7 @@ public class StockDescController extends BladeController {
 			List<PjGoodsDesc> pjGoodsDescs = goodsDescService.list(new LambdaQueryWrapper<PjGoodsDesc>()
 				.eq(PjGoodsDesc::getTenantId, AuthUtil.getTenantId())
 				.eq(PjGoodsDesc::getIsDeleted, 0)
-				.like(PjGoodsDesc::getCnameInt, stockDesc.getCname()));
+				.and(i -> i.like(PjGoodsDesc::getCname, stockDesc.getCname()).or().like(PjGoodsDesc::getCnameInt, stockDesc.getCname())));
 			if (!pjGoodsDescs.isEmpty()) {
 				List<Long> ids = pjGoodsDescs.stream().map(PjGoodsDesc::getId).collect(Collectors.toList());
 				if ("0".equals(stockDesc.getIfGrounding()) || "1".equals(stockDesc.getIfGrounding())) {
@@ -449,6 +450,7 @@ public class StockDescController extends BladeController {
 						} else {
 							lambdaQueryWrapper.in(PjStockDesc::getGoodsId, goodIds);
 						}
+						lambdaQueryWrapper.like(PjStockDesc::getCname, stockDesc.getCname());
 					}
 				}else{
 					lambdaQueryWrapper.and(i -> i.like(PjStockDesc::getCname, stockDesc.getCname())

+ 113 - 0
blade-service/blade-sales-part/src/main/resources/log/logback-dev.xml

@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds">
+    <!-- 自定义参数监听 -->
+    <contextListener class="org.springblade.core.log.listener.LoggerStartupListener"/>
+    <springProperty scope="context" name="springAppName" source="spring.application.name"/>
+
+    <!-- 彩色日志依赖的渲染类 -->
+    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
+    <conversionRule conversionWord="wex"
+                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
+    <conversionRule conversionWord="wEx"
+                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
+    <!-- 彩色日志格式 -->
+    <property name="CONSOLE_LOG_PATTERN"
+              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
+    <!-- 控制台输出 -->
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
+            <charset>utf8</charset>
+        </encoder>
+    </appender>
+
+    <if condition='property("ELK_MODE").toUpperCase().contains("TRUE")'>
+        <then>
+            <!-- 推送日志至elk -->
+            <appender name="STDOUT_LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
+                <destination>${DESTINATION}</destination>
+                <!-- 日志输出编码 -->
+                <encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
+                    <providers>
+                        <timestamp>
+                            <timeZone>UTC</timeZone>
+                        </timestamp>
+                        <pattern>
+                            <pattern>
+                                {
+                                "traceId": "%X{traceId}",
+                                "requestId": "%X{requestId}",
+                                "accountId": "%X{accountId}",
+                                "tenantId": "%X{tenantId}",
+                                "logLevel": "%level",
+                                "serviceName": "${springAppName:-SpringApp}",
+                                "pid": "${PID:-}",
+                                "thread": "%thread",
+                                "class": "%logger{40}",
+                                "line":"%L",
+                                "message": "%message"
+                                }
+                            </pattern>
+                        </pattern>
+                        <mdc/>
+                        <stackTrace/>
+                    </providers>
+                </encoder>
+            </appender>
+        </then>
+    </if>
+
+    <!-- 日志输出级别 -->
+    <root level="ERROR">
+        <appender-ref ref="STDOUT"/>
+        <appender-ref ref="${STDOUT_APPENDER}"/>
+    </root>
+
+    <logger name="net.sf.ehcache" level="ERROR"/>
+    <logger name="druid.sql" level="ERROR"/>
+
+
+    <!-- MyBatis log configure -->
+    <logger name="com.apache.ibatis" level="ERROR"/>
+    <logger name="org.mybatis.spring" level="ERROR"/>
+    <logger name="java.sql.Connection" level="ERROR"/>
+    <logger name="java.sql.Statement" level="ERROR"/>
+    <logger name="java.sql.PreparedStatement" level="ERROR"/>
+
+    <!-- 减少部分debug日志 -->
+    <logger name="druid.sql" level="ERROR"/>
+    <logger name="org.apache.shiro" level="ERROR"/>
+    <logger name="org.mybatis.spring" level="ERROR"/>
+    <logger name="org.springframework" level="ERROR"/>
+    <logger name="org.springframework.context" level="ERROR"/>
+    <logger name="org.springframework.beans" level="ERROR"/>
+    <logger name="com.baomidou.mybatisplus" level="ERROR"/>
+    <logger name="org.apache.ibatis.io" level="ERROR"/>
+    <logger name="org.apache.velocity" level="ERROR"/>
+    <logger name="org.eclipse.jetty" level="ERROR"/>
+    <logger name="io.undertow" level="ERROR"/>
+    <logger name="org.xnio.nio" level="ERROR"/>
+    <logger name="org.thymeleaf" level="ERROR"/>
+    <logger name="springfox.documentation" level="ERROR"/>
+    <logger name="org.hibernate.validator" level="ERROR"/>
+    <logger name="com.netflix.loadbalancer" level="ERROR"/>
+    <logger name="com.netflix.hystrix" level="ERROR"/>
+    <logger name="com.netflix.zuul" level="ERROR"/>
+    <logger name="de.codecentric" level="ERROR"/>
+    <!-- cache INFO -->
+    <logger name="net.sf.ehcache" level="ERROR"/>
+    <logger name="org.springframework.cache" level="ERROR"/>
+    <!-- cloud -->
+    <logger name="org.apache.http" level="ERROR"/>
+    <logger name="com.netflix.discovery" level="ERROR"/>
+    <logger name="com.netflix.eureka" level="ERROR"/>
+    <!-- 业务日志 -->
+    <Logger name="org.springblade" level="ERROR"/>
+    <Logger name="org.springblade.core.tenant" level="ERROR"/>
+    <Logger name="org.springblade.core.version" level="ERROR"/>
+
+    <!-- 减少nacos日志 -->
+    <logger name="com.alibaba.nacos" level="ERROR"/>
+
+
+</configuration>

+ 151 - 0
blade-service/blade-sales-part/src/main/resources/log/logback-prod.xml

@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds">
+    <!-- 自定义参数监听 -->
+    <contextListener class="org.springblade.core.log.listener.LoggerStartupListener"/>
+    <springProperty scope="context" name="springAppName" source="spring.application.name"/>
+
+    <!-- 彩色日志依赖的渲染类 -->
+    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
+    <conversionRule conversionWord="wex"
+                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
+    <conversionRule conversionWord="wEx"
+                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
+    <!-- 彩色日志格式 -->
+    <property name="CONSOLE_LOG_PATTERN"
+              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
+    <!-- 控制台输出 -->
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
+            <charset>utf8</charset>
+        </encoder>
+    </appender>
+
+    <!-- 生成日志文件 -->
+    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件输出的文件名 -->
+            <FileNamePattern>target/blade/log/info-%d{yyyy-MM-dd}.log</FileNamePattern>
+        </rollingPolicy>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>%n%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId}] [%logger{50}] %n%-5level: %msg%n</pattern>
+        </encoder>
+        <!-- 打印日志级别 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>INFO</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 生成日志文件 -->
+    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件输出的文件名 -->
+            <FileNamePattern>target/blade/log/error-%d{yyyy-MM-dd}.log</FileNamePattern>
+        </rollingPolicy>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>%n%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId}] [%logger{50}] %n%-5level: %msg%n</pattern>
+        </encoder>
+        <!-- 打印日志级别 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>ERROR</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <if condition='property("ELK_MODE").toUpperCase().contains("TRUE")'>
+        <then>
+            <!-- 推送日志至elk -->
+            <appender name="INFO_LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
+                <destination>${DESTINATION}</destination>
+                <!-- 日志输出编码 -->
+                <encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
+                    <providers>
+                        <timestamp>
+                            <timeZone>UTC</timeZone>
+                        </timestamp>
+                        <pattern>
+                            <pattern>
+                                {
+                                "traceId": "%X{traceId}",
+                                "requestId": "%X{requestId}",
+                                "accountId": "%X{accountId}",
+                                "tenantId": "%X{tenantId}",
+                                "logLevel": "%level",
+                                "serviceName": "${springAppName:-SpringApp}",
+                                "pid": "${PID:-}",
+                                "thread": "%thread",
+                                "class": "%logger{40}",
+                                "line":"%L",
+                                "message": "%message"
+                                }
+                            </pattern>
+                        </pattern>
+                        <mdc/>
+                        <stackTrace/>
+                    </providers>
+                </encoder>
+                <!-- 打印日志级别 -->
+                <filter class="ch.qos.logback.classic.filter.LevelFilter">
+                    <level>INFO</level>
+                    <onMatch>ACCEPT</onMatch>
+                    <onMismatch>DENY</onMismatch>
+                </filter>
+            </appender>
+
+            <!-- 推送日志至elk -->
+            <appender name="ERROR_LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
+                <destination>${DESTINATION}</destination>
+                <!-- 日志输出编码 -->
+                <encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
+                    <providers>
+                        <timestamp>
+                            <timeZone>UTC</timeZone>
+                        </timestamp>
+                        <pattern>
+                            <pattern>
+                                {
+                                "traceId": "%X{traceId}",
+                                "requestId": "%X{requestId}",
+                                "accountId": "%X{accountId}",
+                                "tenantId": "%X{tenantId}",
+                                "logLevel": "%level",
+                                "serviceName": "${springAppName:-SpringApp}",
+                                "pid": "${PID:-}",
+                                "thread": "%thread",
+                                "class": "%logger{40}",
+                                "line":"%L",
+                                "message": "%message"
+                                }
+                            </pattern>
+                        </pattern>
+                        <mdc/>
+                        <stackTrace/>
+                    </providers>
+                </encoder>
+                <!-- 打印日志级别 -->
+                <filter class="ch.qos.logback.classic.filter.LevelFilter">
+                    <level>ERROR</level>
+                    <onMatch>ACCEPT</onMatch>
+                    <onMismatch>DENY</onMismatch>
+                </filter>
+            </appender>
+        </then>
+    </if>
+
+    <!-- 日志输出级别 -->
+    <root level="ERROR">
+        <appender-ref ref="STDOUT"/>
+        <appender-ref ref="${INFO_APPENDER}"/>
+        <appender-ref ref="${ERROR_APPENDER}"/>
+    </root>
+
+    <logger name="net.sf.ehcache" level="ERROR"/>
+    <logger name="druid.sql" level="ERROR"/>
+
+    <!-- 减少nacos日志 -->
+    <logger name="com.alibaba.nacos" level="ERROR"/>
+
+</configuration>

+ 151 - 0
blade-service/blade-sales-part/src/main/resources/log/logback-test.xml

@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds">
+    <!-- 自定义参数监听 -->
+    <contextListener class="org.springblade.core.log.listener.LoggerStartupListener"/>
+    <springProperty scope="context" name="springAppName" source="spring.application.name"/>
+
+    <!-- 彩色日志依赖的渲染类 -->
+    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
+    <conversionRule conversionWord="wex"
+                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
+    <conversionRule conversionWord="wEx"
+                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
+    <!-- 彩色日志格式 -->
+    <property name="CONSOLE_LOG_PATTERN"
+              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
+    <!-- 控制台输出 -->
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
+            <charset>utf8</charset>
+        </encoder>
+    </appender>
+
+    <!-- 生成日志文件 -->
+    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件输出的文件名 -->
+            <FileNamePattern>target/blade/log/info-%d{yyyy-MM-dd}.log</FileNamePattern>
+        </rollingPolicy>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>%n%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId}] [%logger{50}] %n%-5level: %msg%n</pattern>
+        </encoder>
+        <!-- 打印日志级别 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>INFO</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 生成日志文件 -->
+    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件输出的文件名 -->
+            <FileNamePattern>target/blade/log/error-%d{yyyy-MM-dd}.log</FileNamePattern>
+        </rollingPolicy>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>%n%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId}] [%logger{50}] %n%-5level: %msg%n</pattern>
+        </encoder>
+        <!-- 打印日志级别 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>ERROR</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <if condition='property("ELK_MODE").toUpperCase().contains("TRUE")'>
+        <then>
+            <!-- 推送日志至elk -->
+            <appender name="INFO_LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
+                <destination>${DESTINATION}</destination>
+                <!-- 日志输出编码 -->
+                <encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
+                    <providers>
+                        <timestamp>
+                            <timeZone>UTC</timeZone>
+                        </timestamp>
+                        <pattern>
+                            <pattern>
+                                {
+                                "traceId": "%X{traceId}",
+                                "requestId": "%X{requestId}",
+                                "accountId": "%X{accountId}",
+                                "tenantId": "%X{tenantId}",
+                                "logLevel": "%level",
+                                "serviceName": "${springAppName:-SpringApp}",
+                                "pid": "${PID:-}",
+                                "thread": "%thread",
+                                "class": "%logger{40}",
+                                "line":"%L",
+                                "message": "%message"
+                                }
+                            </pattern>
+                        </pattern>
+                        <mdc/>
+                        <stackTrace/>
+                    </providers>
+                </encoder>
+                <!-- 打印日志级别 -->
+                <filter class="ch.qos.logback.classic.filter.LevelFilter">
+                    <level>INFO</level>
+                    <onMatch>ACCEPT</onMatch>
+                    <onMismatch>DENY</onMismatch>
+                </filter>
+            </appender>
+
+            <!-- 推送日志至elk -->
+            <appender name="ERROR_LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
+                <destination>${DESTINATION}</destination>
+                <!-- 日志输出编码 -->
+                <encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
+                    <providers>
+                        <timestamp>
+                            <timeZone>UTC</timeZone>
+                        </timestamp>
+                        <pattern>
+                            <pattern>
+                                {
+                                "traceId": "%X{traceId}",
+                                "requestId": "%X{requestId}",
+                                "accountId": "%X{accountId}",
+                                "tenantId": "%X{tenantId}",
+                                "logLevel": "%level",
+                                "serviceName": "${springAppName:-SpringApp}",
+                                "pid": "${PID:-}",
+                                "thread": "%thread",
+                                "class": "%logger{40}",
+                                "line":"%L",
+                                "message": "%message"
+                                }
+                            </pattern>
+                        </pattern>
+                        <mdc/>
+                        <stackTrace/>
+                    </providers>
+                </encoder>
+                <!-- 打印日志级别 -->
+                <filter class="ch.qos.logback.classic.filter.LevelFilter">
+                    <level>ERROR</level>
+                    <onMatch>ACCEPT</onMatch>
+                    <onMismatch>DENY</onMismatch>
+                </filter>
+            </appender>
+        </then>
+    </if>
+
+    <!-- 日志输出级别 -->
+    <root level="ERROR">
+        <appender-ref ref="STDOUT"/>
+        <appender-ref ref="${INFO_APPENDER}"/>
+        <appender-ref ref="${ERROR_APPENDER}"/>
+    </root>
+
+    <logger name="net.sf.ehcache" level="ERROR"/>
+    <logger name="druid.sql" level="ERROR"/>
+
+    <!-- 减少nacos日志 -->
+    <logger name="com.alibaba.nacos" level="ERROR"/>
+
+</configuration>

+ 36 - 36
blade-service/blade-system/src/main/resources/log/logback-dev.xml

@@ -58,56 +58,56 @@
     </if>
 
     <!-- 日志输出级别 -->
-    <root level="INFO">
+    <root level="ERROR">
         <appender-ref ref="STDOUT"/>
         <appender-ref ref="${STDOUT_APPENDER}"/>
     </root>
 
-    <logger name="net.sf.ehcache" level="INFO"/>
-    <logger name="druid.sql" level="INFO"/>
+    <logger name="net.sf.ehcache" level="ERROR"/>
+    <logger name="druid.sql" level="ERROR"/>
 
 
     <!-- MyBatis log configure -->
-    <logger name="com.apache.ibatis" level="INFO"/>
-    <logger name="org.mybatis.spring" level="INFO"/>
-    <logger name="java.sql.Connection" level="INFO"/>
-    <logger name="java.sql.Statement" level="INFO"/>
-    <logger name="java.sql.PreparedStatement" level="INFO"/>
+    <logger name="com.apache.ibatis" level="ERROR"/>
+    <logger name="org.mybatis.spring" level="ERROR"/>
+    <logger name="java.sql.Connection" level="ERROR"/>
+    <logger name="java.sql.Statement" level="ERROR"/>
+    <logger name="java.sql.PreparedStatement" level="ERROR"/>
 
     <!-- 减少部分debug日志 -->
-    <logger name="druid.sql" level="INFO"/>
-    <logger name="org.apache.shiro" level="INFO"/>
-    <logger name="org.mybatis.spring" level="INFO"/>
-    <logger name="org.springframework" level="INFO"/>
-    <logger name="org.springframework.context" level="INFO"/>
-    <logger name="org.springframework.beans" level="INFO"/>
-    <logger name="com.baomidou.mybatisplus" level="INFO"/>
-    <logger name="org.apache.ibatis.io" level="INFO"/>
-    <logger name="org.apache.velocity" level="INFO"/>
-    <logger name="org.eclipse.jetty" level="INFO"/>
-    <logger name="io.undertow" level="INFO"/>
-    <logger name="org.xnio.nio" level="INFO"/>
-    <logger name="org.thymeleaf" level="INFO"/>
-    <logger name="springfox.documentation" level="INFO"/>
-    <logger name="org.hibernate.validator" level="INFO"/>
-    <logger name="com.netflix.loadbalancer" level="INFO"/>
-    <logger name="com.netflix.hystrix" level="INFO"/>
-    <logger name="com.netflix.zuul" level="INFO"/>
-    <logger name="de.codecentric" level="INFO"/>
+    <logger name="druid.sql" level="ERROR"/>
+    <logger name="org.apache.shiro" level="ERROR"/>
+    <logger name="org.mybatis.spring" level="ERROR"/>
+    <logger name="org.springframework" level="ERROR"/>
+    <logger name="org.springframework.context" level="ERROR"/>
+    <logger name="org.springframework.beans" level="ERROR"/>
+    <logger name="com.baomidou.mybatisplus" level="ERROR"/>
+    <logger name="org.apache.ibatis.io" level="ERROR"/>
+    <logger name="org.apache.velocity" level="ERROR"/>
+    <logger name="org.eclipse.jetty" level="ERROR"/>
+    <logger name="io.undertow" level="ERROR"/>
+    <logger name="org.xnio.nio" level="ERROR"/>
+    <logger name="org.thymeleaf" level="ERROR"/>
+    <logger name="springfox.documentation" level="ERROR"/>
+    <logger name="org.hibernate.validator" level="ERROR"/>
+    <logger name="com.netflix.loadbalancer" level="ERROR"/>
+    <logger name="com.netflix.hystrix" level="ERROR"/>
+    <logger name="com.netflix.zuul" level="ERROR"/>
+    <logger name="de.codecentric" level="ERROR"/>
     <!-- cache INFO -->
-    <logger name="net.sf.ehcache" level="INFO"/>
-    <logger name="org.springframework.cache" level="INFO"/>
+    <logger name="net.sf.ehcache" level="ERROR"/>
+    <logger name="org.springframework.cache" level="ERROR"/>
     <!-- cloud -->
-    <logger name="org.apache.http" level="INFO"/>
-    <logger name="com.netflix.discovery" level="INFO"/>
-    <logger name="com.netflix.eureka" level="INFO"/>
+    <logger name="org.apache.http" level="ERROR"/>
+    <logger name="com.netflix.discovery" level="ERROR"/>
+    <logger name="com.netflix.eureka" level="ERROR"/>
     <!-- 业务日志 -->
-    <Logger name="org.springblade" level="INFO"/>
-    <Logger name="org.springblade.core.tenant" level="INFO"/>
-    <Logger name="org.springblade.core.version" level="INFO"/>
+    <Logger name="org.springblade" level="ERROR"/>
+    <Logger name="org.springblade.core.tenant" level="ERROR"/>
+    <Logger name="org.springblade.core.version" level="ERROR"/>
 
     <!-- 减少nacos日志 -->
-    <logger name="com.alibaba.nacos" level="INFO"/>
+    <logger name="com.alibaba.nacos" level="ERROR"/>
 
 
 </configuration>