Ver código fonte

经销商功能编辑

lazhaoqian 3 anos atrás
pai
commit
74b6099397
25 arquivos alterados com 1433 adições e 2 exclusões
  1. 3 1
      blade-ops/blade-swagger/src/main/resources/application-dev.yml
  2. 15 0
      blade-service-api/blade-client-api/src/main/java/org/springblade/client/entity/GoodsDesc.java
  3. 37 1
      blade-service-api/blade-purchase-sales-api/src/main/java/org/springblade/purchase/sales/entity/Order.java
  4. 28 0
      blade-service-api/blade-purchase-sales-api/src/main/java/org/springblade/purchase/sales/entity/OrderItems.java
  5. 5 0
      blade-service-api/trade-finance-api/src/main/java/org/springblade/finance/vojo/Acc.java
  6. 37 0
      blade-service-api/trade-purchase-api/src/main/java/com/trade/purchase/order/entity/Order.java
  7. 40 0
      blade-service-api/trade-purchase-api/src/main/java/com/trade/purchase/order/entity/OrderItems.java
  8. 4 0
      blade-service-api/trade-purchase-api/src/main/java/com/trade/purchase/order/enums/OrderTypeEnum.java
  9. 2 0
      blade-service/blade-client/src/main/java/org/springblade/client/goods/controller/GoodsDescController.java
  10. 2 0
      blade-service/blade-client/src/main/java/org/springblade/client/goods/mapper/GoodsDescMapper.xml
  11. 456 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/dealer/DealerOrderController.java
  12. 8 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/mapper/OrderItemsMapper.java
  13. 16 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/mapper/OrderItemsMapper.xml
  14. 4 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/mapper/OrderMapper.xml
  15. 10 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/IOrderItemsService.java
  16. 7 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/IOrderService.java
  17. 10 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/impl/OrderItemsServiceImpl.java
  18. 101 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/impl/OrderServiceImpl.java
  19. 21 0
      blade-service/blade-stock/src/main/java/org/springblade/stock/controller/StockGoodsController.java
  20. 3 0
      blade-service/blade-stock/src/main/resources/application-dev.yml
  21. 1 0
      blade-service/trade-finance/src/main/java/org/springblade/finance/mapper/AccMapper.xml
  22. 489 0
      blade-service/trade-purchase/src/main/java/com/trade/purchase/dealer/PurchaseDealerOrderController.java
  23. 4 0
      blade-service/trade-purchase/src/main/java/com/trade/purchase/order/mapper/OrderMapper.xml
  24. 6 0
      blade-service/trade-purchase/src/main/java/com/trade/purchase/order/service/IOrderService.java
  25. 124 0
      blade-service/trade-purchase/src/main/java/com/trade/purchase/order/service/impl/OrderServiceImpl.java

+ 3 - 1
blade-ops/blade-swagger/src/main/resources/application-dev.yml

@@ -37,4 +37,6 @@ knife4j:
       - name: 通济学校-工资管理
         uri: 127.0.0.1:1080
         location: /blade-school/v2/api-docs
-
+      - name: 库存账
+        uri: 127.0.0.1:1080
+        location: /blade-stock/v2/api-docs

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

@@ -227,6 +227,21 @@ public class GoodsDesc implements Serializable {
 
 	@TableField(exist = false)
     private String goodsTypeName;
+	/**
+	 * 尺寸
+	 */
+	@ApiModelProperty(value = "尺寸")
+	private String size;
+	/**
+	 * 辅助单位
+	 */
+	@ApiModelProperty(value = "辅助单位")
+	private String assistUnit;
+	/**
+	 * 是否按批次号计算 默认 0 否 1是
+	 */
+	@ApiModelProperty(value = "是否按批次号计算 默认 0 否 1是")
+	private int batch;
 
 
 

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

@@ -763,6 +763,42 @@ public class Order implements Serializable {
 	@ApiModelProperty(value = "费用应付")
 	@TableField(exist = false)
 	private BigDecimal fc;
-
+	/**
+	 * 配送方式
+	 */
+	@ApiModelProperty(value = "配送方式")
+	private String distributionMode;
+	/**
+	 * 打印时间
+	 */
+	@ApiModelProperty(value = "打印时间")
+	private Date printTime;
+	/**
+	 * 打印次数
+	 */
+	@ApiModelProperty(value = "打印次数")
+	private Integer printNumber;
+	/**
+	 * 客户欠款
+	 */
+	@ApiModelProperty(value = "客户欠款")
+	private BigDecimal corpDebt;
+	/**
+	 * 仓库中文名
+	 */
+	@TableField(exist = false)
+	@ApiModelProperty(value = "仓库中文名")
+	private String storageName;
+	/**
+	 * 确认订单标志
+	 */
+	@ApiModelProperty(value = "确认订单标志 1 确认订单 2 取消订单")
+	@TableField(exist = false)
+	private int dealer;
+	/**
+	 * 批次号
+	 */
+	@ApiModelProperty(value = "批次号")
+	private String lotNo;
 
 }

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

@@ -435,5 +435,33 @@ public class OrderItems implements Serializable {
 	@ApiModelProperty(value = "花纹")
 	@TableField(exist = false)
 	private String brandItem;
+	/**
+	 * 规格尺寸1
+	 */
+	@ApiModelProperty(value = "规格尺寸1")
+	@TableField(exist = false)
+	private String specsOne;
+	/**
+	 * 规格尺寸2
+	 */
+	@ApiModelProperty(value = "规格尺寸2")
+	@TableField(exist = false)
+	private String specsTwo;
+	/**
+	 * 尺寸
+	 */
+	@ApiModelProperty(value = "尺寸")
+	@TableField(exist = false)
+	private String size;
+	/**
+	 * 批次号
+	 */
+	@ApiModelProperty(value = "批次号")
+	private String lotNo;
+	/**
+	 * 是否按批次号计算 默认 0 否 1是
+	 */
+	@ApiModelProperty(value = "是否按批次号计算 默认 0 否 1是")
+	private int batch;
 
 }

+ 5 - 0
blade-service-api/trade-finance-api/src/main/java/org/springblade/finance/vojo/Acc.java

@@ -311,5 +311,10 @@ public class Acc implements Serializable {
 
 	@TableField(exist = false)
 	private Integer checkStatus;
+	/**
+	 * 商品名称
+	 */
+	@ApiModelProperty(value = "商品名称")
+	private String goodName;
 
 }

+ 37 - 0
blade-service-api/trade-purchase-api/src/main/java/com/trade/purchase/order/entity/Order.java

@@ -618,5 +618,42 @@ public class Order extends OrderBase {
 	private BigDecimal refundForeignSettlmentAmount;
 
 	private String belongCompany;
+	/**
+	 * 配送方式
+	 */
+	@ApiModelProperty(value = "配送方式")
+	private String distributionMode;
+	/**
+	 * 打印时间
+	 */
+	@ApiModelProperty(value = "打印时间")
+	private Date printTime;
+	/**
+	 * 打印次数
+	 */
+	@ApiModelProperty(value = "打印次数")
+	private Integer printNumber;
+	/**
+	 * 客户欠款
+	 */
+	@ApiModelProperty(value = "客户欠款")
+	private BigDecimal corpDebt;
+	/**
+	 * 仓库中文名
+	 */
+	@TableField(exist = false)
+	@ApiModelProperty(value = "仓库中文名")
+	private String storageName;
+	/**
+	 * 确认订单标志
+	 */
+	@ApiModelProperty(value = "确认订单标志 1 确认订单 2 取消订单")
+	@TableField(exist = false)
+	private int dealer;
+	/**
+	 * 批次号
+	 */
+	@ApiModelProperty(value = "批次号")
+	private String lotNo;
 
 }

+ 40 - 0
blade-service-api/trade-purchase-api/src/main/java/com/trade/purchase/order/entity/OrderItems.java

@@ -390,4 +390,44 @@ public class OrderItems extends OrderBase {
 	private BigDecimal integralMultiples;
 	@ApiModelProperty(value = "商品叫赠送积分 赠品叫兑换积分")
 	private BigDecimal integral;
+	/**
+	 * 花纹
+	 */
+	@ApiModelProperty(value = "花纹")
+	@TableField(exist = false)
+	private String brandItem;
+	/**
+	 * 规格尺寸1
+	 */
+	@ApiModelProperty(value = "规格尺寸1")
+	@TableField(exist = false)
+	private String specsOne;
+	/**
+	 * 规格尺寸2
+	 */
+	@ApiModelProperty(value = "规格尺寸2")
+	@TableField(exist = false)
+	private String specsTwo;
+	/**
+	 * 尺寸
+	 */
+	@ApiModelProperty(value = "尺寸")
+	@TableField(exist = false)
+	private String size;
+	/**
+	 * 英文名称
+	 */
+	@ApiModelProperty(value = "英文名称")
+	@TableField(exist = false)
+	private String ename;
+	/**
+	 * 批次号
+	 */
+	@ApiModelProperty(value = "批次号")
+	private String lotNo;
+	/**
+	 * 是否按批次号计算 默认 0 否 1是
+	 */
+	@ApiModelProperty(value = "是否按批次号计算 默认 0 否 1是")
+	private int batch;
 }

+ 4 - 0
blade-service-api/trade-purchase-api/src/main/java/com/trade/purchase/order/enums/OrderTypeEnum.java

@@ -63,6 +63,10 @@ public enum OrderTypeEnum {
 	 *  出口
 	 */
 	EXPORT("CK"),
+	/**
+	 * 经销商
+	 */
+	DEALER("JXS")
 
 
 

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

@@ -120,6 +120,7 @@ public class GoodsDescController extends BladeController {
 	public R<?> list(@RequestParam(name = "current", defaultValue = "1") Integer current,
 					 @RequestParam(name = "size", defaultValue = "10") Integer size,
 					 @RequestParam(name = "cname", required = false) String cname,
+					 @RequestParam(name = "ename", required = false) String ename,
 					 @RequestParam(name = "code", required = false) String code,
 					 @RequestParam(name = "goodsTypeId", required = false) String goodsTypeId,
 					 @RequestParam(name = "belongToCorpId", required = false) String belongToCorpId) {
@@ -154,6 +155,7 @@ public class GoodsDescController extends BladeController {
 
 		goodsDescLambdaQueryWrapper
 			.like(!StringUtils.isBlank(cname), GoodsDesc::getCname, cname)
+			.like(!StringUtils.isBlank(ename), GoodsDesc::getEname, ename)
 			.like(!StringUtils.isBlank(code), GoodsDesc::getCode, code)
 			.eq(GoodsDesc::getTenantId, AuthUtil.getTenantId())
 			.eq(GoodsDesc::getType, 0)

+ 2 - 0
blade-service/blade-client/src/main/java/org/springblade/client/goods/mapper/GoodsDescMapper.xml

@@ -58,6 +58,8 @@
         <result column="corp_name" property="corpName"/>
         <result column="integral_multiples" property="integralMultiples"/>
         <result column="integral" property="integral"/>
+        <result column="size" property="size"/>
+        <result column="assist_unit" property="assistUnit"/>
     </resultMap>
 
 

+ 456 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/dealer/DealerOrderController.java

@@ -0,0 +1,456 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.purchase.sales.dealer;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.metadata.OrderItem;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.trade.purchase.order.enums.OrderTypeEnum;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.AllArgsConstructor;
+import org.springblade.client.entity.CorpsDesc;
+import org.springblade.client.entity.FeesDesc;
+import org.springblade.client.entity.StorageDesc;
+import org.springblade.client.feign.ICorpsDescClient;
+import org.springblade.client.feign.IFeesDescClient;
+import org.springblade.client.feign.IStorageClient;
+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.secure.utils.SecureUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.StringUtil;
+import org.springblade.deliver.goods.entity.Delivery;
+import org.springblade.deliver.goods.feign.IDeliveryClient;
+import org.springblade.finance.feign.IFinanceClient;
+import org.springblade.finance.vojo.Acc;
+import org.springblade.purchase.sales.entity.Order;
+import org.springblade.purchase.sales.entity.OrderFees;
+import org.springblade.purchase.sales.entity.OrderItems;
+import org.springblade.purchase.sales.service.*;
+import org.springblade.purchase.sales.vo.OrderItemsVO;
+import org.springblade.purchase.sales.vo.OrderStatisticAnalysisVO;
+import org.springblade.purchase.sales.vo.OrderVO;
+import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 国内销售或采购订单表 控制器
+ *
+ * @author BladeX
+ * @since 2021-09-26
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/dealerOrder")
+@Api(value = "经销商销售订单", tags = "经销商销售订单")
+public class DealerOrderController extends BladeController {
+
+	private final IOrderService orderService;
+	private final IOrderItemsService orderItemsService;
+	private final IOrderFeesService orderFeesService;
+	private final IOrderFilesService orderFilesService;
+	private final IOrderFreightService orderFreightService;
+	private final IOrderModifyService orderModifyService;
+	private final IOrderPartsService orderPartsService;
+	private final ICorpsDescClient corpsDescClient;//获取客户信息
+	private final IUserClient userClient;//获取用户信息
+	private final IFeesDescClient feesDescClient;
+	private final IFinanceClient iFinanceClient;
+	private final IDeliveryClient deliveryClient;
+	private IStorageClient iStorageClient;//库区信息
+
+
+	/**
+	 * 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入order")
+	public R<Order> detail(Order order) {
+		order.setIsDeleted(0);
+		order.setTenantId(SecureUtil.getTenantId());
+		Order detail = orderService.getOrderMessage(order);
+		return R.data(detail);
+	}
+
+	/**
+	 * 经销商销售或采购订单表
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入order")
+	public R<IPage<Order>> list(Order order, Query query) {
+		order.setIsDeleted(0);
+		order.setTenantId(SecureUtil.getTenantId());
+		order.setBillType(OrderTypeEnum.SALES.getType());
+		order.setTradeType(OrderTypeEnum.DEALER.getType());
+		IPage<Order> pages = orderService.page(Condition.getPage(query), Condition.getQueryWrapper(order));
+		return R.data(pages);
+	}
+
+	/**
+	 * 自定义分页 销售或采购订单表
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入order")
+	public R<IPage<Order>> page(OrderVO order, Query query) {
+		LambdaQueryWrapper<Order> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(Order::getTenantId, SecureUtil.getTenantId());//租户id
+		lambdaQueryWrapper.eq(Order::getIsDeleted, 0);//订单是否有效
+		lambdaQueryWrapper.eq(Order::getBillType, OrderTypeEnum.SALES.getType());//订单类型
+		lambdaQueryWrapper.eq(Order::getTradeType, OrderTypeEnum.DEALER.getType());//贸易类型
+		lambdaQueryWrapper.like(Func.isNotEmpty(order.getOrderNo()), Order::getOrderNo, order.getOrderNo());//订单号
+		lambdaQueryWrapper.like(Func.isNotEmpty(order.getCorpId()), Order::getCorpId, order.getCorpId());//客户id
+		lambdaQueryWrapper.ge(Func.isNotEmpty(order.getContractStartDate()), Order::getBusinesDate, order.getContractStartDate());//合同日期开始
+		lambdaQueryWrapper.le(Func.isNotEmpty(order.getContractEndDate()), Order::getBusinesDate, order.getContractEndDate());//合同日期结束
+		lambdaQueryWrapper.like(Func.isNotEmpty(order.getSrcOrderNo()), Order::getSrcOrderNo, order.getSrcOrderNo());//订单来源
+		lambdaQueryWrapper.like(Func.isNotEmpty(order.getShippingAddress()), Order::getShippingAddress, order.getShippingAddress());//发货地址
+		lambdaQueryWrapper.like(Func.isNotEmpty(order.getArrivalAddress()), Order::getArrivalAddress, order.getArrivalAddress());//到货地址
+		lambdaQueryWrapper.ge(Func.isNotEmpty(order.getActualDeliveryDateStart()), Order::getActualDeliveryDate, order.getActualDeliveryDateStart());//发货日期开始
+		lambdaQueryWrapper.le(Func.isNotEmpty(order.getActualDeliveryDateEnd()), Order::getActualDeliveryDate, order.getActualDeliveryDateEnd());//发货日期结束
+		lambdaQueryWrapper.ge(Func.isNotEmpty(order.getDeliveryStartDate()), Order::getRequiredDeliveryDate, order.getDeliveryStartDate());//要求发货日期开始
+		lambdaQueryWrapper.le(Func.isNotEmpty(order.getDeliveryEndDate()), Order::getRequiredDeliveryDate, order.getDeliveryEndDate());//要求发货日期结束
+		lambdaQueryWrapper.ge(Func.isNotEmpty(order.getArrivalDateStart()), Order::getRequiredArrivalDate, order.getArrivalDateStart());//要求到货日期开始
+		lambdaQueryWrapper.le(Func.isNotEmpty(order.getArrivalDateEnd()), Order::getRequiredArrivalDate, order.getArrivalDateEnd());//要求到货日期结束
+		lambdaQueryWrapper.like(Func.isNotEmpty(order.getOrderStatus()), Order::getOrderStatus, order.getOrderStatus());//单据状态
+		lambdaQueryWrapper.like(Func.isNotEmpty(order.getSysNo()), Order::getSysNo, order.getSysNo());//系统编号
+		lambdaQueryWrapper.eq(Func.isNotEmpty(order.getCreateUser()), Order::getCreateUser, order.getCreateUser());//制单人
+		lambdaQueryWrapper.ge(Func.isNotEmpty(order.getCreateTimeStart()), Order::getCreateTime, order.getCreateTimeStart());//制单日期开始
+		lambdaQueryWrapper.le(Func.isNotEmpty(order.getCreateTimeEnd()), Order::getCreateTime, order.getCreateTimeEnd());//制单日期结束
+		lambdaQueryWrapper.ge(Func.isNotEmpty(order.getDateValidityStart()), Order::getDateValidity, order.getDateValidityStart());//有效日期开始
+		lambdaQueryWrapper.le(Func.isNotEmpty(order.getDateValidityEnd()), Order::getDateValidity, order.getDateValidityEnd());//有效日期结束
+		lambdaQueryWrapper.ge(Func.isNotEmpty(order.getOrderStartDate()), Order::getBusinesDate, order.getOrderStartDate());//订单日期开始
+		lambdaQueryWrapper.le(Func.isNotEmpty(order.getOrderEndDate()), Order::getBusinesDate, order.getOrderEndDate());//订单日期结束
+		lambdaQueryWrapper.like(Func.isNotEmpty(order.getPortOfLoad()), Order::getPortOfLoad, order.getPortOfLoad());//装货港
+		lambdaQueryWrapper.like(Func.isNotEmpty(order.getPortOfDestination()), Order::getPortOfDestination, order.getPortOfDestination());//目的港
+		lambdaQueryWrapper.like(Func.isNotEmpty(order.getPlannedDeliveryStart()), Order::getPlannedDeliveryDate, order.getPlannedDeliveryStart());//计划交货开始
+		lambdaQueryWrapper.like(Func.isNotEmpty(order.getPlannedDeliveryEnd()), Order::getPlannedDeliveryDate, order.getPlannedDeliveryEnd());//计划交货结束
+		lambdaQueryWrapper.like(Func.isNotEmpty(order.getOrderRemark()), Order::getOrderRemark, order.getOrderRemark());//备注
+		lambdaQueryWrapper.orderByDesc(Order::getId);
+		IPage<Order> page = orderService.page(Condition.getPage(query), lambdaQueryWrapper);
+		if (CollectionUtils.isNotEmpty(page.getRecords())) {
+			page.getRecords().stream().forEach(item -> {
+				if (item.getCorpId() != null) {
+					R<CorpsDesc> corpMessage = corpsDescClient.getCorpMessage(item.getCorpId());//客户
+					if (corpMessage.isSuccess() && corpMessage.getData() != null) {
+						item.setCorpsName(corpMessage.getData().getCname());
+					}
+				}
+				if (item.getBelongToCorpId() != null) {
+					R<CorpsDesc> corpMessage = corpsDescClient.getCorpMessage(item.getBelongToCorpId());//销售公司
+					if (corpMessage.isSuccess() && corpMessage.getData() != null) {
+						item.setBelongToCorpName(corpMessage.getData().getCname());
+					}
+				}
+				if (item.getProductionPlant() != null) {
+					R<CorpsDesc> corpMessage = corpsDescClient.getCorpMessage(item.getProductionPlant());//销售公司
+					if (corpMessage.isSuccess() && corpMessage.getData() != null) {
+						item.setProductionPlantName(corpMessage.getData().getCname());
+					}
+				}
+				R<User> user = userClient.userInfoById(item.getCreateUser());//制单人
+				if (user.isSuccess() && user.getData() != null) {
+					item.setCreateUserName(user.getData().getName());
+				}
+				//仓库信息
+				StorageDesc storageDesc = iStorageClient.findById(item.getStorageId());
+				if(storageDesc!=null)
+				{
+					item.setStorageName(storageDesc.getCname());
+				}
+				//获取订单明细
+				List<OrderItems> list = orderItemsService.list(new QueryWrapper<OrderItems>().eq("pid", item.getId()).eq("is_deleted", 0));
+				if (CollectionUtils.isNotEmpty(list)) {
+					item.setOrderQuantity(list.stream().map(OrderItems::getOrderQuantity).reduce(BigDecimal.ZERO, BigDecimal::add));//数量合计
+					item.setAmount(list.stream().map(OrderItems::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add));//销售金额
+					item.setPurchaseAmount(list.stream().map(OrderItems::getPurchaseAmount).reduce(BigDecimal.ZERO, BigDecimal::add));//采购金额
+					item.setActualQuantity(list.stream().map(OrderItems::getActualQuantity).reduce(BigDecimal.ZERO, BigDecimal::add));//发货数量
+					item.setActualWeight(list.stream().map(OrderItems::getActualWeight).reduce(BigDecimal.ZERO, BigDecimal::add));//已发重量(吨)
+				}
+			});
+		}
+		return R.data(page);
+	}
+
+	/**
+	 * 新增 销售或采购订单表
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入order")
+	public R save(@Valid @RequestBody Order order) {
+		return R.status(orderService.save(order));
+	}
+
+	/**
+	 * 修改 销售或采购订单表
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入order")
+	public R update(@Valid @RequestBody Order order) {
+		if (order.getId() == null) {
+			throw new SecurityException("请选择要删除的数据");
+		}
+		//先查订单信息
+		Order orderMessage = orderService.getById(order.getId());
+		//是否生成采购单
+		LambdaQueryWrapper<Order> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(Order::getSrcOrderNo, orderMessage.getSysNo());
+		lambdaQueryWrapper.eq(Order::getTradeType, OrderTypeEnum.DEALER.getType());
+		lambdaQueryWrapper.eq(Order::getIsDeleted, 0);
+		lambdaQueryWrapper.eq(Order::getBillType, OrderTypeEnum.PURCHASE.getType());
+		List<Order> orderList = orderService.list(lambdaQueryWrapper);
+		if (CollectionUtils.isNotEmpty(orderList)) {
+			throw new SecurityException("销售单已生成采购单不能删除");
+		}
+		//是否生成发货单
+		List<Delivery> list = deliveryClient.getOrderMessage(orderMessage.getSysNo(), OrderTypeEnum.DEALER.getType());
+		if (CollectionUtils.isNotEmpty(list)) {
+			throw new SecurityException("销售单已生成发货单不能删除");
+		}
+		//是否生成账单单
+		List<Acc> financeAcc = iFinanceClient.getFinanceAccList(orderMessage.getOrderNo(), OrderTypeEnum.DEALER.getType());
+		if (CollectionUtils.isNotEmpty(financeAcc)) {
+			throw new SecurityException("销售单已生成账单不能删除");
+		}
+		order.setIsDeleted(1);
+		orderService.updateById(order);
+		orderItemsService.updateByPid(order.getId());
+		orderFeesService.updateByPid(order.getId());
+		orderFilesService.updateByPid(order.getId());
+		orderFreightService.updateByPid(order.getId());
+		orderModifyService.updateByPid(order.getId());
+		orderPartsService.updateByPid(order.getId());
+		return R.success("操作成功");
+	}
+
+	/**
+	 * 新增或修改 经销商销售或采购订单表
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入order")
+	public R submit(@Valid @RequestBody Order order) {
+		order.setBillType(OrderTypeEnum.SALES.getType());
+		order.setTradeType(OrderTypeEnum.DEALER.getType());
+		return orderService.saveOrderMessage(order);
+	}
+
+
+	/**
+	 * 删除 销售或采购订单表
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(orderService.removeByIds(Func.toLongList(ids)));
+	}
+
+	/**
+	 * 经销商销售单生成发货单
+	 *
+	 * @param order
+	 * @return
+	 */
+	@PostMapping("/deliverGoods")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "经销商销售单生成发货单", notes = "传入主订单id,明细ids")
+	public R deliverGoods(@Valid @RequestBody Order order) {
+		if (order.getId() == null) {
+			return R.fail(500, "参数缺失");
+		}
+		if (CollectionUtils.isEmpty(order.getOrderItemIds())) {
+			return R.fail(500, "请选择要发货的商品明细");
+		}
+		order.setBillType(OrderTypeEnum.SALES.getType());
+		order.setTradeType(OrderTypeEnum.DEALER.getType());
+		return R.data(orderService.deliverGoods(order));
+	}
+
+	/**
+	 * 发货单获取订单明细
+	 *
+	 * @param query          分页参数
+	 * @param orderNo        订单号或合同号
+	 * @param corpId         客户id
+	 * @param orderStartDate 时间开始时间
+	 * @param orderEndDate   时间结束时间
+	 * @return
+	 */
+	@GetMapping("/orderItemsList")
+	@ApiOperationSupport(order = 10)
+	@ApiOperation(value = "发货单获取订单明细", notes = "传入orderItems")
+	public R<IPage<OrderItemsVO>> orderItemsList(Query query,
+												 @RequestParam(value = "orderNo", required = false) String orderNo,
+												 @RequestParam(value = "corpId", required = false) Long corpId,
+												 @RequestParam(value = "orderStartDate", required = false) String orderStartDate,
+												 @RequestParam(value = "orderEndDate", required = false) String orderEndDate) {
+		String tradeType = OrderTypeEnum.DEALER.getType();
+		String billType = OrderTypeEnum.SALES.getType();
+		String tenantId = SecureUtil.getTenantId();
+		IPage<OrderItemsVO> pages = orderItemsService.orderItemsList(Condition.getPage(query), orderNo, corpId, orderStartDate, orderEndDate,
+			tradeType, billType, tenantId);
+		return R.data(pages);
+	}
+
+	/**
+	 * 经销商销售单生成采购单
+	 *
+	 * @param order
+	 * @return
+	 */
+	@PostMapping("/createMarket")
+	@ApiOperationSupport(order = 9)
+	@ApiOperation(value = "经销商销售单生成采购单")
+	public R createMarket(@Valid @RequestBody Order order) {
+		if (order.getId() == null) {
+			return R.fail(500, "参数缺失");
+		}
+		order.setBillType(OrderTypeEnum.PURCHASE.getType());
+		order.setTradeType(OrderTypeEnum.DEALER.getType());
+		return R.data(orderService.createMarket(order));
+	}
+	@PostMapping("checkOrder")
+	public R checkOrder(@RequestBody Order order) {
+
+		orderService.checkOrder(order);
+		return R.data("操作成功");
+	}
+
+	/**
+	 * 审核通过
+	 */
+	@PostMapping("/passCheck")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "Feign-审核通过", notes = "传入财务id")
+	public R passCheck(@ApiParam(value = "财务主表id", required = true) @RequestParam Long id) {
+		orderService.passCheck(id);
+		return R.success("操作成功");
+	}
+
+	/**
+	 * 审核不通过
+	 */
+	@PostMapping("/passCancel")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "Feign-审核不通过", notes = "传入财务id")
+	public R passCancel(@ApiParam(value = "财务主表id", required = true) @RequestParam Long id) {
+		orderService.passCancel(id);
+		return R.success("操作成功");
+	}
+
+	/**
+	 * 更换审批人
+	 */
+	@GetMapping("/changeAuditUser")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "Feign-更换审批人", notes = "传入财务id")
+	public R changeAuditUser(@ApiParam(value = "审批id", required = true) @RequestParam Long auditId,
+							 @ApiParam(value = "更改的审批人id", required = true) @RequestParam String auditUserId) {
+		if (auditId == null || StringUtil.isBlank(auditUserId)) {
+			throw new SecurityException("参数异常,更改审批人失败");
+		}
+		orderService.changeAuditUser(auditId, auditUserId);
+		return R.success("操作成功");
+	}
+
+	/**
+	 * 库存账查询锁定库存订单信息
+	 */
+	@GetMapping("/ListMessage")
+	@ApiOperationSupport(order = 9)
+	@ApiOperation(value = "库存账查询锁定库存订单信息", notes = "传入order")
+	public R<IPage<OrderVO>> ListMessage(Query query, @RequestParam("itemId") Long itemId,
+										 @RequestParam("corpId") Long corpId) {
+		IPage<OrderVO> pages = orderService.orderInventory(Condition.getPage(query), SecureUtil.getTenantId(), OrderTypeEnum.DEALER.getType(), OrderTypeEnum.SALES.getType(), itemId, corpId);
+		if (CollectionUtils.isNotEmpty(pages.getRecords())) {
+			pages.getRecords().stream().forEach(item -> {
+				R<CorpsDesc> corpMessage = corpsDescClient.getCorpMessage(item.getCorpId());
+				if (corpMessage.isSuccess() && corpMessage.getData() != null) {
+					item.setCorpsName(corpMessage.getData().getCname());
+				}
+			});
+		}
+		return R.data(pages);
+	}
+	/**
+	 * 更改打印时间和打印次数
+	 */
+	@GetMapping("/print")
+	@ApiOperationSupport(order = 11)
+	@ApiOperation(value = "更改打印时间和打印次数", notes = "传入order")
+	public R<Order> print(Order order) {
+		if (order.getId() == null){
+			throw new SecurityException("请选择要打印的单据");
+		}
+		Order service = orderService.getById(order.getId());
+		service.setPrintNumber(service.getPrintNumber() +1);
+		service.setPrintTime(new Date());
+		return R.status(orderService.updateById(service));
+	}
+	/**
+	 * 确认或取消订单
+	 */
+	@GetMapping("/dealerSubmit")
+	@ApiOperationSupport(order = 12)
+	@ApiOperation(value = "确认或取消订单", notes = "传入order")
+	public R<Order> dealerSubmit(Order order) {
+		if (order.getDealer() != 1 && order.getDealer() != 2){
+			throw new SecurityException("缺少必要的参数");
+		}
+		if (order.getId() == null){
+			throw new SecurityException("缺少必要的参数");
+		}
+		return orderService.dealerSubmit(order);
+	}
+	/**
+	 * 获取商品对应的批次号
+	 */
+	@GetMapping("/lotNo")
+	@ApiOperationSupport(order = 13)
+	@ApiOperation(value = "获取商品对应的批次号", notes = "传入order")
+	public R<List<Map<String,Object>>> lotNo(@ApiParam(value = "itemId", required = true) @RequestParam Long itemId,
+							  @ApiParam(value = "storageId", required = true) @RequestParam Long storageId,
+											 @ApiParam(value = "tradeType", required = true) @RequestParam String tradeType) {
+		if (itemId == null || storageId == null || StringUtil.isBlank(tradeType)){
+			throw new SecurityException("缺少必要的参数");
+		}
+		return R.data(orderItemsService.lotNo(itemId,storageId,tradeType));
+	}
+
+}

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

@@ -73,5 +73,13 @@ public interface OrderItemsMapper extends BaseMapper<OrderItems> {
 	 * @return
 	 */
 	List<OrderItems> 	getProfitItem(@Param("pid") Long pid);
+	/**
+	 * 根据商品id 和仓库id 贸易类型 获取批次号
+	 * @param itemId
+	 * @param storageId
+	 * @param tradeType
+	 * @return
+	 */
+	List<Map<String, Object>> lotNo(@Param("itemId")Long itemId, @Param("storageId")Long storageId, @Param("tradeType")String tradeType);
 
 }

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

@@ -198,4 +198,20 @@
     WHERE is_deleted = 0
     AND pid = #{pid}
     </select>
+    <select id="lotNo" resultType="map">
+        SELECT
+	b.lot_no AS lotNo
+FROM
+	business_order a,
+	business_order_items b
+WHERE
+	b.pid = a.id
+	AND a.is_deleted = 0
+	AND b.is_deleted = 0
+	AND a.bill_type = 'CG'
+	AND b.lot_no IS NOT NULL
+	AND b.item_id = #{itemId}
+	AND a.storage_id = #{storageId}
+	AND a.trade_type = #{tradeType}
+    </select>
 </mapper>

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

@@ -104,6 +104,10 @@
         <result column="convert_integral" property="convertIntegral"/>
         <result column="presenter_integral" property="presenterIntegral"/>
         <result column="case_over_payment" property="caseOverPayment"/>
+        <result column="distribution_mode" property="distributionMode"/>
+        <result column="print_time" property="printTime"/>
+        <result column="print_number" property="printNumber"/>
+        <result column="corp_debt" property="corpDebt"/>
     </resultMap>
 
 

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

@@ -25,6 +25,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
 import java.util.List;
+import java.util.Map;
 
 
 /**
@@ -84,4 +85,13 @@ public interface IOrderItemsService extends IService<OrderItems> {
 	 */
 	List<OrderItems> getProfitItem(Long id);
 
+	/**
+	 * 根据商品id 和仓库id 贸易类型 获取批次号
+	 * @param itemId
+	 * @param storageId
+	 * @param tradeType
+	 * @return
+	 */
+	List<Map<String,Object>> lotNo(Long itemId,Long storageId,String tradeType);
+
 }

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

@@ -117,4 +117,11 @@ public interface IOrderService extends IService<Order> {
 	 * @return
 	 */
 	IPage<OrderVO> orderInventory(IPage<OrderVO> page, String tenantId, String tradeType, String billType, Long itemId, Long corpId);
+
+	/**
+	 * 经销商确认销售订单
+	 * @param order
+	 * @return
+	 */
+	R dealerSubmit(Order order);
 }

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

@@ -49,6 +49,7 @@ import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 订单明细表 服务实现类
@@ -195,6 +196,10 @@ public class OrderItemsServiceImpl extends ServiceImpl<OrderItemsMapper, OrderIt
 						item.setSpecificationAndModel(goodsMessage.getData().getSpecificationAndModel());
 						item.setEname(goodsMessage.getData().getEname());
 						item.setBrandItem(goodsMessage.getData().getBrandItem());
+						item.setSize(goodsMessage.getData().getSize());
+						item.setSpecsOne(goodsMessage.getData().getSpecsOne());
+						item.setSpecsTwo(goodsMessage.getData().getSpecsTwo());
+
 					}
 				}
 				//如果是出口贸易获取订单明细的配件信息
@@ -265,4 +270,9 @@ public class OrderItemsServiceImpl extends ServiceImpl<OrderItemsMapper, OrderIt
 		return profitItem;
 	}
 
+	@Override
+	public List<Map<String, Object>> lotNo(Long itemId, Long storageId, String tradeType) {
+		return baseMapper.lotNo(itemId,storageId,tradeType);
+	}
+
 }

+ 101 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/impl/OrderServiceImpl.java

@@ -35,7 +35,9 @@ import org.springblade.client.entity.BasicCorpsProfitChange;
 import org.springblade.client.entity.CorpsDesc;
 import org.springblade.client.feign.ICorpsDescClient;
 import org.springblade.client.feign.ICorpsProfitChangeClient;
+import org.springblade.client.feign.IGoodsDescClient;
 import org.springblade.client.feign.ISerialClient;
+import org.springblade.client.vo.GoodsDescVO;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
@@ -48,6 +50,7 @@ import org.springblade.purchase.sales.vo.OrderStatisticAnalysisVO;
 import org.springblade.purchase.sales.vo.OrderVO;
 import org.springblade.stock.entity.StockGoods;
 import org.springblade.stock.feign.IStockGoodsClient;
+import org.springblade.stock.vo.StockGoodsVO;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
 import org.springframework.stereotype.Service;
@@ -81,6 +84,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 	private final ICheckClient iCheckClient;
 	private ICorpsProfitChangeClient corpsProfitChangeClient;
 	private IStockGoodsClient stockGoodsClient;
+	private IGoodsDescClient goodsDescClient;
 
 	@Override
 	public IPage<OrderVO> selectOrderPage(IPage<OrderVO> page, OrderVO order) {
@@ -295,6 +299,13 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 		}
 		//获取订单明细信息
 		List<OrderItems> orderItemsList = orderItemsService.getOrderItems(orderMessage);
+		if (CollectionUtils.isNotEmpty(orderItemsList)){
+			BigDecimal orderQuantity = orderItemsList.stream().filter(it -> it.getOrderQuantity() != null)
+				.map(OrderItems::getOrderQuantity)
+				.reduce(BigDecimal.ZERO, BigDecimal::add);
+			orderMessage.setOrderQuantity(orderQuantity);
+			orderMessage.setAmount(orderItemsList.stream().filter(e -> e.getAmount() != null).map(OrderItems::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add));//销售金额
+		}
 		orderMessage.setOrderItemsList(orderItemsList);
 		//获取订单费用信息
 		List<OrderFees> orderFeesList = orderFeesService.getOrderFees(order);
@@ -831,4 +842,94 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 		return page.setRecords(baseMapper.orderInventory(page, tenantId, tradeType, billType, itemId, corpId));
 	}
 
+	/**
+	 *
+	 * @param order
+	 * @return
+	 */
+	@Override
+	@GlobalTransactional
+	@Transactional(rollbackFor = Exception.class)
+	public R dealerSubmit(Order order) {
+		// dealer 1 确认订单 2 取消订单
+		Order selectById = baseMapper.selectById(order.getId());
+		LambdaQueryWrapper<OrderItems> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.eq(OrderItems::getPid,order.getId());
+		queryWrapper.eq(OrderItems::getIsDeleted,0);
+		queryWrapper.eq(OrderItems::getTenantId,SecureUtil.getTenantId());
+		List<OrderItems> list = orderItemsService.list(queryWrapper);
+		//先判断订单状态 0 录入 1 审批 2 审批中 3 审批完成/确认订单
+		if (order.getDealer() == 1){
+			if (selectById.getStatus() != 0){
+				throw  new RuntimeException("当前单据状态不支持确认订单");
+			}
+		}else if (order.getDealer() == 2){
+			if (selectById.getStatus() != 3){
+				throw  new RuntimeException("当前单据状态不支持取消订单");
+			}
+		}
+		//获取订单明细 根据商品和仓库加批次号获取库存 判断库存是否充足 充足减去库存 不充足提示那些商品库存不足
+		if (order.getDealer() == 1 && CollectionUtils.isNotEmpty(list)){
+			//查询库存
+			for (OrderItems item : list) {
+				R<StockGoodsVO> stock = stockGoodsClient.selectStock(null, selectById.getStorageId(), item.getItemId(), null, item.getLotNo(), null,
+					null, null, OrderTypeEnum.DEALER.getType());
+				if (!stock.isSuccess()){
+					throw new RuntimeException("查询库存出错");
+				}
+				if (stock.getData() == null){
+					throw new RuntimeException("未查到库存");
+				}
+				if (stock.getData() != null && stock.getData().getBalanceQuantity().compareTo(item.getOrderQuantity()) < 0){
+					R<GoodsDescVO> goodsMessage = goodsDescClient.selectGoodsMessage(item.getItemId());
+					throw new RuntimeException("商品"+goodsMessage.getData().getCname()+"库存不足,可出售库存为:"+stock.getData().getBalanceQuantity());
+				}
+				//更改库存
+				StockGoodsVO data = stock.getData();
+				data.setOutQuantity(data.getOutQuantity().add(item.getOrderQuantity()));//出库数量
+				data.setOutAmount(data.getOutAmount().add(item.getAmount()));//出库金额
+				data.setBalanceQuantity(data.getBalanceQuantity().subtract(item.getOrderQuantity()));//结余数量
+				data.setSurplusRouteQuantity(data.getSurplusRouteQuantity().subtract(item.getOrderQuantity()));//可用数量
+				data.setBalanceAmount(data.getInAmount().subtract(data.getOutAmount()));//结余金额
+				R updateStock = stockGoodsClient.updateStock(data);
+				//更改明细状态
+				item.setStatus(3);
+				item.setUpdateTime(new Date());
+				item.setUpdateUser(SecureUtil.getUserId());
+				orderItemsService.updateById(item);
+			}
+			selectById.setStatus(3);
+			baseMapper.updateById(selectById);
+		}else if (order.getDealer() == 2 && CollectionUtils.isNotEmpty(list)){
+			//查询库存
+			for (OrderItems item : list) {
+				R<StockGoodsVO> stock = stockGoodsClient.selectStock(null, selectById.getStorageId(), item.getItemId(), null, item.getLotNo(), null,
+					null, null, OrderTypeEnum.DEALER.getType());
+				if (!stock.isSuccess()){
+					throw new RuntimeException("查询库存出错");
+				}
+				if (stock.getData() == null){
+					throw new RuntimeException("未查到库存");
+				}
+				//更改库存
+				StockGoodsVO data = stock.getData();
+				data.setOutQuantity(data.getOutQuantity().subtract(item.getOrderQuantity()));//出库数量
+				data.setOutAmount(data.getOutAmount().subtract(item.getAmount()));//出库金额
+				data.setBalanceQuantity(data.getBalanceQuantity().add(item.getOrderQuantity()));//结余数量
+				data.setSurplusRouteQuantity(data.getSurplusRouteQuantity().add(item.getOrderQuantity()));//可用数量
+				data.setBalanceAmount(data.getInAmount().subtract(data.getOutAmount()));//结余金额
+				R updateStock = stockGoodsClient.updateStock(data);
+				//更改明细状态
+				item.setStatus(0);
+				item.setUpdateTime(new Date());
+				item.setUpdateUser(SecureUtil.getUserId());
+				orderItemsService.updateById(item);
+			}
+			selectById.setStatus(0);
+			baseMapper.updateById(selectById);
+		}
+		//库存充足更改明细状态
+		return R.success("操作成功");
+	}
+
 }

+ 21 - 0
blade-service/blade-stock/src/main/java/org/springblade/stock/controller/StockGoodsController.java

@@ -325,6 +325,27 @@ public class StockGoodsController extends BladeController {
 		}
 		return stockGoodsService.importUser(excelList,false);
 	}
+	/**
+	 * 详情
+	 */
+	@GetMapping("/message")
+	@ApiOperationSupport(order = 13)
+	@ApiOperation(value = "详情", notes = "传入stockGoods")
+	public R<StockGoods> message(StockGoods stockGoods) {
+		if (stockGoods.getGoodsId() == null){
+			throw new SecurityException("缺少必要的参数");
+		}
+		LambdaQueryWrapper<StockGoods> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(StockGoods::getGoodsId,stockGoods.getGoodsId());//商品id
+		lambdaQueryWrapper.eq(StockGoods::getTenantId,SecureUtil.getTenantId());//租户id
+		lambdaQueryWrapper.eq(StockGoods::getTradeType,stockGoods.getTradeType());//贸易类型
+		lambdaQueryWrapper.eq(Func.isNotEmpty(stockGoods.getStorageId()),StockGoods::getStorageId,stockGoods.getStorageId());
+		lambdaQueryWrapper.isNull(Func.isEmpty(stockGoods.getStorageId()),StockGoods::getStorageId);
+		lambdaQueryWrapper.eq(Func.isNotEmpty(stockGoods.getLotNo()),StockGoods::getLotNo,stockGoods.getLotNo());
+		lambdaQueryWrapper.isNull(Func.isEmpty(stockGoods.getLotNo()),StockGoods::getLotNo);
+		StockGoods detail = stockGoodsService.getOne(lambdaQueryWrapper);
+		return R.data(detail);
+	}
 
 
 }

+ 3 - 0
blade-service/blade-stock/src/main/resources/application-dev.yml

@@ -18,4 +18,7 @@ oss:
   access-key: minioadmin
   secret-key: minioadmin
   bucket-name: bladex
+swagger:
+    base-packages:
+      - org.springblade.stock
 

+ 1 - 0
blade-service/trade-finance/src/main/java/org/springblade/finance/mapper/AccMapper.xml

@@ -42,6 +42,7 @@
         <result column="update_time" property="updateTime"/>
         <result column="status" property="status"/>
         <result column="is_deleted" property="isDeleted"/>
+        <result column="good_name" property="goodName"/>
     </resultMap>
 
 

+ 489 - 0
blade-service/trade-purchase/src/main/java/com/trade/purchase/dealer/PurchaseDealerOrderController.java

@@ -0,0 +1,489 @@
+package com.trade.purchase.dealer;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.trade.purchase.order.dto.OrderSubmitDto;
+import com.trade.purchase.order.entity.Order;
+import com.trade.purchase.order.entity.OrderFees;
+import com.trade.purchase.order.entity.OrderFiles;
+import com.trade.purchase.order.entity.OrderItems;
+import com.trade.purchase.order.enums.OrderTypeEnum;
+import com.trade.purchase.order.service.IOrderFeesService;
+import com.trade.purchase.order.service.IOrderFilesService;
+import com.trade.purchase.order.service.IOrderItemsService;
+import com.trade.purchase.order.service.IOrderService;
+import com.trade.purchase.order.vo.OrderDTO;
+import com.trade.purchase.order.vo.OrderVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.AllArgsConstructor;
+import org.springblade.client.entity.CorpsDesc;
+import org.springblade.client.feign.ICorpsDescClient;
+import org.springblade.client.feign.IGoodsDescClient;
+import org.springblade.client.vo.GoodsDescVO;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.math.BigDecimal;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 进口采购订单表 控制器
+ *
+ * @author BladeX
+ * @since 2021-09-26
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/dealer/purchaseOrder")
+@Api(value = "经销商采购订单", tags = "经销商采购订单")
+public class PurchaseDealerOrderController extends BladeController {
+
+	private final IOrderService orderService;
+
+	private final IOrderFeesService orderFeesService;
+
+	private final IOrderFilesService orderFilesService;
+
+	private final IOrderItemsService orderItemsService;
+
+	private final String ERROR_MSG = "缺少查询信息";
+
+	private ICorpsDescClient corpsDescClient;//获取客户信息
+
+    private IGoodsDescClient goodsDescClient;
+
+    private IUserClient userClient;
+
+
+	/**
+	 * 详情
+	 */
+	@GetMapping("/{id}")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "采购订单查看详情", notes = "传入order")
+	public R<OrderVO> detail(@PathVariable(value = "id") String id) {
+
+		R<OrderVO> orderMessage = orderService.getOrderMessage(id);
+		if(orderMessage.isSuccess()&&orderMessage.getData()!=null)
+		{
+			R<User> user1 = userClient.userInfoById(orderMessage.getData().getUpdateUser());
+			if (user1.isSuccess() && user1.getData() != null){
+				orderMessage.getData().setUpdateUserName(user1.getData().getName());
+			}
+			R<User> user = userClient.userInfoById(orderMessage.getData().getCreateUser());
+			if (user.isSuccess() && user.getData() != null){
+				orderMessage.getData().setCreateUserName(user.getData().getName());
+			}
+
+			orderMessage.getData().getOrderItemsList().forEach(e->{
+				R<User> user2 = userClient.userInfoById(e.getUpdateUser());
+				if (user2.isSuccess() && user2.getData() != null){
+					e.setUpdateUserName(user2.getData().getName());
+				}
+				R<User> user3 = userClient.userInfoById(e.getCreateUser());
+				if (user3.isSuccess() && user3.getData() != null){
+					e.setCreateUserName(user3.getData().getName());
+				}
+			});
+		}
+
+
+		return orderMessage;
+	}
+
+	/**
+	 * 分页 销售或采购订单表
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "采购订单表列表(内贸 外贸 出口)", notes = "传入order")
+	public R<?> list( @RequestParam(name = "current", defaultValue = "1") Integer current,
+								 @RequestParam(name = "size", defaultValue = "10") Integer size,
+					 			 @RequestParam(value = "billNo",required = false) String billNo,//提单号
+					 			 @RequestParam(value = "orderNo",required = false) String orderNo,//合同号
+					 			 @RequestParam(value = "tradeType",required = false) String tradeType,//贸易类型
+								 @RequestParam(value = "strCorpName",required = false) String strCorpName,//供应商名称
+								 @RequestParam(value = "corpId",required = false) String corpId,//供应商id
+								 @RequestParam(value = "strPurchaserName",required = false) String strPurchaserName,//采购商名称
+								 @RequestParam(value = "salesName",required = false) String salesName,//业务员
+
+					             @RequestParam(value = "banksAccountName",required = false) String banksAccountName,//公司户头
+								  @RequestParam(value = "packageRemarks",required = false) String packageRemarks,//包装要求
+								  @RequestParam(value = "createUser",required = false) Long createUser,//制单人
+					             @RequestParam(value = "paymentType",required = false) String paymentType,//付款方式
+					             @RequestParam(value = "createStartTime",required = false) String createStartTime,//制单日期
+					             @RequestParam(value = "createEndTime",required = false) String createEndTime,//制单日期
+
+
+								 @RequestParam(value = "businesStartDate",required = false) String businesStartDate,//订单开始时间  busines_date
+								 @RequestParam(value = "businesEndDate",required = false) String businesEndDate,//订单结束时间
+								 @RequestParam(value = "accountsCollectionStartDate",required = false) String accountsCollectionStartDate,//应收(付)款开始时间  accounts_collection_date
+								 @RequestParam(value = "accountsCollectionEndDate",required = false) String accountsCollectionEndDate,//应收(付)款结束时间
+
+								 @RequestParam(value = "dateOfStartArrival",required = false) String dateOfStartArrival,//实际到港开始日期 date_of_arrival
+								 @RequestParam(value = "dateOfEndArrival",required = false) String dateOfEndArrival,//实际到港结束时间,
+
+								 @RequestParam(value = "requiredDeliveryStartDate",required = false) String requiredDeliveryStartDate,//要求发货开始日期  required_delivery_date
+								 @RequestParam(value = "requiredDeliveryEndDate",required = false) String requiredDeliveryEndDate,//要求发货结束时间
+
+								 @RequestParam(value = "requiredArrivalStartDate",required = false) String requiredArrivalStartDate,//要求到货开始日期  required_arrival_date
+								 @RequestParam(value = "requiredArrivalEndDate",required = false) String requiredArrivalEndDate,//要求到货结束日期
+
+					             @RequestParam(value = "creditStartDate",required = false) String creditStartDate,//信用证到期日-开始日期  credit_date
+					             @RequestParam(value = "creditEndDate",required = false) String creditEndDate,//信用证到期日-结束时间
+								 Order order
+								)
+	{
+
+		QueryWrapper<Order> queryWrapper =new QueryWrapper<>();
+
+        //供应商
+		if(StringUtils.isNotBlank(strCorpName))
+		{
+			List<CorpsDesc> corpsDescs = corpsDescClient.listCorpByName(strCorpName);
+			if(CollectionUtils.isNotEmpty(corpsDescs))
+			{
+				List<Long> corpIds = corpsDescs.stream().map(CorpsDesc::getId).collect(Collectors.toList());
+				queryWrapper.in("corp_id",corpIds);
+			}
+			else
+			{
+				return R.data(Collections.EMPTY_LIST,"暂无相关数据");
+			}
+
+
+
+		}
+		//采购商
+		if(StringUtils.isNotBlank(strPurchaserName))
+		{
+			List<CorpsDesc> corpsDescs = corpsDescClient.listCorpByName(strPurchaserName);
+			if(CollectionUtils.isNotEmpty(corpsDescs))
+			{
+				List<Long> purchaserIds = corpsDescs.stream().map(CorpsDesc::getId).collect(Collectors.toList());
+				queryWrapper.in("purchaser_id",purchaserIds);
+			}
+            else
+			{
+				return R.data(Collections.EMPTY_LIST,"暂无相关数据");
+			}
+
+		}
+		queryWrapper.like(StringUtils.isNotBlank(banksAccountName),"banks_account_name",banksAccountName);
+		queryWrapper.like(StringUtils.isNotBlank(packageRemarks),"package_remarks",packageRemarks);
+		queryWrapper.like(StringUtils.isNotBlank(salesName),"sales_name",salesName);
+		queryWrapper.like(StringUtils.isNotBlank(orderNo),"order_no",orderNo);
+		queryWrapper.like(StringUtils.isNotBlank(paymentType),"payment_type",paymentType);
+		queryWrapper.eq(StringUtils.isNotBlank(corpId),"corp_id",corpId);
+		queryWrapper.eq("tenant_id",AuthUtil.getTenantId());
+		queryWrapper.eq(createUser!=null,"create_user",createUser);
+		queryWrapper.eq("bill_type",OrderTypeEnum.PURCHASE.getType());
+		queryWrapper.eq("trade_type",OrderTypeEnum.DEALER.getType());
+		queryWrapper.like(StringUtils.isNotBlank(billNo),"bill_no",billNo);
+		queryWrapper.between(StringUtils.isNotBlank(createStartTime)&&StringUtils.isNotBlank(createEndTime),"create_time",createStartTime,createEndTime);
+		queryWrapper.between(StringUtils.isNotBlank(businesStartDate)&&StringUtils.isNotBlank(businesEndDate),"busines_date",businesStartDate,businesEndDate);
+		queryWrapper.between(StringUtils.isNotBlank(accountsCollectionStartDate)&&StringUtils.isNotBlank(accountsCollectionEndDate),"accounts_collection_date",accountsCollectionStartDate,accountsCollectionEndDate);
+		queryWrapper.between(StringUtils.isNotBlank(dateOfStartArrival)&&StringUtils.isNotBlank(dateOfEndArrival),"date_of_arrival",dateOfStartArrival,dateOfEndArrival);
+		queryWrapper.between(StringUtils.isNotBlank(requiredDeliveryStartDate)&&StringUtils.isNotBlank(requiredDeliveryEndDate),"required_delivery_date",requiredDeliveryStartDate,requiredDeliveryEndDate);
+		queryWrapper.between(StringUtils.isNotBlank(requiredArrivalStartDate)&&StringUtils.isNotBlank(requiredArrivalEndDate),"required_arrival_date",requiredArrivalStartDate,requiredArrivalEndDate);
+		queryWrapper.between(StringUtils.isNotBlank(creditStartDate)&&StringUtils.isNotBlank(creditEndDate),"credit_date",creditStartDate,creditEndDate);
+		queryWrapper.orderByDesc("create_time");
+		Page<Order> page=new Page<>(current,size);
+		IPage<Order> pages = orderService.page(page,queryWrapper);
+		List<Order> records = pages.getRecords();
+		if(CollectionUtils.isNotEmpty(records))
+		{
+			records.forEach(e->{
+				if(e.getBelongToCorpId()!=null)
+				{
+					R<CorpsDesc> corpMessage3 = corpsDescClient.getCorpMessage(e.getBelongToCorpId());
+					if(corpMessage3.getData()!=null)
+					{
+						e.setBelongToCorpName(corpMessage3.getData().getCname());
+					}
+				}
+
+				//制单人名字
+				if(e.getCreateUser()!=null)
+				{
+					R<User> userR = userClient.userInfoById(e.getCreateUser());
+					if(userR.isSuccess())
+					{
+						e.setCreateUserName(userR.getData().getRealName());
+					}
+				}
+
+				//修改制单人名字
+				if(e.getUpdateUser()!=null)
+				{
+					R<User> userR = userClient.userInfoById(e.getUpdateUser());
+					if(userR.isSuccess())
+					{
+						e.setUpdateUserName(userR.getData().getRealName());
+					}
+				}
+
+				//获取供应商中文名
+				if (e.getCorpId() != null){
+					R<CorpsDesc> corpMessage1 = corpsDescClient.getCorpMessage(e.getCorpId());
+					if(corpMessage1.getData()!=null)
+					{
+                       e.setStrCorpName(corpMessage1.getData().getCname());
+					}
+
+				}
+				//获取采购商中文名
+				if (e.getPurchaserId() != null){
+					R<CorpsDesc> corpMessage2 = corpsDescClient.getCorpMessage(e.getPurchaserId());
+					if(corpMessage2.getData()!=null)
+					{
+						e.setStrPurchaserName(corpMessage2.getData().getCname());
+					}
+				}
+
+				List<OrderItems> orderItemsList = orderItemsService.list(new LambdaQueryWrapper<OrderItems>().eq(OrderItems::getIsDeleted, 0).eq(OrderItems::getPid, e.getId()));
+				//是否有子项
+				Boolean flag=orderItemsService.count(new LambdaQueryWrapper<OrderItems>().eq(OrderItems::getPid,e.getId()))>0?true:false;
+				if(CollectionUtils.isNotEmpty(orderItemsList))
+				{
+					//子项总件数
+					BigDecimal orderQuantity = orderItemsList.stream().filter(it -> it.getOrderQuantity() != null)
+						.map(OrderItems::getOrderQuantity)
+						.reduce(BigDecimal.ZERO, BigDecimal::add);
+					e.setOrderQuantity(orderQuantity);
+
+					//子项总收货数
+					BigDecimal actualQuantity = orderItemsList.stream().filter(it -> it.getActualQuantity() != null)
+						.map(OrderItems::getActualQuantity)
+						.reduce(BigDecimal.ZERO, BigDecimal::add);
+					e.setActualQuantity(actualQuantity);
+
+					//已收重量
+					BigDecimal actualWeight = orderItemsList.stream().filter(it -> it.getActualWeight() != null)
+						.map(OrderItems::getActualWeight)
+						.reduce(BigDecimal.ZERO, BigDecimal::add);
+					e.setActualWeight(actualWeight);
+				}
+
+
+			});
+		}
+		return R.data(pages);
+	}
+
+/*	*//**
+	 * 自定义分页 销售或采购订单表
+	 *//*
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入order")
+	public R<IPage<OrderVO>> page(OrderVO order, Query query) {
+		order.setIsDeleted(0);
+		order.setTenantId(AuthUtil.getTenantId());
+		order.setBillType(OrderTypeEnum.PURCHASE.getType());
+		order.setTradeType(OrderTypeEnum.IMPORT.getType());
+		IPage<OrderVO> pages = orderService.selectOrderPage(Condition.getPage(query), order);
+		return R.data(pages);
+	}*/
+
+	/**
+	 * 新增 销售或采购订单表
+	 */
+	/*@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入order")
+	public R<String> save(@Valid @RequestBody OrderSubmitDto submitDto) {
+		return orderService.saveOrderMessage(submitDto);
+	}*/
+
+	/**
+	 * 修改 销售或采购订单表
+	 */
+	/*@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入order")
+	public R<String> update(@Valid @RequestBody Order order) {
+		if (order.getId() == null) {
+			return R.fail(ERROR_MSG);
+		}
+		order.setIsDeleted(1);
+		return R.status(orderService.updateById(order));
+	}*/
+
+	/**
+	 * 新增或修改 销售或采购订单表
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入order")
+	public R<String> submit(@Valid @RequestBody OrderSubmitDto submitDto)
+	{
+		/*if(ObjectUtil.isEmpty(submitDto.getBillType())||ObjectUtil.isEmpty(submitDto.getSrcId())||ObjectUtil.isEmpty(submitDto.getBusinesDate()))
+		{
+			throw new ServiceException("来源、合同日期、贸易类型不能为空!");
+		}*/
+		submitDto.setOrderTypeEnum(OrderTypeEnum.PURCHASE);
+		submitDto.setBillType(OrderTypeEnum.PURCHASE.getType());
+		submitDto.setTradeType(OrderTypeEnum.DEALER.getType());
+		return orderService.submitOrderMessage(submitDto);
+	}
+
+	/**
+	 * 删除 销售或采购订单表
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "删除", notes = "传入ids")
+	public R<String> remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(orderService.removeByIds(Func.toLongList(ids)));
+	}
+
+	/**
+	 * 删除采购明细信息
+	 */
+	@PostMapping("/removeByItem")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "删除采购明细信息", notes = "传入order")
+	public R<String> update(@Valid @RequestBody OrderItems items) {
+		if (items.getId() == null) {
+			return R.fail(ERROR_MSG);
+		}
+		return R.status(orderItemsService.removeById(items.getId()));
+	}
+
+	/**
+	 * 删除费用信息
+	 */
+	@PostMapping("/removeByFees")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "删除费用信息", notes = "传入order")
+	public R<String> update(@Valid @RequestBody OrderFees order) {
+		if (order.getId() == null) {
+			return R.fail(ERROR_MSG);
+		}
+		return R.status(orderFeesService.removeById(order.getId()));
+	}
+
+	/**
+	 * 删除订单文件信息
+	 *
+	 * @param order
+	 * @return
+	 */
+	@PostMapping("/removeByFiles")
+	@ApiOperationSupport(order = 9)
+	@ApiOperation(value = "删除文件信息", notes = "传入order")
+	public R<String> update(@Valid @RequestBody OrderFiles order) {
+		if (order.getId() == null) {
+			return R.fail(ERROR_MSG);
+		}
+		return R.status(orderFilesService.removeById(order.getId()));
+	}
+
+    @GetMapping("getItemByPid")
+	@ApiOperation(value = "查询采购订单的子明细", notes = "通过采购订单的id查询")
+	public R getItemByPid(@RequestParam(value = "id",required = true)Long id)
+	{
+		LambdaQueryWrapper<OrderItems> lambdaQueryWrapper=new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(OrderItems::getPid,id);
+		List<OrderItems> itemsList = orderItemsService.list(lambdaQueryWrapper);
+		return R.data(itemsList);
+	}
+
+	@GetMapping("getSysNo")
+	@ApiOperation(value = "采购订单获取系统编号prefix=GN JK CK", notes = "采购订单获取系统编号prefix=GN JK CK")
+	public R  getSysNo(@RequestParam(value = "prefix",required = true)String prefix,
+					   @RequestParam(value = "tradeType",required = true)String tradeType)
+	{
+		return orderService.getSysNo(prefix,tradeType);
+	}
+
+	@GetMapping("getItemListByConditions")
+	@ApiOperation(value = "收发单-获取商品明细", notes = "收发单-获取商品明细")
+	public R getItemListByConditions(@RequestParam(name = "current", defaultValue = "1") Integer current,
+									 @RequestParam(name = "size", defaultValue = "10") Integer size,
+									 @RequestParam(name = "tradeType", required = true) String tradeType,
+									 @RequestParam(name = "orderNo", required = false) String orderNo,
+									 @RequestParam(name = "corpId", required = false) Long corpId,
+									 @RequestParam(name = "startDate", required = false) String  startDate,
+									 @RequestParam(name = "endDate", required = false) String  endDate
+									 )
+	{
+		Page<OrderDTO> page=new Page<>(current,size);
+		IPage<OrderDTO> iPage = orderService.listOrderItem(page, tradeType, orderNo, corpId, startDate, endDate);
+		if(CollectionUtils.isNotEmpty(iPage.getRecords()))
+		{
+			iPage.getRecords().forEach(e->{
+				//商品信息
+				R<GoodsDescVO> goodsDescVOR = goodsDescClient.selectGoodsMessage(e.getItemId());
+				if(goodsDescVOR.isSuccess())
+				{
+					GoodsDescVO descVO = goodsDescVOR.getData();
+					if(descVO!=null)
+					{
+						e.setPriceCategoryNames(descVO.getCname());
+					}
+
+				}
+				//供应商信息
+				if (e.getCorpId() != null){
+
+					R<CorpsDesc> corpMessage = corpsDescClient.getCorpMessage(e.getCorpId());
+					if(corpMessage.getData()!=null)
+					{
+						e.setCorpName(corpMessage.getData().getCname());
+
+					}
+
+				}
+			});
+		}
+		return R.data(iPage);
+	}
+	/**
+	 * 更改打印时间和打印次数
+	 */
+	@GetMapping("/print")
+	@ApiOperationSupport(order = 11)
+	@ApiOperation(value = "更改打印时间和打印次数", notes = "传入order")
+	public R<Order> print(Order order) {
+		if (order.getId() == null){
+			throw new SecurityException("请选择要打印的单据");
+		}
+		Order service = orderService.getById(order.getId());
+		service.setPrintNumber(service.getPrintNumber() +1);
+		service.setPrintTime(new Date());
+		return R.status(orderService.updateById(service));
+	}
+	/**
+	 * 确认或取消订单
+	 */
+	@GetMapping("/dealerSubmit")
+	@ApiOperationSupport(order = 12)
+	@ApiOperation(value = "确认或取消订单", notes = "传入order")
+	public R<Order> dealerSubmit(Order order) {
+		if (order.getDealer() != 1 && order.getDealer() != 2){
+			throw new SecurityException("缺少必要的参数");
+		}
+		if (order.getId() == null){
+			throw new SecurityException("缺少必要的参数");
+		}
+		return orderService.dealerSubmit(order);
+	}
+}

+ 4 - 0
blade-service/trade-purchase/src/main/java/com/trade/purchase/order/mapper/OrderMapper.xml

@@ -102,6 +102,10 @@
         <result column="convert_integral" property="convertIntegral"/>
         <result column="presenter_integral" property="presenterIntegral"/>
         <result column="case_over_payment" property="caseOverPayment"/>
+        <result column="distribution_mode" property="distributionMode"/>
+        <result column="print_time" property="printTime"/>
+        <result column="print_number" property="printNumber"/>
+        <result column="corp_debt" property="corpDebt"/>
     </resultMap>
 
 

+ 6 - 0
blade-service/trade-purchase/src/main/java/com/trade/purchase/order/service/IOrderService.java

@@ -116,4 +116,10 @@ public interface IOrderService extends IService<Order> {
 	 */
 	R<OrderSubmitDto> commit(OrderSubmitDto submitDto);
 
+	/**
+	 * 经销商确认销售订单
+	 * @param order
+	 * @return
+	 */
+	R dealerSubmit(Order order);
 }

+ 124 - 0
blade-service/trade-purchase/src/main/java/com/trade/purchase/order/service/impl/OrderServiceImpl.java

@@ -39,6 +39,7 @@ import org.springblade.core.tool.utils.Func;
 import org.springblade.mocha.feign.IPriceBankClient;
 import org.springblade.stock.entity.StockGoods;
 import org.springblade.stock.feign.IStockGoodsClient;
+import org.springblade.stock.vo.StockGoodsVO;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
 import org.springframework.stereotype.Service;
@@ -207,6 +208,11 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 		if (CollectionUtils.isNotEmpty(orderItemsList)) {
 			vo.setOrderItemsList(orderItemsList);
 			vo.setItemsVOList(orderItemsList.stream().map(orderItemMapstructMapper::toVo).collect(Collectors.toList()));
+			BigDecimal orderQuantity = orderItemsList.stream().filter(it -> it.getOrderQuantity() != null)
+				.map(OrderItems::getOrderQuantity)
+				.reduce(BigDecimal.ZERO, BigDecimal::add);
+			vo.setOrderQuantity(orderQuantity);
+			vo.setAmount(orderItemsList.stream().filter(e -> e.getAmount() != null).map(OrderItems::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add));//销售金额
 		}
 		//获取订单费用信息
 		List<OrderFees> orderFeesList = this.getOrderFees(vo.getId());
@@ -570,6 +576,119 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 	}
 
 	@Override
+	@GlobalTransactional
+	@Transactional(rollbackFor = Exception.class)
+	public R dealerSubmit(Order order) {
+		// dealer 1 确认订单 2 取消订单
+		Order selectById = baseMapper.selectById(order.getId());
+		LambdaQueryWrapper<OrderItems> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.eq(OrderItems::getPid,order.getId());
+		queryWrapper.eq(OrderItems::getIsDeleted,0);
+		queryWrapper.eq(OrderItems::getTenantId,SecureUtil.getTenantId());
+		List<OrderItems> list = orderItemsService.list(queryWrapper);
+		//先判断订单状态 0 录入 1 审批 2 审批中 3 审批完成/确认订单
+		if (order.getDealer() == 1){
+			if (selectById.getStatus() != 0){
+				throw  new RuntimeException("当前单据状态不支持确认订单");
+			}
+		}else if (order.getDealer() == 2){
+			if (selectById.getStatus() != 3){
+				throw  new RuntimeException("当前单据状态不支持取消订单");
+			}
+		}
+		//获取订单明细 根据商品和仓库加批次号获取库存 判断库存是否存在 存在增加不存在新增
+		if (order.getDealer() == 1 && CollectionUtils.isNotEmpty(list)){
+			//查询库存
+			for (OrderItems item : list) {
+				R<StockGoodsVO> stock = stockGoodsClient.selectStock(null, selectById.getStorageId(), item.getItemId(), null, item.getLotNo(), null,
+					null, null, OrderTypeEnum.DEALER.getType());
+				if (!stock.isSuccess()){
+					throw new RuntimeException("查询库存出错");
+				}
+				//新增或更改库存
+				if (stock.getData() == null){
+					StockGoods stockGoods=new StockGoods();
+					stockGoods.setGoodsId(item.getItemId());
+					stockGoods.setCreateTime(new Date());
+					stockGoods.setCreateUser(AuthUtil.getUserId());
+					stockGoods.setTenantId(AuthUtil.getTenantId());
+					//采购件数
+					stockGoods.setInQuantity(item.getOrderQuantity());//入库数量
+					stockGoods.setOutQuantity(BigDecimal.ZERO);//出库数量
+					stockGoods.setLockingQuantity(BigDecimal.ZERO);//锁定数量
+					stockGoods.setBalanceQuantity(item.getOrderQuantity());//结余数量
+					stockGoods.setEnRouteQuantity(BigDecimal.ZERO);//在途数量
+					stockGoods.setSurplusRouteQuantity(item.getOrderQuantity());//可用数量
+					//发票重量
+					stockGoods.setInWeight(BigDecimal.ZERO);
+					stockGoods.setOutWeight(BigDecimal.ZERO);
+					stockGoods.setLockingWeight(BigDecimal.ZERO);
+					stockGoods.setBalanceWeight(BigDecimal.ZERO);
+					//码单重量
+					stockGoods.setInVolumn(BigDecimal.ZERO);
+					stockGoods.setOutVolumn(BigDecimal.ZERO);
+					stockGoods.setLockingVolumn(BigDecimal.ZERO);
+					stockGoods.setBalanceVolumn(BigDecimal.ZERO);
+					//金额
+					stockGoods.setInAmount(item.getAmount());
+					stockGoods.setOutAmount(BigDecimal.ZERO);
+					stockGoods.setBalanceAmount(item.getAmount());
+					stockGoods.setLotNo(item.getLotNo());
+					stockGoods.setStorageId(selectById.getStorageId());
+					stockGoods.setTradeType(OrderTypeEnum.DEALER.getType());
+					R saveStock = stockGoodsClient.saveStock(stockGoods);
+				}else {
+					StockGoodsVO data = stock.getData();
+					data.setBalanceQuantity(data.getBalanceQuantity().add(item.getOrderQuantity()));//结余数量
+					data.setSurplusRouteQuantity(data.getSurplusRouteQuantity().add(item.getOrderQuantity()));//可用数量
+					data.setInAmount(data.getInAmount().add(item.getAmount()));//入库金额
+					data.setBalanceAmount(data.getInAmount().subtract(data.getOutAmount()));//结余金额
+					R updateStock = stockGoodsClient.updateStock(data);
+				}
+				//更改明细状态
+				item.setStatus(3);
+				item.setUpdateTime(new Date());
+				item.setUpdateUser(SecureUtil.getUserId());
+				orderItemsService.updateById(item);
+			}
+			selectById.setStatus(3);
+			baseMapper.updateById(selectById);
+		}else if (order.getDealer() == 2 && CollectionUtils.isNotEmpty(list)){
+			//查询库存
+			for (OrderItems item : list) {
+				R<StockGoodsVO> stock = stockGoodsClient.selectStock(null, selectById.getStorageId(), item.getItemId(), null, item.getLotNo(), null,
+					null, null, OrderTypeEnum.DEALER.getType());
+				if (!stock.isSuccess()){
+					throw new RuntimeException("查询库存出错");
+				}
+				if (stock.getData() == null){
+					throw new RuntimeException("未查到库存");
+				}
+				if (stock.getData() != null && stock.getData().getBalanceQuantity().compareTo(item.getOrderQuantity()) < 0){
+					R<GoodsDescVO> goodsMessage = goodsDescClient.selectGoodsMessage(item.getItemId());
+					throw new RuntimeException("商品"+goodsMessage.getData().getCname()+"库存不足,可撤销库存为:"+stock.getData().getBalanceQuantity());
+				}
+				//更改库存
+				StockGoodsVO data = stock.getData();
+				data.setBalanceQuantity(data.getBalanceQuantity().subtract(item.getOrderQuantity()));//结余数量
+				data.setSurplusRouteQuantity(data.getSurplusRouteQuantity().subtract(item.getOrderQuantity()));//可用数量
+				data.setInAmount(data.getInAmount().subtract(item.getAmount()));//入库金额
+				data.setBalanceAmount(data.getInAmount().subtract(data.getOutAmount()));//结余金额
+				R updateStock = stockGoodsClient.updateStock(data);
+				//更改明细状态
+				item.setStatus(0);
+				item.setUpdateTime(new Date());
+				item.setUpdateUser(SecureUtil.getUserId());
+				orderItemsService.updateById(item);
+			}
+			selectById.setStatus(0);
+			baseMapper.updateById(selectById);
+		}
+		//库存充足更改明细状态
+		return R.success("操作成功");
+	}
+
+	@Override
 	public R<OrderSubmitDto> savePurchase(OrderSubmitDto submitDto) {
 		//获取系统编号
 		R billNo = serialClient.getBillNo(submitDto.getBillType(),submitDto.getTradeType(),submitDto.getBillType());
@@ -633,6 +752,11 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 						item.setCname(goodsDesc.getCname());
 						item.setTypeno(goodsDesc.getTypeno());
 						item.setSpecificationAndModel(goodsDesc.getSpecificationAndModel());
+						item.setEname(goodsMessage.getData().getEname());
+						item.setBrandItem(goodsMessage.getData().getBrandItem());
+						item.setSize(goodsMessage.getData().getSize());
+						item.setSpecsOne(goodsMessage.getData().getSpecsOne());
+						item.setSpecsTwo(goodsMessage.getData().getSpecsTwo());
 					}
 				}
 			}