Ver código fonte

20230224 17:00

wangzhuo 2 anos atrás
pai
commit
3ce81e4cc2
12 arquivos alterados com 457 adições e 40 exclusões
  1. 6 0
      blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/entity/AnnualBudget.java
  2. 0 6
      blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/entity/AnnualBudgetItem.java
  3. 12 3
      blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/excel/AnnualBudgetExcel.java
  4. 64 0
      blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/excel/AnnualBudgetItemExcel.java
  5. 4 2
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/annualBudget/controller/AnnualBudgetController.java
  6. 45 1
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/annualBudget/controller/AnnualBudgetItemController.java
  7. 5 0
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/annualBudget/service/IAnnualBudgetItemService.java
  8. 6 0
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/annualBudget/service/IAnnualBudgetService.java
  9. 115 21
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/annualBudget/service/impl/AnnualBudgetItemServiceImpl.java
  10. 40 1
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/annualBudget/service/impl/AnnualBudgetServiceImpl.java
  11. 154 0
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/utils/ExcelCheck.java
  12. 6 6
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/mapper/OrderMapper.xml

+ 6 - 0
blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/entity/AnnualBudget.java

@@ -116,4 +116,10 @@ public class AnnualBudget implements Serializable {
 	 */
 	@TableField(exist = false)
 	List<AnnualBudgetItem> itemList;
+
+	/**
+	 * 客户id拼接
+	 */
+	@ApiModelProperty(value = "客户id拼接")
+	private String corpIds;
 }

+ 0 - 6
blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/entity/AnnualBudgetItem.java

@@ -238,12 +238,6 @@ public class AnnualBudgetItem implements Serializable {
 	private BigDecimal brand10;
 
 	/**
-	 * 客户ids
-	 */
-	@TableField(exist = false)
-	private String corpIds;
-
-	/**
 	 * 计划量汇总
 	 */
 	@ApiModelProperty(value = "计划量汇总")

+ 12 - 3
blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/excel/AnnualBudgetExcel.java

@@ -4,13 +4,10 @@ import com.alibaba.excel.annotation.ExcelProperty;
 import com.alibaba.excel.annotation.write.style.ColumnWidth;
 import com.alibaba.excel.annotation.write.style.ContentRowHeight;
 import com.alibaba.excel.annotation.write.style.HeadRowHeight;
-import com.baomidou.mybatisplus.annotation.TableField;
-import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
-import java.util.Date;
 
 /**
  *  统计分析 年度预算报表导出
@@ -118,4 +115,16 @@ public class AnnualBudgetExcel implements Serializable {
 	 */
 	@ExcelProperty(value = "汇总")
 	private BigDecimal quantitySummary;
+
+	/**
+	 * 订单汇总
+	 */
+	@ExcelProperty(value = "订单汇总")
+	private BigDecimal orderSummary;
+
+	/**
+	 * 发货汇总
+	 */
+	@ExcelProperty(value = "发货汇总")
+	private BigDecimal deliverySummary;
 }

+ 64 - 0
blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/excel/AnnualBudgetItemExcel.java

@@ -0,0 +1,64 @@
+package org.springblade.box.tube.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ *  统计分析 年度预算明细导入模板
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class AnnualBudgetItemExcel implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 年
+	 */
+	@ExcelProperty(value = "年")
+	private Integer year;
+
+	/**
+	 * 月
+	 */
+	@ExcelProperty(value = "月")
+	private Integer month;
+
+	/**
+	 * 客户
+	 */
+	@ExcelProperty(value = "客户")
+	private String corpName;
+
+	/**
+	 * 登马
+	 */
+	@ExcelProperty(value = "登马")
+	private BigDecimal drivemaster;
+
+	/**
+	 * 路迈
+	 */
+	@ExcelProperty(value = "路迈")
+	private BigDecimal luxxan;
+
+	/**
+	 * 艾特路
+	 */
+	@ExcelProperty(value = "艾特路")
+	private BigDecimal xcentway;
+
+	/**
+	 * 欧记
+	 */
+	@ExcelProperty(value = "欧记")
+	private BigDecimal keter;
+
+}

+ 4 - 2
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/annualBudget/controller/AnnualBudgetController.java

@@ -64,7 +64,9 @@ public class AnnualBudgetController extends BladeController {
 		lambdaQueryWrapper.eq(AnnualBudget::getTenantId, AuthUtil.getTenantId())
 			.eq(AnnualBudget::getIsDeleted, 0)
 			.like(ObjectUtil.isNotEmpty(annualBudget.getTitle()), AnnualBudget::getTitle, annualBudget.getTitle())//标题
-			.like(ObjectUtil.isNotEmpty(annualBudget.getParticularYear()), AnnualBudget::getParticularYear, annualBudget.getParticularYear());//年份
+			.like(ObjectUtil.isNotEmpty(annualBudget.getParticularYear()), AnnualBudget::getParticularYear, annualBudget.getParticularYear())//年份
+			.like(ObjectUtil.isNotEmpty(annualBudget.getCorpIds()), AnnualBudget::getCorpIds, annualBudget.getCorpIds())//客户
+			.orderByDesc(AnnualBudget::getParticularYear);
 
 		IPage<AnnualBudget> page = annualBudgetService.page(Condition.getPage(query), lambdaQueryWrapper);
 
@@ -138,7 +140,7 @@ public class AnnualBudgetController extends BladeController {
 	@ApiOperationSupport(order = 7)
 	@ApiOperation(value = "删除", notes = "传入ids")
 	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
-		return R.status(annualBudgetService.removeByIds(Func.toLongList(ids)));
+		return annualBudgetService.removeAnnualBudget(ids);
 	}
 
 	/**

+ 45 - 1
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/annualBudget/controller/AnnualBudgetItemController.java

@@ -2,6 +2,8 @@ package org.springblade.box.tube.annualBudget.controller;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -12,6 +14,8 @@ import org.springblade.box.tube.entity.AgreementFiles;
 import org.springblade.box.tube.entity.AnnualBudget;
 import org.springblade.box.tube.entity.AnnualBudgetItem;
 import org.springblade.box.tube.excel.AnnualBudgetExcel;
+import org.springblade.box.tube.excel.AnnualBudgetItemExcel;
+import org.springblade.box.tube.utils.ExcelCheck;
 import org.springblade.box.tube.vo.AgreementFilesVO;
 import org.springblade.box.tube.vo.AnnualBudgetItemVO;
 import org.springblade.core.boot.ctrl.BladeController;
@@ -25,9 +29,11 @@ import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.finance.excel.ChargeExcel;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -129,7 +135,7 @@ public class AnnualBudgetItemController extends BladeController {
 	 * 年度预算报表导出
 	 */
 	@GetMapping("/annualBudgetProfitExcel")
-	@ApiOperationSupport(order = 9)
+	@ApiOperationSupport(order = 10)
 	@ApiOperation(value = "修改", notes = "传入annualBudgetItem")
 	public void annualBudgetProfitExcel(AnnualBudgetItem annualBudgetItem, HttpServletResponse response) {
 		List<AnnualBudgetItem> list = annualBudgetItemService.annualBudgetProfitExcel(annualBudgetItem);
@@ -137,4 +143,42 @@ public class AnnualBudgetItemController extends BladeController {
 		ExcelUtil.export(response, "年度预算分析", "年度预算分析", annualBudgetItemExcelList, AnnualBudgetExcel.class);
 	}
 
+	/**
+	 * 导入聘用模板
+	 */
+	@GetMapping("/export/employ")
+	@ApiOperationSupport(order = 11)
+	@ApiOperation(value = "导出年度预算明细模板")
+	public void exportEmploy(HttpServletResponse response) {
+		List<AnnualBudgetItemExcel> list = new ArrayList<AnnualBudgetItemExcel>();
+		ExcelUtil.export(response, "年度预算明细", "年度预算明细", list, AnnualBudgetItemExcel.class);
+	}
+
+	/**
+	 * 年度预算明细导入
+	 */
+	@PostMapping("/import-item")
+	@ApiOperationSupport(order = 12)
+	@ApiOperation(value = "年度预算明细导入", notes = "传入excel")
+	public R importItem(@RequestParam("file") MultipartFile file, @RequestParam("id") Long id) {
+		//校验模板
+		String excelPattern = null;
+		try {
+			excelPattern = ExcelCheck.checkExcelPattern(file, new AnnualBudgetItemExcel());
+		} catch (Exception e) {
+			throw new SecurityException("校验Excel失败");
+		}
+		if (StringUtils.isNotBlank(excelPattern)){
+			throw new SecurityException(excelPattern);
+		}
+		//导入数据
+		List<AnnualBudgetItemExcel> excelList = ExcelUtil.read(file, AnnualBudgetItemExcel.class);
+		if(CollectionUtils.isEmpty(excelList))
+		{
+			throw new SecurityException("数据不能为空");
+		}
+
+		return annualBudgetItemService.importItem(excelList,false,id,file);
+	}
+
 }

+ 5 - 0
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/annualBudget/service/IAnnualBudgetItemService.java

@@ -3,8 +3,11 @@ package org.springblade.box.tube.annualBudget.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.springblade.box.tube.entity.AnnualBudgetItem;
+import org.springblade.box.tube.excel.AnnualBudgetItemExcel;
 import org.springblade.box.tube.vo.AnnualBudgetItemVO;
 import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
 
@@ -34,4 +37,6 @@ public interface IAnnualBudgetItemService extends IService<AnnualBudgetItem> {
 	 * 年度预算报表导出
 	 */
 	List<AnnualBudgetItem> annualBudgetProfitExcel(AnnualBudgetItem annualBudgetItem);
+
+	R importItem(List<AnnualBudgetItemExcel> excelList, Boolean isCovered, Long id, MultipartFile file);
 }

+ 6 - 0
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/annualBudget/service/IAnnualBudgetService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.springblade.box.tube.entity.AnnualBudget;
 import org.springblade.box.tube.vo.AnnualBudgetVO;
+import org.springblade.core.tool.api.R;
 
 /**
  * 年度预算表 服务类
@@ -34,4 +35,9 @@ public interface IAnnualBudgetService extends IService<AnnualBudget> {
 	 * 新增或修改 年度预算
 	 */
 	AnnualBudget add(AnnualBudget annualBudget);
+
+	/**
+	 * 删除年度预算
+	 */
+	R removeAnnualBudget(String ids);
 }

+ 115 - 21
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/annualBudget/service/impl/AnnualBudgetItemServiceImpl.java

@@ -2,21 +2,32 @@ package org.springblade.box.tube.annualBudget.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.seata.spring.annotation.GlobalTransactional;
 import lombok.AllArgsConstructor;
 import org.springblade.box.tube.annualBudget.mapper.AnnualBudgetItemMapper;
 import org.springblade.box.tube.annualBudget.service.IAnnualBudgetItemService;
 import org.springblade.box.tube.entity.AnnualBudgetItem;
+import org.springblade.box.tube.excel.AnnualBudgetItemExcel;
 import org.springblade.box.tube.vo.AnnualBudgetItemVO;
+import org.springblade.client.entity.CorpsDesc;
+import org.springblade.client.feign.ICorpsDescClient;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.purchase.sales.feign.IOrderDescClient;
 import org.springblade.purchase.sales.vo.OrderStatisticsVo;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -30,6 +41,7 @@ import java.util.List;
 public class AnnualBudgetItemServiceImpl extends ServiceImpl<AnnualBudgetItemMapper, AnnualBudgetItem> implements IAnnualBudgetItemService {
 
 	private final IOrderDescClient orderDescClient;//销售订单
+	private final ICorpsDescClient corpsDescClient;//客户
 
 	/**
 	 * 自定义分页
@@ -55,26 +67,36 @@ public class AnnualBudgetItemServiceImpl extends ServiceImpl<AnnualBudgetItemMap
 		IPage<AnnualBudgetItem> iPage = baseMapper.selectPage(Condition.getPage(query), lambdaQueryWrapper);
 
 		if (ObjectUtil.isNotEmpty(iPage.getRecords())){
-			//根据年月和客户查询订单数量和发货数量
 			iPage.getRecords().forEach(e -> {
-				List<OrderStatisticsVo> list = orderDescClient.getByOrderQuantity(e.getYear(), e.getMonth(), e.getCorpId());
-				if (ObjectUtil.isNotEmpty(list)){
-					list.forEach(o -> {
+				//默认为0 防止报错
+				e.setKeterOrdQuantity(BigDecimal.ZERO);
+				e.setKeterDeliverQuantity(BigDecimal.ZERO);
+				e.setXcentwayOrdQuantity(BigDecimal.ZERO);
+				e.setXcentwayDeliverQuantity(BigDecimal.ZERO);
+				e.setLuxxanOrdQuantity(BigDecimal.ZERO);
+				e.setLuxxanDeliverQuantity(BigDecimal.ZERO);
+				e.setDrivemasterOrdQuantity(BigDecimal.ZERO);
+				e.setDrivemasterDeliverQuantity(BigDecimal.ZERO);
+
+				//根据年 月 客户 查询订单数量和发货数量
+				List<OrderStatisticsVo> orderList = orderDescClient.getByOrderQuantity(e.getYear(), e.getMonth(), e.getCorpId());
+				if (ObjectUtil.isNotEmpty(orderList)){
+					orderList.forEach(o -> {//循环根据品牌赋值
 						if ("KETER".equals(o.getBrand())){//欧记
-							e.setKeterOrdQuantity(o.getOrderQuantity());
-							e.setKeterDeliverQuantity(o.getActualQuantity());
+							e.setKeterOrdQuantity(o.getOrderQuantity() == null ? BigDecimal.ZERO : o.getOrderQuantity());
+							e.setKeterDeliverQuantity(o.getActualQuantity() == null ? BigDecimal.ZERO : o.getActualQuantity());
 						}
 						if ("XCENTWAY".equals(o.getBrand())){//艾特路
-							e.setXcentwayOrdQuantity(o.getOrderQuantity());
-							e.setXcentwayDeliverQuantity(o.getActualQuantity());
+							e.setXcentwayOrdQuantity(o.getOrderQuantity() == null ? BigDecimal.ZERO : o.getOrderQuantity());
+							e.setXcentwayDeliverQuantity(o.getActualQuantity() == null ? BigDecimal.ZERO : o.getActualQuantity());
 						}
 						if ("LUXXAN".equals(o.getBrand())){//路迈
-							e.setLuxxanOrdQuantity(o.getOrderQuantity());
-							e.setLuxxanDeliverQuantity(o.getActualQuantity());
+							e.setLuxxanOrdQuantity(o.getOrderQuantity() == null ? BigDecimal.ZERO : o.getOrderQuantity());
+							e.setLuxxanDeliverQuantity(o.getActualQuantity() == null ? BigDecimal.ZERO : o.getActualQuantity());
 						}
 						if ("DRIVEMASTER".equals(o.getBrand())){//登马
-							e.setDrivemasterOrdQuantity(o.getOrderQuantity());
-							e.setDrivemasterDeliverQuantity(o.getActualQuantity());
+							e.setDrivemasterOrdQuantity(o.getOrderQuantity() == null ? BigDecimal.ZERO : o.getOrderQuantity());
+							e.setDrivemasterDeliverQuantity(o.getActualQuantity() == null ? BigDecimal.ZERO : o.getActualQuantity());
 						}
 					});
 					//订单汇总
@@ -116,26 +138,41 @@ public class AnnualBudgetItemServiceImpl extends ServiceImpl<AnnualBudgetItemMap
 		if (ObjectUtil.isNotEmpty(list)){
 			//根据年月和客户查询订单数量和发货数量
 			list.forEach(e -> {
+				//默认为0 防止报错
+				e.setKeterOrdQuantity(BigDecimal.ZERO);
+				e.setKeterDeliverQuantity(BigDecimal.ZERO);
+				e.setXcentwayOrdQuantity(BigDecimal.ZERO);
+				e.setXcentwayDeliverQuantity(BigDecimal.ZERO);
+				e.setLuxxanOrdQuantity(BigDecimal.ZERO);
+				e.setLuxxanDeliverQuantity(BigDecimal.ZERO);
+				e.setDrivemasterOrdQuantity(BigDecimal.ZERO);
+				e.setDrivemasterDeliverQuantity(BigDecimal.ZERO);
+
+				//根据年 月 客户 查询订单数量和发货数量
 				List<OrderStatisticsVo> orderList = orderDescClient.getByOrderQuantity(e.getYear(), e.getMonth(), e.getCorpId());
 				if (ObjectUtil.isNotEmpty(orderList)){
-					orderList.forEach(o -> {
+					orderList.forEach(o -> {//循环根据品牌赋值
 						if ("KETER".equals(o.getBrand())){//欧记
-							e.setKeterOrdQuantity(o.getOrderQuantity());
-							e.setKeterDeliverQuantity(o.getActualQuantity());
+							e.setKeterOrdQuantity(o.getOrderQuantity() == null ? BigDecimal.ZERO : o.getOrderQuantity());
+							e.setKeterDeliverQuantity(o.getActualQuantity() == null ? BigDecimal.ZERO : o.getActualQuantity());
 						}
 						if ("XCENTWAY".equals(o.getBrand())){//艾特路
-							e.setXcentwayOrdQuantity(o.getOrderQuantity());
-							e.setXcentwayDeliverQuantity(o.getActualQuantity());
+							e.setXcentwayOrdQuantity(o.getOrderQuantity() == null ? BigDecimal.ZERO : o.getOrderQuantity());
+							e.setXcentwayDeliverQuantity(o.getActualQuantity() == null ? BigDecimal.ZERO : o.getActualQuantity());
 						}
 						if ("LUXXAN".equals(o.getBrand())){//路迈
-							e.setLuxxanOrdQuantity(o.getOrderQuantity());
-							e.setLuxxanDeliverQuantity(o.getActualQuantity());
+							e.setLuxxanOrdQuantity(o.getOrderQuantity() == null ? BigDecimal.ZERO : o.getOrderQuantity());
+							e.setLuxxanDeliverQuantity(o.getActualQuantity() == null ? BigDecimal.ZERO : o.getActualQuantity());
 						}
 						if ("DRIVEMASTER".equals(o.getBrand())){//登马
-							e.setDrivemasterOrdQuantity(o.getOrderQuantity());
-							e.setDrivemasterDeliverQuantity(o.getActualQuantity());
+							e.setDrivemasterOrdQuantity(o.getOrderQuantity() == null ? BigDecimal.ZERO : o.getOrderQuantity());
+							e.setDrivemasterDeliverQuantity(o.getActualQuantity() == null ? BigDecimal.ZERO : o.getActualQuantity());
 						}
 					});
+					//订单汇总
+					e.setOrderSummary(e.getKeterOrdQuantity().add(e.getXcentwayOrdQuantity()).add(e.getLuxxanOrdQuantity()).add(e.getDrivemasterOrdQuantity()));
+					//发货汇总
+					e.setDeliverySummary(e.getKeterDeliverQuantity().add(e.getXcentwayDeliverQuantity()).add(e.getLuxxanDeliverQuantity()).add(e.getDrivemasterDeliverQuantity()));
 				}else {
 					e.setKeterOrdQuantity(BigDecimal.ZERO);
 					e.setKeterDeliverQuantity(BigDecimal.ZERO);
@@ -145,9 +182,66 @@ public class AnnualBudgetItemServiceImpl extends ServiceImpl<AnnualBudgetItemMap
 					e.setLuxxanDeliverQuantity(BigDecimal.ZERO);
 					e.setDrivemasterOrdQuantity(BigDecimal.ZERO);
 					e.setDrivemasterDeliverQuantity(BigDecimal.ZERO);
+					e.setOrderSummary(BigDecimal.ZERO);
+					e.setDeliverySummary(BigDecimal.ZERO);
 				}
 			});
 		}
 		return list;
 	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
+	public R importItem(List<AnnualBudgetItemExcel> excelList, Boolean isCovered, Long id, MultipartFile file) {
+		if(org.springframework.util.CollectionUtils.isEmpty(excelList))
+		{
+			throw new SecurityException("导入数据不能为空");
+		}
+		for(int i = 0; i < excelList.size(); i++)
+		{
+			//判断必填项是否为空
+			AnnualBudgetItemExcel ItemExcel = excelList.get(i);
+			if (ObjectUtil.isEmpty(ItemExcel.getYear())){
+				throw new SecurityException("第"+(i+2)+"行,年份为空,");
+			}
+			if (ObjectUtil.isEmpty(ItemExcel.getMonth())){
+				throw new SecurityException("第"+(i+2)+"行,月份为空,");
+			}
+			if (StringUtils.isBlank(ItemExcel.getCorpName())){
+				throw new SecurityException("第"+(i+2)+"行,客户为空,");
+			}
+
+			AnnualBudgetItem item = new AnnualBudgetItem();
+			BeanUtil.copy(ItemExcel,item);
+
+			//判断客户是否存在
+			R<CorpsDesc> detail = corpsDescClient.getCorpByName(item.getCorpName(), AuthUtil.getTenantId());
+			if (detail.isSuccess() && ObjectUtils.isNotNull(detail.getData())) {
+				item.setCorpId(detail.getData().getId());
+			} else {
+				throw new RuntimeException("客户不存在");
+			}
+
+			//判断明细是否存在,存在更新否则新增
+			LambdaQueryWrapper<AnnualBudgetItem> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+			lambdaQueryWrapper.eq(AnnualBudgetItem::getTenantId, AuthUtil.getTenantId()).eq(AnnualBudgetItem::getIsDeleted, 0)
+				.eq(AnnualBudgetItem::getCorpId, item.getCorpId()).eq(AnnualBudgetItem::getYear, item.getYear()).eq(AnnualBudgetItem::getMonth, item.getMonth());
+
+			AnnualBudgetItem selectItem = baseMapper.selectOne(lambdaQueryWrapper);
+			if (ObjectUtil.isNotEmpty(selectItem)){//存在更新
+				item.setUpdateTime(new Date());
+				item.setUpdateUser(AuthUtil.getUserId());
+				item.setId(selectItem.getId());
+				baseMapper.updateById(item);
+			}else {//不存在新增
+				item.setCreateUser(AuthUtil.getUserId());
+				item.setCreateTime(new Date());
+				item.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+				item.setPid(id);
+				baseMapper.insert(item);
+			}
+		}
+		return R.data("操作成功");
+	}
 }

+ 40 - 1
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/annualBudget/service/impl/AnnualBudgetServiceImpl.java

@@ -12,6 +12,7 @@ import org.springblade.box.tube.annualBudget.service.IAnnualBudgetService;
 import org.springblade.box.tube.entity.AnnualBudget;
 import org.springblade.box.tube.entity.AnnualBudgetItem;
 import org.springblade.box.tube.vo.AnnualBudgetVO;
+import org.springblade.client.entity.CorpsDesc;
 import org.springblade.client.feign.ISerialClient;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
@@ -19,8 +20,11 @@ import org.springblade.core.tool.utils.ObjectUtil;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
+
+import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 年度预算表 服务实现类
@@ -112,8 +116,43 @@ public class AnnualBudgetServiceImpl extends ServiceImpl<AnnualBudgetMapper, Ann
 				}
 			}
 			annualBudget.setItemList(itemList);
+			List<Long> corpIds = itemList.stream().map(AnnualBudgetItem::getCorpId).distinct().collect(Collectors.toList());
+			annualBudget.setCorpIds(corpIds.toString());
+			baseMapper.updateById(annualBudget);
 		}
-
 		return annualBudget;
 	}
+
+	/**
+	 * 删除年度预算
+	 */
+	@Override
+	public R removeAnnualBudget(String ids) {
+		if (ObjectUtil.isEmpty(ids)){
+			throw new SecurityException("缺少必要参数");
+		}
+		List<Long> collect = Arrays.stream(ids.split(","))
+			.map(s -> Long.parseLong(s.trim()))
+			.collect(Collectors.toList());
+
+		if (ObjectUtil.isNotEmpty(collect)){
+			for (Long id: collect) {
+				LambdaQueryWrapper<AnnualBudgetItem> itemLambdaQueryWrapper = new LambdaQueryWrapper<>();
+				itemLambdaQueryWrapper.eq(AnnualBudgetItem::getTenantId, AuthUtil.getTenantId())
+					.eq(AnnualBudgetItem::getIsDeleted, 0)
+					.eq(AnnualBudgetItem::getPid, id);
+
+				List<AnnualBudgetItem> itemList = itemMapper.selectList(itemLambdaQueryWrapper);
+				if (ObjectUtil.isNotEmpty(itemList)){
+					throw new SecurityException("订单存在明细");
+				}
+				AnnualBudget annualBudget = new AnnualBudget();
+				annualBudget.setId(id);
+				annualBudget.setIsDeleted(1);
+				baseMapper.updateById(annualBudget);
+			}
+		}
+		return R.success("操作成功");
+	}
+
 }

+ 154 - 0
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/utils/ExcelCheck.java

@@ -0,0 +1,154 @@
+package org.springblade.box.tube.utils;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.nacos.api.utils.StringUtils;
+import org.apache.poi.ss.usermodel.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.BufferedInputStream;
+import java.lang.reflect.Field;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author: xxx
+ * @createTime: 2021/12/07 17:07
+ * @company: https://www.xxx.cn
+ * @description:
+ */
+public class ExcelCheck {
+
+	/**
+	 * 检验导入Excel的格式
+	 * @param excel
+	 * @return
+	 * @throws Exception
+	 */
+	public static String checkExcelPattern(MultipartFile excel,Object object) throws Exception {
+		if(excel == null || excel.isEmpty()){
+			throw new Exception("导入文件不能为空!");
+		}
+		//用于拼接校验结果
+		StringBuilder builder = new StringBuilder();
+		//大小校验
+        /*if((excel.getSize()/1048576)>2){
+            builder.append("上传文件仅支持2M以内的Excel文件;");
+        }*/
+		//校验文件格式,必须为excel文件
+        String fileName = excel.getOriginalFilename();
+        String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
+        if (!"xlsx".equals(suffix)) {
+            builder.append("导入文件只支持xlsx类型后缀;");
+        }
+		//校验文件表头
+		BufferedInputStream fin = new BufferedInputStream(excel.getInputStream());
+		Workbook wb = null;
+		try{
+			wb = WorkbookFactory.create(fin);;
+		}catch(Exception e){
+			wb = WorkbookFactory.create(fin);;
+		}
+		//XSSFWorkbook wb = new XSSFWorkbook(fin);导致出现异常
+		//columnName = {"姓名", "性别", "年级", "班级","身份证号","学籍号","学工号","性格","家庭情况","操行等等","特长","标签"};
+		//获取注解当中的值
+		Map<String, List<String>> annotationValue = getAnnotationValue(object);
+		List<String> annotationName = annotationValue.get("annotationName");
+		//获取到的实体注解名称顺序要与excel表头顺序保持一样
+		String[] columnName = annotationName.toArray(new String[]{});
+		Sheet sheet = wb.getSheetAt(0);
+		Row row = sheet.getRow(0);
+		if (row != null && row.getLastCellNum() >= columnName.length) {
+			int lastCellNum = row.getLastCellNum();
+			for (int idx = 0; idx < lastCellNum; idx++) {
+				String value = getCellValue(row.getCell(idx)).trim();
+				if (idx <  columnName.length) {
+					if (StringUtils.isBlank(value) || !columnName[idx].equals(value)) {
+						builder.append("第" + (idx + 1) + "列表头应为" + columnName[idx]+"!");
+					}
+				} else {
+					if (idx ==  columnName.length) {
+						builder.append("导入文件只应该有:"+ columnName.length+"!");
+					}
+				}
+			}
+		} else {
+			builder.append("上传文件首行不能为空,且应与模板文件表头保持一致;");
+		}
+		if(builder.length()>0){
+			builder.append("请下载模板按照模板表头顺序进行上传!");
+			//builder.setCharAt(builder.length()-1, '!');
+		}
+		return builder.toString();
+	}
+
+
+	/**
+	 * 获取cell值
+	 *
+	 * @param cell
+	 * @return
+	 */
+	private static String getCellValue(Cell cell) {
+		String cellValue = "";
+		// 以下是判断数据的类型
+		switch (cell.getCellType()) {
+			case Cell.CELL_TYPE_NUMERIC: // 数字
+				if (DateUtil.isCellDateFormatted(cell)) {
+					SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+					cellValue = sdf.format(DateUtil.getJavaDate(cell.getNumericCellValue())).toString();
+				} else {
+					DataFormatter dataFormatter = new DataFormatter();
+					cellValue = dataFormatter.formatCellValue(cell);
+				}
+				break;
+			case Cell.CELL_TYPE_STRING: // 字符串
+				cellValue = cell.getStringCellValue();
+				break;
+			case Cell.CELL_TYPE_BOOLEAN: // Boolean
+				cellValue = cell.getBooleanCellValue() + "";
+				break;
+			case Cell.CELL_TYPE_FORMULA: // 公式
+				cellValue = cell.getCellFormula() + "";
+				break;
+			case Cell.CELL_TYPE_BLANK: // 空值
+				cellValue = "";
+				break;
+			case Cell.CELL_TYPE_ERROR: // 故障
+				cellValue = "非法字符";
+				break;
+			default:
+				cellValue = "未知类型";
+				break;
+		}
+		return cellValue;
+	}
+	/**
+	 * 获取该注解对象的属性值(字段名称和注解的value值)
+	 * @param object
+	 * @return
+	 */
+	public static Map<String,List<String>> getAnnotationValue(Object object) {
+		Map<String,List<String>>map=new HashMap<>();
+		List<String> fieldList=new ArrayList<>();
+		List<String> annotationList=new ArrayList<>();
+		//StudentVO studentVO = new StudentVO();
+		Field[] fields = object.getClass().getDeclaredFields();
+		for(int i = 0 ; i < fields.length ; i++) {
+			//设置是否允许访问,不是修改原来的访问权限修饰词。
+			fields[i].setAccessible(true);
+			ExcelProperty annotation = fields[i].getAnnotation(ExcelProperty.class);
+			String[] value = annotation.value();
+			for (String s : value) {
+				annotationList.add(s);
+			}
+			fieldList.add(fields[i].getName());
+		}
+		map.put("fieldName",fieldList);
+		map.put("annotationName",annotationList);
+		return map;
+	}
+
+}

+ 6 - 6
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/mapper/OrderMapper.xml

@@ -3256,8 +3256,8 @@ ORDER BY
     <select id="getByOrderQuantity" resultType="org.springblade.purchase.sales.vo.OrderStatisticsVo">
         SELECT
             BGD.brand AS brand,
-            BOI.orderQuantity AS orderQuantity,
-            BOI.actualQuantity AS actualQuantity
+            sum( BOI.orderQuantity ) AS orderQuantity,
+            sum( BOI.actualQuantity ) AS actualQuantity
         FROM
             business_order BO
         LEFT JOIN (
@@ -3280,13 +3280,13 @@ ORDER BY
             AND BO.bill_type = 'XS'
             AND BO.receipt_time IS NOT NULL
             <if test="year != null and year != ''">
-                AND MONTH ( BO.receipt_time ) = #{year}
+                AND YEAR ( BO.receipt_time ) = #{year}
             </if>
             <if test="month != null and month != ''">
-                AND YEAR ( BO.receipt_time ) = #{month}
+                AND MONTH ( BO.receipt_time ) = #{month}
             </if>
-            <if test="corpId !- null and corpId != ''">
-                AND YEAR ( BO.corp_id ) = #{corpId}
+            <if test="corpId != null and corpId != ''">
+                AND BO.corp_id = #{corpId}
             </if>
         </where>
         GROUP BY