Browse Source

Merge remote-tracking branch 'origin/dev' into dev

lijunping 3 years ago
parent
commit
7ce54cee76
16 changed files with 506 additions and 39 deletions
  1. 11 0
      blade-service-api/blade-land-api/src/main/java/org/springblade/land/constant/WxConstant.java
  2. 43 3
      blade-service-api/blade-land-api/src/main/java/org/springblade/land/entity/NcpCheck.java
  3. 5 0
      blade-service-api/blade-purchase-sales-api/src/main/java/org/springblade/purchase/sales/vo/OrderVO.java
  4. 4 4
      blade-service/blade-deliver-goods/src/main/java/org/springblade/deliver/goods/service/impl/DeliveryItemsServiceImpl.java
  5. 4 0
      blade-service/blade-land/pom.xml
  6. 24 12
      blade-service/blade-land/src/main/java/org/springblade/land/controller/NcpCheckController.java
  7. 4 10
      blade-service/blade-land/src/main/java/org/springblade/land/handler/LocateJobHandler.java
  8. 68 0
      blade-service/blade-land/src/main/java/org/springblade/land/handler/WxJobHandler.java
  9. 36 2
      blade-service/blade-land/src/main/java/org/springblade/land/service/INcpCheckService.java
  10. 82 7
      blade-service/blade-land/src/main/java/org/springblade/land/service/impl/NcpCheckServiceImpl.java
  11. 12 0
      blade-service/blade-land/src/main/resources/application.yml
  12. 103 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/excel/orderItemStat.java
  13. 7 1
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/mapper/OrderItemsMapper.java
  14. 55 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/mapper/OrderItemsMapper.xml
  15. 6 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/IOrderItemsService.java
  16. 42 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/impl/OrderItemsServiceImpl.java

+ 11 - 0
blade-service-api/blade-land-api/src/main/java/org/springblade/land/constant/WxConstant.java

@@ -0,0 +1,11 @@
+package org.springblade.land.constant;
+
+public interface WxConstant {
+
+	String LAND_CACHE = "blade:land";
+
+	String WECHAT_TOKEN = "wechat:token:";
+
+	String REQ_SUCCESS = "0";
+
+}

+ 43 - 3
blade-service-api/blade-land-api/src/main/java/org/springblade/land/entity/NcpCheck.java

@@ -27,7 +27,6 @@ import org.springblade.client.entity.CommonFile;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
-import java.time.LocalDateTime;
 import java.util.Date;
 import java.util.List;
 
@@ -61,19 +60,60 @@ public class NcpCheck implements Serializable {
 	@ApiModelProperty(value = "手机号")
 	private String tel;
 	/**
+	 * 箱号一
+	 */
+	@ApiModelProperty(value = "箱号一")
+	private String ctnOne;
+	/**
+	 * 箱号二
+	 */
+	@ApiModelProperty(value = "箱号二")
+	private String ctnTwo;
+	/**
 	 * 租户
 	 */
 	@ApiModelProperty(value = "租户")
 	private String tenantId;
 	/**
-	 * 时间
+	 * 创建人
+	 */
+	@ApiModelProperty(value = "创建人")
+	private Long createUser;
+	/**
+	 * 创建时间
 	 */
-	@ApiModelProperty(value = "时间")
+	@ApiModelProperty(value = "创建时间")
 	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
 	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 	private Date createTime;
+	/**
+	 * 修改人
+	 */
+	@ApiModelProperty(value = "修改人")
+	private Long updateUser;
+	/**
+	 * 修改时间
+	 */
+	@ApiModelProperty(value = "修改时间")
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date updateTime;
+	/**
+	 * 是否已删除(0-否、1-是)
+	 */
+	@ApiModelProperty(value = "是否已删除(0-否、1-是)")
+	private Integer isDeleted;
 
 	@TableField(exist = false)
 	private List<CommonFile> fileList;
 
+	@TableField(exist = false)
+	private String beginCrateTime;
+
+	@TableField(exist = false)
+	private String endCrateTime;
+
+	@TableField(exist = false)
+	private String code;
+
 }

+ 5 - 0
blade-service-api/blade-purchase-sales-api/src/main/java/org/springblade/purchase/sales/vo/OrderVO.java

@@ -127,4 +127,9 @@ public class OrderVO extends Order {
 	 */
 	@ApiModelProperty(value = "查询年")
 	private String annual;
+	/**
+	 * 货物id
+	 */
+	@ApiModelProperty(value = "货物id")
+	private Long itemId;
 }

+ 4 - 4
blade-service/blade-deliver-goods/src/main/java/org/springblade/deliver/goods/service/impl/DeliveryItemsServiceImpl.java

@@ -738,7 +738,7 @@ public class DeliveryItemsServiceImpl extends ServiceImpl<DeliveryItemsMapper, D
 				//原仓库减去库存
 				stock.setOutQuantity(stock.getOutQuantity().add( deliveryItems.getActualQuantity()));//出库数量 加
 				stock.setSurplusRouteQuantity(stock.getSurplusRouteQuantity().subtract(deliveryItems.getActualQuantity()));//可用数量 减
-				stock.setBalanceQuantity(stock.getInQuantity().subtract(stock.getOutQuantity()));//结余数量
+				stock.setBalanceQuantity(stock.getInQuantity().subtract(stock.getOutQuantity()));//结余数量
 				R updateStock = stockGoodsClient.updateStock(stock);
 				if (!updateStock.isSuccess()){
 					throw new RuntimeException("更新库存总账失败");
@@ -750,7 +750,7 @@ public class DeliveryItemsServiceImpl extends ServiceImpl<DeliveryItemsMapper, D
 				}else {
 					serviceStock.setInQuantity(serviceStock.getInQuantity().add( deliveryItems.getActualQuantity()));//入库数量 加
 					serviceStock.setSurplusRouteQuantity(serviceStock.getSurplusRouteQuantity().add(deliveryItems.getActualQuantity()));//可用数量 加
-					serviceStock.setBalanceQuantity(serviceStock.getInQuantity().subtract(serviceStock.getOutQuantity()));//结余数量
+					serviceStock.setBalanceQuantity(serviceStock.getInQuantity().add(serviceStock.getOutQuantity()));//结余数量 加
 					R stockMessage = stockGoodsClient.updateStock(serviceStock);
 					if (!stockMessage.isSuccess()){
 						throw new RuntimeException("更新库存总账失败");
@@ -769,7 +769,7 @@ public class DeliveryItemsServiceImpl extends ServiceImpl<DeliveryItemsMapper, D
 				//新仓库减去库存
 				stock.setInQuantity(stock.getInQuantity().subtract( deliveryItems.getActualQuantity()));//入库数量 减
 				stock.setSurplusRouteQuantity(stock.getSurplusRouteQuantity().subtract(deliveryItems.getActualQuantity()));//可用数量 减
-				stock.setBalanceQuantity(stock.getInQuantity().subtract(stock.getOutQuantity()));//结余数量
+				stock.setBalanceQuantity(stock.getInQuantity().subtract(stock.getOutQuantity()));//结余数量
 				R updateStock = stockGoodsClient.updateStock(stock);
 				if (!updateStock.isSuccess()){
 					throw new RuntimeException("更新库存总账失败");
@@ -781,7 +781,7 @@ public class DeliveryItemsServiceImpl extends ServiceImpl<DeliveryItemsMapper, D
 				}else {
 					serviceStock.setOutQuantity(serviceStock.getOutQuantity().subtract( deliveryItems.getActualQuantity()));//出库数量 减
 					serviceStock.setSurplusRouteQuantity(serviceStock.getSurplusRouteQuantity().add(deliveryItems.getActualQuantity()));//可用数量 加
-					serviceStock.setBalanceQuantity(serviceStock.getInQuantity().subtract(serviceStock.getOutQuantity()));//结余数量
+					serviceStock.setBalanceQuantity(serviceStock.getInQuantity().add(serviceStock.getOutQuantity()));//结余数量 加
 					R stockMessage = stockGoodsClient.updateStock(serviceStock);
 					if (!stockMessage.isSuccess()){
 						throw new RuntimeException("更新库存总账失败");

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

@@ -43,6 +43,10 @@
         </dependency>
         <dependency>
             <groupId>org.springblade</groupId>
+            <artifactId>blade-starter-http</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
             <artifactId>blade-core-boot</artifactId>
         </dependency>
 

+ 24 - 12
blade-service/blade-land/src/main/java/org/springblade/land/controller/NcpCheckController.java

@@ -16,26 +16,25 @@
  */
 package org.springblade.land.controller;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.AllArgsConstructor;
+import org.springblade.client.entity.CommonFile;
 import org.springblade.core.boot.ctrl.BladeController;
 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.Func;
-import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.land.entity.NcpCheck;
 import org.springblade.land.service.INcpCheckService;
 import org.springblade.land.vo.NcpCheckVO;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
+import java.util.List;
 
 /**
  * 陆运疫情审查表 控制器
@@ -69,13 +68,7 @@ public class NcpCheckController extends BladeController {
 	@ApiOperationSupport(order = 2)
 	@ApiOperation(value = "分页", notes = "传入ncpCheck")
 	public R<IPage<NcpCheck>> list(NcpCheck ncpCheck, Query query) {
-		LambdaQueryWrapper<NcpCheck> wrapper = new LambdaQueryWrapper<>();
-		wrapper.like(StringUtil.isNotBlank(ncpCheck.getPlateNo()), NcpCheck::getPlateNo, ncpCheck.getPlateNo())
-			.like(StringUtil.isNotBlank(ncpCheck.getTel()), NcpCheck::getTel, ncpCheck.getTel())
-			.eq(NcpCheck::getTenantId, AuthUtil.getTenantId())
-			.orderByDesc(NcpCheck::getCreateTime);
-		IPage<NcpCheck> pages = ncpCheckService.page(Condition.getPage(query), wrapper);
-		return R.data(pages);
+		return R.data(ncpCheckService.getList(ncpCheck, query));
 	}
 
 	/**
@@ -119,7 +112,6 @@ public class NcpCheckController extends BladeController {
 		return R.status(ncpCheckService.saveOrUpdate(ncpCheck));
 	}
 
-
 	/**
 	 * 删除 陆运疫情审查表
 	 */
@@ -127,7 +119,27 @@ public class NcpCheckController extends BladeController {
 	@ApiOperationSupport(order = 8)
 	@ApiOperation(value = "删除", notes = "传入ids")
 	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
-		return R.status(ncpCheckService.removeByIds(Func.toLongList(ids)));
+		return R.status(ncpCheckService.removeNcpCheck(Func.toLongList(ids)));
+	}
+
+	/**
+	 * 获取手机号
+	 */
+	@PostMapping("/phone")
+	@ApiOperationSupport(order = 9)
+	@ApiOperation(value = "获取手机号", notes = "传入ncpCheck")
+	public R phone(@RequestBody NcpCheck ncpCheck) {
+		return R.data(ncpCheckService.phone(ncpCheck));
+	}
+
+	/**
+	 * 附件上传
+	 */
+	@PostMapping("/file")
+	@ApiOperationSupport(order = 15)
+	@ApiOperation(value = "附件上传", notes = "传入fileList")
+	public R file(@RequestBody List<CommonFile> fileList) {
+		return R.status(ncpCheckService.file(fileList));
 	}
 
 	/**

+ 4 - 10
blade-service/blade-land/src/main/java/org/springblade/land/handler/JobHandler.java → blade-service/blade-land/src/main/java/org/springblade/land/handler/LocateJobHandler.java

@@ -26,7 +26,7 @@ import java.util.concurrent.*;
 
 @Component
 @AllArgsConstructor
-public class JobHandler {
+public class LocateJobHandler {
 
 	private final IOrderItemService orderItemService;
 
@@ -64,7 +64,7 @@ public class JobHandler {
 			);
 
 			for (OrderItem item : itemList) {
-				Future<String> result = pool.submit(() -> {
+				pool.execute(() -> {
 					// 业务处理
 					try {
 						String data = getData(json, token, item.getPlateNo());
@@ -82,21 +82,15 @@ public class JobHandler {
 							track.setCreateTime(new Date());
 							orderTrackService.save(track);
 						}
-						return null;
 					} catch (Exception e) {
 						XxlJobLogger.log(e);
-						return e.getMessage();
 					}
 				});
-
-				if (!StringUtil.isEmpty(result.get())) {
-					return new ReturnT<>(ReturnT.FAIL_CODE, result.get());
-				}
 			}
-			return new ReturnT<>("获取数据成功");
+			return ReturnT.SUCCESS;
 		} catch (Exception e) {
 			XxlJobLogger.log(e);
-			return new ReturnT<>(ReturnT.FAIL_CODE, e.getMessage());
+			return ReturnT.FAIL;
 		} finally {
 			pool.shutdown();
 		}

+ 68 - 0
blade-service/blade-land/src/main/java/org/springblade/land/handler/WxJobHandler.java

@@ -0,0 +1,68 @@
+package org.springblade.land.handler;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.xxl.job.core.biz.model.ReturnT;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import com.xxl.job.core.log.XxlJobLogger;
+import lombok.AllArgsConstructor;
+import org.springblade.core.cache.utils.CacheUtil;
+import org.springblade.core.http.HttpRequest;
+import org.springblade.core.tool.utils.StringUtil;
+import org.springblade.land.constant.WxConstant;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.concurrent.*;
+
+@Component
+@AllArgsConstructor
+public class WxJobHandler {
+
+	@XxlJob("weChatJobHandler")
+	public ReturnT<String> wxJobHandler(String param) throws Exception {
+		// 创建线程池
+		ExecutorService pool = new ThreadPoolExecutor(5, 200, 0L,
+			TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(1024),
+			Executors.defaultThreadFactory(),
+			new ThreadPoolExecutor.AbortPolicy());
+
+		try {
+			List<JSONObject> wxList = JSON.parseArray(param, JSONObject.class);
+			for (JSONObject wx : wxList) {
+				pool.execute(() -> {
+					try {
+						String tenantId = wx.getString("tenantId");
+						String appId = wx.getString("appId");
+						String secret = wx.getString("secret");
+
+						String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + secret;
+						String token = HttpRequest.get(url)
+							.execute()
+							.onSuccess(responseSpec -> {
+								String value = responseSpec.asString();
+								XxlJobLogger.log(value);
+								JSONObject result = JSON.parseObject(value);
+								String errCode = result.getString("errcode");
+								if (StringUtil.isNotBlank(errCode) && !WxConstant.REQ_SUCCESS.equals(errCode)) {
+									throw new RuntimeException("获取token失败:" + result.getString("errmsg"));
+								}
+								return result.getString("access_token");
+							});
+
+						CacheUtil.put(WxConstant.LAND_CACHE, WxConstant.WECHAT_TOKEN, tenantId, token);
+					} catch (Exception e) {
+						XxlJobLogger.log(e);
+					}
+				});
+			}
+			return ReturnT.SUCCESS;
+		} catch (Exception e) {
+			XxlJobLogger.log(e);
+			return ReturnT.FAIL;
+		} finally {
+			pool.shutdown();
+		}
+	}
+
+}

+ 36 - 2
blade-service/blade-land/src/main/java/org/springblade/land/service/INcpCheckService.java

@@ -16,11 +16,12 @@
  */
 package org.springblade.land.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
 import org.springblade.client.entity.CommonFile;
+import org.springblade.core.mp.support.Query;
 import org.springblade.land.entity.NcpCheck;
 import org.springblade.land.vo.NcpCheckVO;
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 
 import java.util.List;
 
@@ -42,6 +43,15 @@ public interface INcpCheckService extends IService<NcpCheck> {
 	IPage<NcpCheckVO> selectNcpCheckPage(IPage<NcpCheckVO> page, NcpCheckVO ncpCheck);
 
 	/**
+	 * 列表 分页
+	 *
+	 * @param ncpCheck
+	 * @param query
+	 * @return
+	 */
+	IPage<NcpCheck> getList(NcpCheck ncpCheck, Query query);
+
+	/**
 	 * 保存
 	 *
 	 * @param ncpCheck
@@ -50,6 +60,30 @@ public interface INcpCheckService extends IService<NcpCheck> {
 	boolean saveNcpCheck(NcpCheck ncpCheck);
 
 	/**
+	 * 删除
+	 *
+	 * @param idList
+	 * @return
+	 */
+	boolean removeNcpCheck(List<Long> idList);
+
+	/**
+	 * 获取手机号
+	 *
+	 * @param ncpCheck
+	 * @return
+	 */
+	String phone(NcpCheck ncpCheck);
+
+	/**
+	 * 附件上传
+	 *
+	 * @param fileList
+	 * @return
+	 */
+	boolean file(List<CommonFile> fileList);
+
+	/**
 	 * 附件列表
 	 *
 	 * @param id

+ 82 - 7
blade-service/blade-land/src/main/java/org/springblade/land/service/impl/NcpCheckServiceImpl.java

@@ -16,21 +16,29 @@
  */
 package org.springblade.land.service.impl;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.seata.spring.annotation.GlobalTransactional;
 import lombok.AllArgsConstructor;
-import org.springblade.client.constant.LandConstant;
 import org.springblade.client.entity.CommonFile;
 import org.springblade.client.feign.ICommonFileClient;
+import org.springblade.core.cache.utils.CacheUtil;
+import org.springblade.core.http.HttpRequest;
+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.ObjectUtil;
+import org.springblade.core.tool.utils.StringUtil;
+import org.springblade.land.constant.WxConstant;
 import org.springblade.land.entity.NcpCheck;
-import org.springblade.land.vo.NcpCheckVO;
 import org.springblade.land.mapper.NcpCheckMapper;
 import org.springblade.land.service.INcpCheckService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.land.vo.NcpCheckVO;
 import org.springframework.stereotype.Service;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
 import java.util.Collections;
 import java.util.Date;
@@ -54,9 +62,28 @@ public class NcpCheckServiceImpl extends ServiceImpl<NcpCheckMapper, NcpCheck> i
 	}
 
 	@Override
+	public IPage<NcpCheck> getList(NcpCheck ncpCheck, Query query) {
+		LambdaQueryWrapper<NcpCheck> wrapper = new LambdaQueryWrapper<>();
+		wrapper.like(StringUtil.isNotBlank(ncpCheck.getPlateNo()), NcpCheck::getPlateNo, ncpCheck.getPlateNo())
+			.like(StringUtil.isNotBlank(ncpCheck.getTel()), NcpCheck::getTel, ncpCheck.getTel())
+			.between(StringUtil.isNotBlank(ncpCheck.getBeginCrateTime()) && StringUtil.isNotBlank(ncpCheck.getEndCrateTime()), NcpCheck::getCreateTime, ncpCheck.getBeginCrateTime(), ncpCheck.getEndCrateTime())
+			.eq(NcpCheck::getTenantId, AuthUtil.getTenantId())
+			.orderByDesc(NcpCheck::getCreateTime);
+		return baseMapper.selectPage(Condition.getPage(query), wrapper);
+	}
+
+	@Override
+	@GlobalTransactional(rollbackFor = Exception.class)
 	public boolean saveNcpCheck(NcpCheck ncpCheck) {
-		ncpCheck.setCreateTime(new Date());
-		baseMapper.insert(ncpCheck);
+		if (ObjectUtil.isEmpty(ncpCheck.getId())) {
+			ncpCheck.setCreateUser(AuthUtil.getUserId());
+			ncpCheck.setCreateTime(new Date());
+			baseMapper.insert(ncpCheck);
+		} else {
+			ncpCheck.setUpdateUser(AuthUtil.getUserId());
+			ncpCheck.setUpdateTime(new Date());
+			baseMapper.updateById(ncpCheck);
+		}
 
 		List<CommonFile> fileList = ncpCheck.getFileList();
 		fileList.forEach(file -> {
@@ -70,6 +97,54 @@ public class NcpCheckServiceImpl extends ServiceImpl<NcpCheckMapper, NcpCheck> i
 	}
 
 	@Override
+	public boolean removeNcpCheck(List<Long> idList) {
+		idList.forEach(id -> {
+			NcpCheck ncpCheck = new NcpCheck();
+			ncpCheck.setId(id);
+			ncpCheck.setIsDeleted(1);
+			baseMapper.updateById(ncpCheck);
+		});
+		return true;
+	}
+
+	@Override
+	public String phone(NcpCheck ncpCheck) {
+		String token = CacheUtil.get(WxConstant.LAND_CACHE, WxConstant.WECHAT_TOKEN, ncpCheck.getTenantId(), String.class);
+		if (StringUtil.isBlank(token)) {
+			throw new RuntimeException("获取请求token失败");
+		}
+
+		JSONObject json = new JSONObject();
+		json.put("code", ncpCheck.getCode());
+
+		return HttpRequest.post("https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + token)
+			.bodyString(json.toJSONString())
+			.execute()
+			.onSuccess(responseSpec -> {
+				JSONObject result = JSON.parseObject(responseSpec.asString());
+				String errCode = result.getString("errcode");
+				if (StringUtil.isNotBlank(errCode) && !WxConstant.REQ_SUCCESS.equals(errCode)) {
+					throw new RuntimeException(result.getString("errmsg"));
+				}
+
+				JSONObject phoneInfo = result.getJSONObject("phone_info");
+				return phoneInfo.getString("purePhoneNumber");
+			});
+	}
+
+	@Override
+	@GlobalTransactional(rollbackFor = Exception.class)
+	public boolean file(List<CommonFile> fileList) {
+		fileList.forEach(file -> {
+			if (ObjectUtil.isEmpty(file.getId())) {
+				file.setSource("LAND_NCP_CHECK");
+			}
+		});
+		commonFileClient.saveList(fileList);
+		return true;
+	}
+
+	@Override
 	public List<CommonFile> fileList(Long id) {
 		R<List<CommonFile>> fileList = commonFileClient.getList(id, "LAND_NCP_CHECK");
 		if (fileList.isSuccess() && fileList.getData() != null) {

+ 12 - 0
blade-service/blade-land/src/main/resources/application.yml

@@ -1,3 +1,15 @@
 #服务器端口
 server:
   port: 9955
+
+xxl:
+  job:
+    accessToken: ''
+    admin:
+      addresses: http://127.0.0.1:10031/xxl-job-admin
+    executor:
+      appname: blade-land
+      ip: 127.0.0.1
+      logpath: applogs/xxl-job/jobhandler
+      logretentiondays: -1
+      port: 10032

+ 103 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/excel/orderItemStat.java

@@ -0,0 +1,103 @@
+package org.springblade.purchase.sales.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 经销商销售统计
+ */
+@Data
+public class orderItemStat implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 行号
+	 */
+	@ExcelProperty(value = "行号")
+	private Long rankNo;
+	/**
+	 *单据日期
+	 */
+	@ExcelProperty(value = "单据日期")
+	private Date businesDate;
+	/**
+	 *单位全名
+	 */
+	@ExcelProperty(value = "单位全名")
+	private String corpName;
+	/**
+	 *商品全名
+	 */
+	@ExcelProperty(value = "商品全名")
+	private String goodName;
+	/**
+	 *规格
+	 */
+	@ExcelProperty(value = "规格")
+	private String typeno;
+	/**
+	 *级别
+	 */
+	@ExcelProperty(value = "级别")
+	private String level;
+	/**
+	 *花纹
+	 */
+	@ExcelProperty(value = "花纹")
+	private String brandItem;
+	/**
+	 *批号
+	 */
+	@ExcelProperty(value = "批号")
+	private String lotNo;
+	/**
+	 *销售数量
+	 */
+	@ExcelProperty(value = "销售数量")
+	private BigDecimal orderQuantity;
+	/**
+	 *单价
+	 */
+	@ExcelProperty(value = "单价")
+	private BigDecimal price;
+	/**
+	 *金额
+	 */
+	@ExcelProperty(value = "金额")
+	private BigDecimal amount;
+	/**
+	 *仓库全名
+	 */
+	@ExcelProperty(value = "仓库全名")
+	private String storageName;
+	/**
+	 *摘要
+	 */
+	@ExcelProperty(value = "摘要")
+	private String remarks;
+	/**
+	 * 仓库id
+	 */
+	private Long storageId;
+	/**
+	 * 客户id
+	 */
+	private Long corpId;
+	/**
+	 * 商品id
+	 */
+	private Long itemId;
+	/**
+	 * 明细id
+	 */
+	private Long id;
+	/**
+	 * 主表id
+	 */
+	private Long pid;
+
+}

+ 7 - 1
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/mapper/OrderItemsMapper.java

@@ -17,7 +17,9 @@
 package org.springblade.purchase.sales.mapper;
 
 import org.apache.ibatis.annotations.Param;
+import org.springblade.purchase.sales.entity.Order;
 import org.springblade.purchase.sales.entity.OrderItems;
+import org.springblade.purchase.sales.excel.orderItemStat;
 import org.springblade.purchase.sales.vo.*;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -153,5 +155,9 @@ public interface OrderItemsMapper extends BaseMapper<OrderItems> {
 	List<OrderSizeVo> orderSize(@Param("tradeType")String tradeType,
 								@Param("billType")String billType,
 								@Param("tenantId")String tenantId);
-
+	/**
+	 * 经销商销售统计
+	 * @return
+	 */
+	List<orderItemStat> orderItemStat(@Param("order")OrderVO order);
 }

+ 55 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/mapper/OrderItemsMapper.xml

@@ -346,4 +346,59 @@ WHERE
         </if>
         GROUP BY bt.size
     </select>
+    <select id="orderItemStat" resultType="org.springblade.purchase.sales.excel.orderItemStat">
+        SELECT
+	        @rank := @rank + 1 AS rankNo,
+	        CURRENT_DATE AS Systemtime,
+	        temp.*
+        FROM
+	    (
+	        SELECT
+		    bo.busines_date AS businesDate,
+		    bo.corp_id AS corpId,
+		    bi.item_id AS itemId,
+		    bi.order_quantity AS orderQuantity,
+		    bi.price AS price,
+		    bi.lot_no AS lotNo,
+		    bi.amount AS amount,
+		    bi.remarks AS remarks,
+		    bi.id AS id,
+		    bi.pid AS pid,
+		    bo.storage_id
+	        FROM
+		    business_order_items bi
+		    LEFT JOIN business_order bo ON bi.pid = bo.id
+	        WHERE
+		    bi.is_deleted = 0
+		    AND bo.is_deleted = 0
+            <if test="order.corpId!=null">
+                and bo.corp_id = #{order.corpId}
+            </if>
+            <if test="order.itemId!=null">
+                and bi.item_id = #{order.itemId}
+            </if>
+            <if test="order.storageId!=null">
+                and bo.storage_id = #{order.storageId}
+            </if>
+            <if test="order.orderNo!=null and order.orderNo != ''">
+                and bo.order_no like CONCAT(CONCAT('%', #{order.orderNo}), '%')
+            </if>
+            <if test="order.billType!=null and order.billType != ''">
+                and bo.bill_type = #{order.billType}
+            </if>
+            <if test="order.tradeType!=null and order.tradeType != ''">
+                and bo.trade_type = #{order.tradeType}
+            </if>
+            <if test="order.tenantId!=null and order.tenantId != ''">
+                and bo.tenant_id = #{order.tenantId}
+            </if>
+            <if test="order.orderStartDate!=null and order.orderStartDate != ''">
+                and bo.busines_date &gt;= #{order.orderStartDate}
+            </if>
+            <if test="order.orderEndDate!=null and order.orderEndDate != ''">
+                and bo.busines_date &lt;= #{order.orderEndDate}
+            </if>
+	    ) temp,
+	    ( SELECT @rank := 0 ) b
+    </select>
 </mapper>

+ 6 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/IOrderItemsService.java

@@ -21,6 +21,7 @@ import org.springblade.purchase.sales.entity.Order;
 import org.springblade.purchase.sales.entity.OrderItems;
 import org.springblade.purchase.sales.excel.DealerOrderItem;
 import org.springblade.purchase.sales.excel.OrderItemsExcel;
+import org.springblade.purchase.sales.excel.orderItemStat;
 import org.springblade.purchase.sales.vo.*;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -148,5 +149,10 @@ public interface IOrderItemsService extends IService<OrderItems> {
 	 * @return
 	 */
 	List<OrderSizeVo> orderSize(Order order);
+	/**
+	 * 经销商销售统计
+	 * @return
+	 */
+	List<orderItemStat> orderItemStat(OrderVO order);
 
 }

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

@@ -22,12 +22,15 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.trade.purchase.order.enums.OrderTypeEnum;
+import jdk.nashorn.internal.ir.annotations.Ignore;
 import lombok.AllArgsConstructor;
 import org.springblade.client.entity.CorpsDesc;
 import org.springblade.client.entity.GoodsDesc;
 import org.springblade.client.entity.GoodsType;
+import org.springblade.client.entity.StorageDesc;
 import org.springblade.client.feign.ICorpsDescClient;
 import org.springblade.client.feign.IGoodsDescClient;
+import org.springblade.client.feign.IStorageClient;
 import org.springblade.client.vo.GoodsDescVO;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
@@ -38,6 +41,7 @@ import org.springblade.purchase.sales.entity.OrderItems;
 import org.springblade.purchase.sales.entity.OrderParts;
 import org.springblade.purchase.sales.excel.DealerOrderItem;
 import org.springblade.purchase.sales.excel.OrderItemsExcel;
+import org.springblade.purchase.sales.excel.orderItemStat;
 import org.springblade.purchase.sales.mapper.OrderItemsMapper;
 import org.springblade.purchase.sales.mapper.OrderPartsMapper;
 import org.springblade.purchase.sales.service.IOrderItemsService;
@@ -88,6 +92,7 @@ public class OrderItemsServiceImpl extends ServiceImpl<OrderItemsMapper, OrderIt
 	private final ISalesPolicyClient salesPolicyClient;
 	//获取客户信息
 	private final ICorpsDescClient corpsDescClient;
+	private IStorageClient iStorageClient;//库区信息
 
 	@Resource
 	private OrderPartsMapper orderPartsMapper;
@@ -476,4 +481,41 @@ public class OrderItemsServiceImpl extends ServiceImpl<OrderItemsMapper, OrderIt
 		return orderSizeVoList;
 	}
 
+	@Override
+	public List<orderItemStat> orderItemStat(OrderVO order) {
+		if (StringUtils.isBlank(order.getTenantId())){
+			order.setTenantId(SecureUtil.getTenantId());
+		}
+		List<orderItemStat> orderItemStatList = baseMapper.orderItemStat(order);
+		if (CollectionUtils.isNotEmpty(orderItemStatList)){
+			orderItemStatList.stream().forEach(e ->{
+				//获取商品信息
+				if (e.getItemId() != null){
+					R<GoodsDescVO> goodsMessage = goodsDescClient.selectGoodsMessage(e.getItemId());
+					if (goodsMessage.isSuccess() && goodsMessage.getData() != null){
+						e.setGoodName(goodsMessage.getData().getCname());//品名
+						e.setTypeno(goodsMessage.getData().getTypeno());//规格
+						e.setLevel(goodsMessage.getData().getLevel());//级别
+						e.setBrandItem(goodsMessage.getData().getBrandItem());//花纹
+					}
+				}
+				//获取仓库信息
+				if (e.getStorageId() != null){
+					StorageDesc storageDesc = iStorageClient.findById(e.getStorageId());
+					if (storageDesc != null){
+						e.setStorageName(storageDesc.getCname());
+					}
+				}
+				//获取客户信息
+				if (e.getCorpId() != null){
+					R<CorpsDesc> corpMessage = corpsDescClient.getCorpMessage(e.getCorpId());
+					if (corpMessage.isSuccess() && corpMessage.getData() != null){
+						e.setCorpName(corpMessage.getData().getCname());
+					}
+				}
+			});
+		}
+		return orderItemStatList;
+	}
+
 }