Browse Source

2023年12月7日17:33:06

纪新园 2 years ago
parent
commit
caa450e39c
14 changed files with 670 additions and 5 deletions
  1. 12 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/entity/PjOrder.java
  2. 12 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/entity/PjOrderItems.java
  3. 137 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/excel/PjOrderExportExcelPD.java
  4. 6 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/excel/PjShipStockDetails.java
  5. 6 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/excel/StockExportExcel.java
  6. 13 3
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/corps/service/impl/CorpsAttnServiceImpl.java
  7. 217 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/controller/InventoryController.java
  8. 3 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/mapper/OrderMapper.java
  9. 41 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/mapper/OrderMapper.xml
  10. 8 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/IOrderService.java
  11. 189 1
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/impl/OrderServiceImpl.java
  12. 19 1
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/controller/ShipController.java
  13. 2 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/service/IShipService.java
  14. 5 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/service/impl/ShipServiceImpl.java

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

@@ -433,6 +433,18 @@ public class PjOrder implements Serializable {
 	@ApiModelProperty(value = "一键入库状态")
 	private String shortcutWarehousingStatus;
 
+	/**
+	 * 盈亏数
+	 */
+	@ApiModelProperty(value = "盈亏数")
+	private BigDecimal profitLossNum;
+
+	/**
+	 * 盈亏金额
+	 */
+	@ApiModelProperty(value = "盈亏金额")
+	private BigDecimal profitLossAmount;
+
 	//小程序检索
 	@TableField(exist = false)
 	private String retrieval;

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

@@ -251,6 +251,18 @@ public class PjOrderItems implements Serializable {
 	 */
 	@ApiModelProperty(value = "参考库存")
 	private BigDecimal inventory;
+
+	/**
+	 * 盈亏数
+	 */
+	@ApiModelProperty(value = "盈亏数")
+	private BigDecimal profitLossNum;
+
+	/**
+	 * 盈亏金额
+	 */
+	@ApiModelProperty(value = "盈亏金额")
+	private BigDecimal profitLossAmount;
 	/**
 	 * 附件
 	 */

+ 137 - 0
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/excel/PjOrderExportExcelPD.java

@@ -0,0 +1,137 @@
+/*
+ *      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.salesPart.excel;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 配件销售采购表实体类
+ *
+ * @author BladeX
+ * @since 2023-04-21
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class PjOrderExportExcelPD implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 单号
+	 */
+	@ExcelProperty(value = "单号")
+	private String ordNo;
+
+	/**
+	 * 业务日期
+	 */
+	@ExcelProperty(value = "业务日期")
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	private Date businesDate;
+
+	/**
+	 * 所属公司名称
+	 */
+	@ExcelProperty(value = "所属公司")
+	private String salesCompanyName;
+
+	/**
+	 * 盘点人
+	 */
+	@ExcelProperty(value = "盘点人")
+	private String salerName;
+
+	/**
+	 * 仓库名称
+	 */
+	@ExcelProperty(value = "仓库")
+	private String storageName;
+
+	/**
+	 * 原数量
+	 */
+	@ExcelProperty(value = "原数量")
+	private BigDecimal goodsTotalNum;
+	/**
+	 * 原金额
+	 */
+	@ExcelProperty(value = "原金额")
+	private BigDecimal totalAmount;
+	/**
+	 * 实际数量
+	 */
+	@ExcelProperty(value = "实际数量")
+	private BigDecimal goodsTotalShipNum;
+	/**
+	 * 实际金额
+	 */
+	@ExcelProperty(value = "实际金额")
+	private BigDecimal salesAmount;
+	/**
+	 * 盈亏数
+	 */
+	@ExcelProperty(value = "盈亏数")
+	private BigDecimal profitLossNum;
+	/**
+	 * 盈亏金额
+	 */
+	@ExcelProperty(value = "盈亏金额")
+	private BigDecimal profitLossAmount;
+
+	/**
+	 * 创建人名称
+	 */
+	@ExcelProperty(value = "制单人")
+	private String createUserName;
+	/**
+	 * 创建时间
+	 */
+	@ExcelProperty(value = "制单日期")
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date createTime;
+
+	/**
+	 * 修改人名称
+	 */
+	@ExcelProperty(value = "更新人")
+	private String updateUserName;
+
+	/**
+	 * 修改时间
+	 */
+	@ExcelProperty(value = "更新日期")
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date updateTime;
+
+}

+ 6 - 0
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/excel/PjShipStockDetails.java

@@ -89,6 +89,12 @@ public class PjShipStockDetails implements Serializable {
 	private BigDecimal totalNum;
 
 	/**
+	 * 盈亏数
+	 */
+	@ApiModelProperty(value = "盈亏数")
+	private BigDecimal profitLossNum;
+
+	/**
 	 * 业务日期
 	 */
 	@ApiModelProperty(value = "业务日期")

+ 6 - 0
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/excel/StockExportExcel.java

@@ -95,4 +95,10 @@ public class StockExportExcel implements Serializable {
 	 */
 	@ExcelProperty(value = "库存预警")
 	private Integer inventoryAlert;
+
+	/**
+	 * 盘点库存
+	 */
+	@ExcelProperty(value = "盘点库存")
+	private BigDecimal profitLossNum;
 }

+ 13 - 3
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/corps/service/impl/CorpsAttnServiceImpl.java

@@ -18,11 +18,11 @@ package org.springblade.salesPart.corps.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import io.seata.spring.annotation.GlobalTransactional;
 import lombok.AllArgsConstructor;
 import org.springblade.client.constant.LandConstant;
-import org.springblade.client.entity.CorpsAttn;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
@@ -31,11 +31,15 @@ import org.springblade.salesPart.corps.mapper.CorpsAttnMapper;
 import org.springblade.salesPart.corps.service.ICorpsAttnService;
 import org.springblade.salesPart.entity.PjCorpsAttn;
 import org.springblade.salesPart.vo.CorpsAttnVO;
+import org.springblade.system.entity.Dept;
+import org.springblade.system.feign.ISysClient;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.List;
+
 /**
  * 配件批发客户明细联系人 服务实现类
  *
@@ -48,6 +52,8 @@ public class CorpsAttnServiceImpl extends ServiceImpl<CorpsAttnMapper, PjCorpsAt
 
 	private final IUserClient userClient;
 
+	private final ISysClient sysClient;
+
 	@Override
 	public IPage<CorpsAttnVO> selectCorpsAttnPage(IPage<CorpsAttnVO> page, CorpsAttnVO corpsAttn) {
 		return page.setRecords(baseMapper.selectCorpsAttnPage(page, corpsAttn));
@@ -79,14 +85,14 @@ public class CorpsAttnServiceImpl extends ServiceImpl<CorpsAttnMapper, PjCorpsAt
 		if (ObjectUtil.isNotEmpty(attn.getUserId())) {
 
 			R<User> userR = userClient.userInfoById(attn.getUserId());
-			if (ObjectUtil.isNotEmpty(userR.getData())){
+			if (ObjectUtil.isNotEmpty(userR.getData())) {
 				user.setId(attn.getUserId());
 				R<Boolean> result = userClient.updateUser(user);
 
 				if (!result.isSuccess()) {
 					throw new ServiceException(result.getMsg());
 				}
-			}else {
+			} else {
 				user.setPassword(LandConstant.USER_PASSWORD);
 				R<Boolean> result = userClient.saveUser(user);
 				if (!result.isSuccess()) {
@@ -102,6 +108,10 @@ public class CorpsAttnServiceImpl extends ServiceImpl<CorpsAttnMapper, PjCorpsAt
 			}
 
 		} else {
+			R<List<Dept>> res = sysClient.selectByDeptIds(AuthUtil.getDeptId());
+			if (res.isSuccess() && ObjectUtils.isNotNull(res.getData()) && res.getData().size() > 0) {
+				user.setAppletsId(res.getData().get(0).getAppletsId());
+			}
 			user.setPassword(LandConstant.USER_PASSWORD);
 			R<Boolean> result = userClient.saveUser(user);
 			if (!result.isSuccess()) {

+ 217 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/controller/InventoryController.java

@@ -0,0 +1,217 @@
+package org.springblade.salesPart.order.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.common.annotation.RepeatSubmit;
+import org.springblade.core.excel.util.ExcelUtil;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.salesPart.entity.PjOrder;
+import org.springblade.salesPart.entity.PjOrderItems;
+import org.springblade.salesPart.excel.*;
+import org.springblade.salesPart.order.service.IOrderItemsService;
+import org.springblade.salesPart.order.service.IOrderService;
+import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * @author :jixinyuan
+ * @date : 2023/12/7
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/inventory")
+public class InventoryController {
+
+
+	private final IOrderService orderService;
+	private final IOrderItemsService orderItemsService;
+	//获取用户信息
+	private final IUserClient iUserClient;
+
+	/**
+	 * 分页 配件销售
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入order")
+	public R<IPage<PjOrder>> list(PjOrder order, Query query) {
+		LambdaQueryWrapper<PjOrder> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(PjOrder::getTenantId, AuthUtil.getTenantId())
+			.eq(PjOrder::getIsDeleted, 0)
+			.eq(PjOrder::getBsType, order.getBsType())
+			.eq(PjOrder::getSalesCompanyId, AuthUtil.getDeptId())
+			.eq(ObjectUtils.isNotEmpty(order.getStorageId()), PjOrder::getStorageId, order.getStorageId())
+			.like(ObjectUtils.isNotEmpty(order.getStorageName()), PjOrder::getStorageName, order.getStorageName())
+			.eq(ObjectUtils.isNotEmpty(order.getSalerId()), PjOrder::getSalerId, order.getSalerId())
+			.like(ObjectUtils.isNotEmpty(order.getOrdNo()), PjOrder::getOrdNo, order.getOrdNo())
+			.apply(ObjectUtils.isNotEmpty(order.getStatus()), "find_in_set(status,'" + order.getStatus() + "')");
+		if (order.getBusinesDateList() != null && order.getBusinesDateList().size() > 1) {
+			lambdaQueryWrapper.ge(PjOrder::getBusinesDate, order.getBusinesDateList().get(0));
+			lambdaQueryWrapper.le(PjOrder::getBusinesDate, order.getBusinesDateList().get(1));
+		}
+		lambdaQueryWrapper.orderByDesc(PjOrder::getCreateTime);
+		if (!AuthUtil.getUserRole().contains("admin") && !AuthUtil.getUserRole().contains("老板")) {
+			if (AuthUtil.getUserRole().contains("业务员")) {
+				lambdaQueryWrapper.eq(PjOrder::getSalerId, AuthUtil.getUserId());
+			} else if (AuthUtil.getUserRole().contains("客户")) {
+				lambdaQueryWrapper.eq(PjOrder::getCreateUser, AuthUtil.getUserId());
+			}
+		}
+		IPage<PjOrder> pages = orderService.page(Condition.getPage(query), lambdaQueryWrapper);
+		StringBuilder updateUserIds = new StringBuilder();
+		StringBuilder createUserIds = new StringBuilder();
+		for (PjOrder items : pages.getRecords()) {
+			if (ObjectUtil.isNotEmpty(items.getUpdateUser())) {
+				updateUserIds.append(items.getUpdateUser()).append(",");
+			}
+			if (ObjectUtil.isNotEmpty(items.getCreateUser())) {
+				createUserIds.append(items.getCreateUser()).append(",");
+			}
+		}
+		//获得修改人信息
+		List<User> updateUserList = iUserClient.selectUserIds(updateUserIds.toString());
+		//获得创建人信息
+		List<User> createUserList = iUserClient.selectUserIds(createUserIds.toString());
+		if (CollectionUtils.isNotEmpty(pages.getRecords())) {
+			pages.getRecords().forEach(item -> {
+				if (ObjectUtil.isNotEmpty(updateUserList)) {
+					User user = updateUserList.stream().anyMatch(e -> e.getId().equals(item.getUpdateUser())) ? updateUserList.stream().filter(e -> e.getId().equals(item.getUpdateUser())).findFirst().get() : null;
+					if (user != null) {
+						item.setUpdateUserName(user.getName());
+					}
+				}
+				if (ObjectUtil.isNotEmpty(createUserList)) {
+					User user = createUserList.stream().anyMatch(e -> e.getId().equals(item.getCreateUser())) ? createUserList.stream().filter(e -> e.getId().equals(item.getCreateUser())).findFirst().get() : null;
+					if (user != null) {
+						item.setCreateUserName(user.getName());
+					}
+				}
+				item.setItem(orderItemsService.count(new LambdaQueryWrapper<PjOrderItems>().eq(PjOrderItems::getIsDeleted, 0)
+					.eq(PjOrderItems::getPid, item.getId())) + "");
+			});
+		}
+		return R.data(pages);
+	}
+
+	/**
+	 * 订单(导出)
+	 */
+	@GetMapping("/listExport")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入order")
+	public void listExport(PjOrder order, HttpServletResponse response) {
+		LambdaQueryWrapper<PjOrder> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(PjOrder::getTenantId, AuthUtil.getTenantId())
+			.eq(PjOrder::getIsDeleted, 0)
+			.eq(PjOrder::getBsType, order.getBsType())
+			.eq(PjOrder::getSalesCompanyId, AuthUtil.getDeptId())
+			.eq(ObjectUtils.isNotEmpty(order.getStorageId()), PjOrder::getStorageId, order.getStorageId())
+			.like(ObjectUtils.isNotEmpty(order.getStorageName()), PjOrder::getStorageName, order.getStorageName())
+			.eq(ObjectUtils.isNotEmpty(order.getSalerId()), PjOrder::getSalerId, order.getSalerId())
+			.like(ObjectUtils.isNotEmpty(order.getOrdNo()), PjOrder::getOrdNo, order.getOrdNo())
+			.apply(ObjectUtils.isNotEmpty(order.getStatus()), "find_in_set(status,'" + order.getStatus() + "')");
+		if (order.getBusinesDateList() != null && order.getBusinesDateList().size() > 1) {
+			lambdaQueryWrapper.ge(PjOrder::getBusinesDate, order.getBusinesDateList().get(0));
+			lambdaQueryWrapper.le(PjOrder::getBusinesDate, order.getBusinesDateList().get(1));
+		}
+		lambdaQueryWrapper.orderByDesc(PjOrder::getCreateTime);
+		if (!AuthUtil.getUserRole().contains("admin") && !AuthUtil.getUserRole().contains("老板")) {
+			if (AuthUtil.getUserRole().contains("业务员")) {
+				lambdaQueryWrapper.eq(PjOrder::getSalerId, AuthUtil.getUserId());
+			} else if (AuthUtil.getUserRole().contains("客户")) {
+				lambdaQueryWrapper.eq(PjOrder::getCreateUser, AuthUtil.getUserId());
+			}
+		}
+		List<PjOrder> pages = orderService.list(lambdaQueryWrapper);
+		StringBuilder updateUserIds = new StringBuilder();//修改人id拼接
+		StringBuilder createUserIds = new StringBuilder();//创建人id拼接
+		for (PjOrder items : pages) {
+			if (ObjectUtil.isNotEmpty(items.getUpdateUser())) {
+				updateUserIds.append(items.getUpdateUser()).append(",");
+			}
+			if (ObjectUtil.isNotEmpty(items.getCreateUser())) {
+				createUserIds.append(items.getCreateUser()).append(",");
+			}
+		}
+		//获得修改人信息
+		List<User> updateUserList = iUserClient.selectUserIds(updateUserIds.toString());
+		//获得创建人信息
+		List<User> createUserList = iUserClient.selectUserIds(createUserIds.toString());
+		if (CollectionUtils.isNotEmpty(pages)) {
+			pages.forEach(item -> {
+				if (ObjectUtil.isNotEmpty(updateUserList)) {
+					User user = updateUserList.stream().anyMatch(e -> e.getId().equals(item.getUpdateUser())) ? updateUserList.stream().filter(e -> e.getId().equals(item.getUpdateUser())).findFirst().get() : null;
+					if (user != null) {
+						item.setUpdateUserName(user.getName());
+					}
+				}
+				if (ObjectUtil.isNotEmpty(createUserList)) {
+					User user = createUserList.stream().anyMatch(e -> e.getId().equals(item.getCreateUser())) ? createUserList.stream().filter(e -> e.getId().equals(item.getCreateUser())).findFirst().get() : null;
+					if (user != null) {
+						item.setCreateUserName(user.getName());
+					}
+				}
+			});
+		}
+		ExcelUtil.export(response, "盘点单", "盘点数据", BeanUtil.copy(pages, PjOrderExportExcelPD.class), PjOrderExportExcelPD.class);
+	}
+
+	/**
+	 * 盘点明细导入
+	 */
+	@PostMapping("/import-item")
+	@ApiOperationSupport(order = 13)
+	@ApiOperation(value = "盘点明细导入", notes = "传入excel")
+	public R<List<PjOrderItems>> importItem(@RequestParam("file") MultipartFile file) {
+		//导入数据
+		List<StockExportExcel> excelList = ExcelUtil.read(file, StockExportExcel.class);
+		if (CollectionUtils.isEmpty(excelList)) {
+			throw new SecurityException("数据不能为空");
+		}
+		return orderService.importItem(excelList);
+	}
+
+	/**
+	 * 配件销售新增或修改
+	 */
+	@PostMapping("/submitInventory")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入order")
+	@RepeatSubmit
+	public R submitInventory(@Valid @RequestBody PjOrder order) {
+		if (StringUtils.isBlank(order.getBsType())) {
+			throw new RuntimeException("缺少必要参数");
+		}
+		return orderService.submitInventory(order);
+	}
+
+	/**
+	 * 确认盘点
+	 */
+	@PostMapping("/confirmInventory")
+	@ApiOperationSupport(order = 8)
+	@RepeatSubmit
+	public R confirmInventory(@Valid @RequestBody PjOrder order) {
+		if (order.getId() == null) {
+			throw new RuntimeException("来源信息错误");
+		}
+		return orderService.confirmInventory(order);
+	}
+}

+ 3 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/mapper/OrderMapper.java

@@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.apache.ibatis.annotations.Param;
 import org.springblade.salesPart.entity.PjOrder;
 import org.springblade.salesPart.excel.PjOrderStatisticsExcel;
+import org.springblade.salesPart.excel.PjShipStockDetails;
 import org.springblade.salesPart.vo.OrderStatistics;
 import org.springblade.salesPart.vo.OrderVO;
 import org.springblade.salesPart.vo.PjOrderStatisticsWeb;
@@ -67,4 +68,6 @@ public interface OrderMapper extends BaseMapper<PjOrder> {
 	List<PjOrderStatisticsExcel> statisticsExport(@Param("order") PjOrderStatisticsWeb order);
 
     int corpAnalysis(@Param("order") PjOrder order);
+
+    List<PjShipStockDetails> stockDataDetailsOrder(@Param("order")PjShipStockDetails pjShipStockDetails);
 }

+ 41 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/mapper/OrderMapper.xml

@@ -354,5 +354,46 @@
             AND busines_date between date_sub(now(),interval 6 month) and now();
         </if>
     </select>
+    <select id="stockDataDetailsOrder" resultType="org.springblade.salesPart.excel.PjShipStockDetails">
+        SELECT
+        ps.id as id,
+        ps.storage_id as stockId,
+        ps.ord_no AS billno,
+        ps.status AS statusName,
+        ps.update_time AS updateTime,
+        pgd.brand_item AS brandItem,
+        pgd.cname AS goodsName,
+        pgd.specification_and_model AS specificationAndModel,
+        psi.inventory as totalNum,
+        if(psi.profit_loss_num,psi.profit_loss_num,0) as profitLossNum
+        FROM
+        pjpf_order_items psi
+        LEFT JOIN pjpf_order ps ON ps.id = psi.pid
+        LEFT JOIN pjpf_goods_desc pgd ON pgd.id = psi.goods_id
+        WHERE
+        ps.is_deleted = '0'
+        and psi.is_deleted = '0'
+        AND ps.bs_type = 'PD'
+        AND ps.tenant_id = #{order.tenantId}
+        AND  ps.status =  '已确认'
+        <if test="order.dot!=null and order.dot!=''">
+            and psi.dot = #{order.dot}
+        </if>
+        <if test="order.dot == null or order.dot ==''">
+            and psi.dot is null
+        </if>
+        <if test="order.stockId!=null">
+            and ps.storage_id = #{order.stockId}
+        </if>
+        <if test="order.goodsId!=null">
+            and psi.goods_id = #{order.goodsId}
+        </if>
+        <if test="order.salesCompanyId!=null and order.salesCompanyId!=''">
+            and ps.sales_company_id = #{order.salesCompanyId}
+        </if>
+        GROUP BY
+        ps.ord_no
+        ORDER BY ps.busines_date asc
+    </select>
 
 </mapper>

+ 8 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/IOrderService.java

@@ -20,7 +20,9 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.core.tool.api.R;
 import org.springblade.salesPart.entity.PjOrder;
+import org.springblade.salesPart.entity.PjOrderItems;
 import org.springblade.salesPart.excel.PjOrderStatisticsExcel;
+import org.springblade.salesPart.excel.StockExportExcel;
 import org.springblade.salesPart.vo.OrderStatistics;
 import org.springblade.salesPart.vo.OrderVO;
 import org.springblade.salesPart.vo.PjOrderStatisticsWeb;
@@ -172,4 +174,10 @@ public interface IOrderService extends IService<PjOrder> {
 	 * @return
 	 */
     R shortcutWarehousing(PjOrder order);
+
+    R submitInventory(PjOrder order);
+
+	R confirmInventory(PjOrder order);
+
+	R<List<PjOrderItems>> importItem(List<StockExportExcel> excelList);
 }

+ 189 - 1
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/impl/OrderServiceImpl.java

@@ -35,7 +35,6 @@ import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.pay.tonglianPayment.entity.WechatMark;
 import org.springblade.pay.tonglianPayment.fegin.IPaymentClient;
-import org.springblade.purchase.sales.entity.BidingItems;
 import org.springblade.purchase.sales.entity.IntegralDetail;
 import org.springblade.purchase.sales.feign.IIntegralDetailClient;
 import org.springblade.salesPart.brand.service.IBrandFilesService;
@@ -49,6 +48,7 @@ import org.springblade.salesPart.corps.mapper.CorpsDescMapper;
 import org.springblade.salesPart.entity.*;
 import org.springblade.salesPart.enums.OrderTypeEnum;
 import org.springblade.salesPart.excel.PjOrderStatisticsExcel;
+import org.springblade.salesPart.excel.StockExportExcel;
 import org.springblade.salesPart.goods.mapper.GoodsDescMapper;
 import org.springblade.salesPart.goods.mapper.GoodsTypeMapper;
 import org.springblade.salesPart.goods.service.IGoodsFilesService;
@@ -802,6 +802,194 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 		return R.data(pjOrder);
 	}
 
+	@Override
+	public R submitInventory(PjOrder order) {
+		// 获取系统编号
+		R billNo = serialClient.getBillNo(order.getBsType(), order.getBsType(), order.getBsType());
+		if (billNo.getCode() != 200) {
+			TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+			return R.fail(500, "生成系统编号失败");
+		}
+		//仓库名称
+		if (ObjectUtils.isNotNull(order.getStorageId())) {
+			order.setStorageName(storageDescMapper.selectById(order.getStorageId()).getCname());
+		}
+		if (order.getId() == null) {
+			order.setOrdNo((String) billNo.getData());
+			order.setCreateTime(new Date());
+			order.setCreateUser(AuthUtil.getUserId());
+			order.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+			order.setTenantId(AuthUtil.getTenantId());
+			order.setStatus(OrderTypeEnum.XSLR.getType());
+			//所属公司
+			R<Dept> dept = sysClient.getDept(Long.valueOf(AuthUtil.getDeptId()));
+			if (ObjectUtil.isNotEmpty(dept)) {
+				order.setSalesCompanyId(dept.getData().getId());
+				order.setSalesCompanyName(dept.getData().getFullName());
+			} else {
+				throw new SecurityException("未维护所属公司");
+			}
+			baseMapper.insert(order);
+		} else {
+			order.setUpdateUser(AuthUtil.getUserId());
+			order.setUpdateTime(new Date());
+			baseMapper.updateById(order);
+		}
+		// 保存订单明细
+		if (CollectionUtils.isNotEmpty(order.getOrderItemsList())) {
+			order.getOrderItemsList().forEach(item -> {
+				item.setBizType(order.getBsType());
+				item.setBillNo(order.getOrdNo());
+				BigDecimal profitLossNum = new BigDecimal("0.00");
+				profitLossNum = item.getSendNum().subtract(item.getInventory());
+				item.setTotalAmount(item.getInventory().multiply(item.getCostprie()));
+				item.setSubTotalMoney(item.getSendNum().multiply(item.getCostprie()));
+				BigDecimal profitLossAmount = new BigDecimal("0.00");
+				profitLossAmount = profitLossNum.multiply(item.getCostprie());
+				item.setProfitLossNum(profitLossNum);
+				item.setProfitLossAmount(profitLossAmount);
+				if (item.getId() == null) {
+					item.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+					item.setCreateTime(new Date());
+					item.setCreateUser(AuthUtil.getUserId());
+					item.setPid(order.getId());
+					item.setTenantId(AuthUtil.getTenantId());
+				} else {
+					item.setUpdateTime(new Date());
+					item.setUpdateUser(AuthUtil.getUserId());
+					item.setPid(order.getId());
+				}
+			});
+			orderItemsService.saveOrUpdateBatch(order.getOrderItemsList());
+			order.setNumberRows(order.getOrderItemsList().size());
+			//明细总数量
+			order.setGoodsTotalNum(order.getOrderItemsList().stream().map(PjOrderItems::getInventory).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+			order.setGoodsTotalShipNum(order.getOrderItemsList().stream().map(PjOrderItems::getSendNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+			order.setProfitLossNum(order.getOrderItemsList().stream().map(PjOrderItems::getProfitLossNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+			order.setSalesAmount(order.getOrderItemsList().stream().map(PjOrderItems::getSubTotalMoney).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+			order.setTotalMoney(order.getOrderItemsList().stream().map(PjOrderItems::getTotalAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+			order.setProfitLossAmount(order.getOrderItemsList().stream().map(PjOrderItems::getProfitLossAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+		} else {
+			order.setNumberRows(0);
+			order.setGoodsTotalNum(new BigDecimal("0.00"));
+			order.setGoodsTotalShipNum(new BigDecimal("0.00"));
+			order.setProfitLossNum(new BigDecimal("0.00"));
+			order.setSalesAmount(new BigDecimal("0.00"));
+			order.setTotalMoney(new BigDecimal("0.00"));
+			order.setProfitLossAmount(new BigDecimal("0.00"));
+		}
+		baseMapper.updateById(order);
+		return R.data(order);
+	}
+
+	@Override
+	public R confirmInventory(PjOrder order) {
+		PjOrder pjOrder = baseMapper.selectById(order.getId());
+		// 保存订单明细
+		if (CollectionUtils.isNotEmpty(order.getOrderItemsList())) {
+			List<PjStockDesc> pjStockDescArrayList = new ArrayList<>();
+			List<Long> goodsIds = order.getOrderItemsList().stream().map(PjOrderItems::getGoodsId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
+			List<PjGoodsDesc> pjGoodsDescList = new ArrayList<>();
+			List<PjStockDesc> pjStockDescList = new ArrayList<>();
+			if (goodsIds.size() > 0) {
+				pjGoodsDescList = goodsDescMapper.selectList(new LambdaQueryWrapper<PjGoodsDesc>()
+					.eq(PjGoodsDesc::getTenantId, AuthUtil.getTenantId())
+					.eq(PjGoodsDesc::getIsDeleted, 0)
+					.in(PjGoodsDesc::getId, goodsIds));
+				pjStockDescList = stockDescService.list(new LambdaQueryWrapper<PjStockDesc>()
+					.eq(PjStockDesc::getTenantId, AuthUtil.getTenantId())
+					.eq(PjStockDesc::getIsDeleted, 0)
+					.eq(PjStockDesc::getSalesCompanyId, pjOrder.getSalesCompanyId())
+					.in(PjStockDesc::getGoodsId, goodsIds)
+					.eq(PjStockDesc::getStorageId, pjOrder.getStorageId()));
+			}
+			List<PjGoodsDesc> finalPjGoodsDescList = pjGoodsDescList;
+			List<PjStockDesc> finalPjStockDescList = pjStockDescList;
+			order.getOrderItemsList().forEach(item -> {
+				//获得商品
+				PjGoodsDesc goodsDesc = finalPjGoodsDescList.stream().filter(e -> e.getId().equals(item.getGoodsId()))
+					.findFirst().orElse(null);
+				if (ObjectUtil.isEmpty(goodsDesc)) {
+					throw new RuntimeException("商品数据异常");
+				}
+				if ("1".equals(goodsDesc.getWhether()) && ObjectUtils.isNull(item.getDot())) {
+					throw new RuntimeException("商品:" + goodsDesc.getCname() + ",请求选择批次号");
+				}
+				//管理批次号
+				PjStockDesc stockOne = null;
+				if (ObjectUtil.isNotEmpty(goodsDesc.getWhether()) && "1".equals(goodsDesc.getWhether())) {
+					stockOne = finalPjStockDescList.stream().filter(e -> e.getGoodsId().equals(item.getGoodsId()) &&
+						e.getDot().equals(item.getDot())).findFirst().orElse(null);
+
+				} else {
+					stockOne = finalPjStockDescList.stream().filter(e -> e.getGoodsId().equals(item.getGoodsId()) &&
+						ObjectUtils.isNotNull(e.getDot())).findFirst().orElse(null);
+				}
+				if (stockOne != null) {
+					stockOne.setBalanceQuantity(item.getSendNum());
+					stockOne.setStoreInventory(stockOne.getBalanceQuantity());
+					stockOne.setInventoryAmount(item.getSubTotalMoney());
+					stockOne.setVersion(stockOne.getVersion());
+					pjStockDescArrayList.add(stockOne);
+				} else {
+					throw new RuntimeException("商品:" + goodsDesc.getCname() + "未查到库存信息");
+				}
+			});
+			R res = stockDescService.updateBatchByIdNew(pjStockDescArrayList);
+			if (!res.isSuccess()) {
+				throw new RuntimeException(res.getMsg());
+			}
+		}
+		order.setStatus("已确认");
+		baseMapper.updateById(order);
+		return R.data(order);
+	}
+
+	@Override
+	public R<List<PjOrderItems>> importItem(List<StockExportExcel> excelList) {
+		if (CollectionUtils.isEmpty(excelList)) {
+			throw new SecurityException("导入数据不能为空");
+		}
+		List<PjOrderItems> list = new ArrayList<>();
+		List<String> storage = excelList.stream().map(StockExportExcel::getStorageName).distinct().collect(Collectors.toList());
+		if (storage.size() > 1) {
+			throw new RuntimeException("导入数据存在多个库存数据,请修改");
+		}
+		for (int i = 0; i < excelList.size(); i++) {
+			//判断必填项是否为空
+			StockExportExcel itemExcel = excelList.get(i);
+			if (ObjectUtil.isEmpty(itemExcel.getProfitLossNum())) {
+				throw new SecurityException("第" + (i + 2) + "行,盘点库存为空");
+			}
+
+			PjOrderItems item = new PjOrderItems();
+			//查询商品信息
+			LambdaQueryWrapper<PjGoodsDesc> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+			lambdaQueryWrapper.eq(PjGoodsDesc::getTenantId, AuthUtil.getTenantId())
+				.eq(PjGoodsDesc::getIsDeleted, 0)
+				.eq(PjGoodsDesc::getCname, itemExcel.getCname());
+			PjGoodsDesc goodsDesc = goodsDescMapper.selectOne(lambdaQueryWrapper);
+			if (ObjectUtil.isNotEmpty(goodsDesc)) {
+				item.setGoodsId(goodsDesc.getId());
+				item.setGoodsName(goodsDesc.getCname());
+				item.setGoodsNo(goodsDesc.getCode());
+				item.setBrandId(goodsDesc.getBrandId());
+				item.setBrandName(goodsDesc.getBrandName());
+				item.setPropertyName(goodsDesc.getSpecificationAndModel());
+				item.setPattern(goodsDesc.getBrandItem());
+				item.setGoodsDescription(goodsDesc.getGoodsDescription());
+				item.setUnits(goodsDesc.getUnit());
+				item.setSendNum(itemExcel.getProfitLossNum());
+				item.setCostprie(itemExcel.getInventoryCostPrice());
+				item.setInventory(itemExcel.getBalanceQuantity());
+			} else {
+				throw new RuntimeException("第" + (i + 2) + "行,商品名称不存在");
+			}
+			list.add(item);
+		}
+		return R.data(list);
+	}
+
 	/**
 	 * 保存订单信息
 	 *

+ 19 - 1
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/controller/ShipController.java

@@ -49,6 +49,7 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -114,7 +115,7 @@ public class ShipController extends BladeController {
 			lambdaQueryWrapper.le(PjShip::getBusinesDate, ship.getBusinesDateList().get(1));
 		}
 		lambdaQueryWrapper.orderByDesc(PjShip::getCreateTime);
-		if (!AuthUtil.getUserRole().contains("admin") && !AuthUtil.getUserRole().contains("老板")){
+		if (!AuthUtil.getUserRole().contains("admin") && !AuthUtil.getUserRole().contains("老板")) {
 			if (AuthUtil.getUserRole().contains("库管")) {
 				lambdaQueryWrapper.and(i -> i.eq(PjShip::getStockClerkId, AuthUtil.getUserId()).or().isNull(PjShip::getStockClerkId));
 			} else if (AuthUtil.getUserRole().contains("客户")) {
@@ -395,6 +396,23 @@ public class ShipController extends BladeController {
 				}
 			}
 		}
+		List<PjShipStockDetails> pagesOrder = shipService.stockDataDetailsOrder(pjShipStockDetails);
+		for (PjShipStockDetails item : pagesOrder) {
+			item.setBizTypeName("盘点");
+			if (new BigDecimal("0.00").compareTo(item.getProfitLossNum()) > 0) {
+				item.setSubSendTotalNum(item.getProfitLossNum().abs());
+				item.setAddSendTotalNum(new BigDecimal("0.00"));
+			} else if (new BigDecimal("0.00").compareTo(item.getProfitLossNum()) < 0) {
+				item.setAddSendTotalNum(item.getProfitLossNum().abs());
+				item.setSubSendTotalNum(new BigDecimal("0.00"));
+			} else {
+				item.setSubSendTotalNum(new BigDecimal("0.00"));
+				item.setAddSendTotalNum(new BigDecimal("0.00"));
+			}
+		}
+		if (pagesOrder.size() > 0) {
+			pages.addAll(pagesOrder);
+		}
 		return R.data(pages);
 	}
 

+ 2 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/service/IShipService.java

@@ -158,4 +158,6 @@ public interface IShipService extends IService<PjShip> {
 	 * @return
 	 */
 	R revokeTransferAllocate(PjShip order);
+
+	List<PjShipStockDetails> stockDataDetailsOrder(PjShipStockDetails pjShipStockDetails);
 }

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

@@ -1751,4 +1751,9 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 		return R.data(detail);
 	}
 
+	@Override
+	public List<PjShipStockDetails> stockDataDetailsOrder(PjShipStockDetails pjShipStockDetails) {
+		return orderMapper.stockDataDetailsOrder(pjShipStockDetails);
+	}
+
 }