Commit 92fcc23b by yubin

Merge remote-tracking branch 'origin/master'

parents 69db319b ab86dcba
# 页面标题
VUE_APP_TITLE = 若依管理系统
VUE_APP_TITLE = 库存管理系统
# 开发环境配置
ENV = 'development'
......
# 页面标题
VUE_APP_TITLE = 若依管理系统
VUE_APP_TITLE = 库存管理系统
# 生产环境配置
ENV = 'production'
......
# 页面标题
VUE_APP_TITLE = 若依管理系统
VUE_APP_TITLE = 库存管理系统
BABEL_ENV = production
......
{
"name": "ruoyi",
"version": "3.9.0",
"description": "若依管理系统",
"author": "若依",
"description": "库存管理系统",
"author": "",
"license": "MIT",
"scripts": {
"dev": "vue-cli-service serve",
......
......@@ -110,7 +110,7 @@
height="100%"
:data="inboundList"
@selection-change="handleSelectionChange"
:row-key="(row) => row.materialId + '_' + row.orderId"
:row-key="(row) => row.materialId + '_' + row.orderId + '_' + row.warehousesName + '_' + row.locationName"
>
<el-table-column label="物料SAPNO" align="center" prop="sapNo" width="200"/>
<el-table-column label="物料名称" align="center" prop="materialName" width="200"/>
......
......@@ -177,9 +177,9 @@
</el-tag>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" width="200">
<el-table-column label="入库时间" align="center" prop="inboundDate" width="200">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
<span>{{ parseTime(scope.row.inboundDate,'{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column
......@@ -903,7 +903,7 @@ export default {
const queryForm = {
pageNum: 1,
pageSize: 9999,
orderId: row.orderId
inboundOrderId: row.id
}
const response = await listInbound_itemsAndMname(queryForm)
row.inboundOrderItemsList = response.rows.map(item => {
......@@ -915,7 +915,8 @@ export default {
ownerId: row.ownerId,
quantity: item.actualQuantity,
unitWeight: item.unitWeight,
isUsed: 1
isUsed: 1,
unitPrice: item.unitPrice
};
})
// 第三步:确保数据存在后调用入库接口
......
......@@ -183,7 +183,6 @@
type="text"
icon="el-icon-more"
@click="handleDetail(scope.row)"
v-hasPermi="['inventory:return_orders:view']"
v-show="(scope.row.orderStatus === 2)"
>详情</el-button>
</template>
......
......@@ -7,9 +7,9 @@ function resolve(dir) {
const CompressionPlugin = require('compression-webpack-plugin')
const name = process.env.VUE_APP_TITLE || '若依管理系统' // 网页标题
const name = process.env.VUE_APP_TITLE || '管理系统' // 网页标题
const baseUrl = 'http://localhost:8080' // 后端接口
const baseUrl = 'http://localhost:9001' // 后端接口
const port = process.env.port || process.env.npm_config_port || 80 // 端口
......
package com.ruoyi.web.controller.inventory;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import com.ruoyi.common.core.domain.entity.Materials;
import com.ruoyi.common.utils.uuid.UUID;
......@@ -11,6 +13,7 @@ import com.ruoyi.inventory.domain.vo.InboundMaterialTotalVO;
import com.ruoyi.inventory.domain.vo.InboundTemplateVO;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
......@@ -127,13 +130,63 @@ public class InboundOrdersController extends BaseController
@RequestParam("updateSupport") Integer updateSupport,
@RequestParam(value = "orderType", required = false) Integer orderType) throws Exception
{
// 防护1:校验文件非空
if (file == null || file.isEmpty()) {
return error("导入文件不能为空!");
}
// 防护2:校验文件格式
String fileName = file.getOriginalFilename();
if (!fileName.endsWith(".xlsx") && !fileName.endsWith(".xls")) {
return error("仅支持Excel格式文件(.xlsx/.xls)!");
}
// 第二步:校验Excel列名是否匹配模板(核心!拦截非模板数据)
List<String> templateColumns = Arrays.asList(
"入库日期",
"SAP No",
"物料名称",
"TS Code",
"货主",
"批号",
"计划数量",
"单号",
"系统编号",
"件重",
"约数",
"实际件数",
"实发数量",
"仓库",
"库位",
"标签颜色",
"凭证号",
"单价",
"备注",
"订单类型",
"收货人",
"物料备注"
);
List<String> excelColumns = ExcelUtil.getExcelHeader(file.getInputStream()); // 自定义方法读取表头
if (CollectionUtils.isEmpty(excelColumns) || !excelColumns.containsAll(templateColumns)) {
return AjaxResult.error("导入文件不是标准模板!请下载官方模板后填写(缺失列:"
+ getMissingColumns(templateColumns, excelColumns) + ")");
}
ExcelUtil<InboundTemplateVO> util = new ExcelUtil<InboundTemplateVO>(InboundTemplateVO.class);
List<InboundTemplateVO> inboundOrders = util.importExcel(file.getInputStream());
// 防护3:拦截空列表,避免 Service 层处理空数据
if (CollectionUtils.isEmpty(inboundOrders)) {
return error("Excel中未解析到有效数据,请检查模板是否正确!");
}
String operName = getUsername();
String message = inboundOrdersService.importInboundOrders(inboundOrders, updateSupport, operName, orderType);
return success(message);
}
// 辅助方法:获取缺失的列名
private String getMissingColumns(List<String> template, List<String> excel) {
return template.stream()
.filter(col -> !excel.contains(col))
.collect(Collectors.joining("、"));
}
/**
* 首页入库次数统计api
......
......@@ -2,11 +2,17 @@
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
#driverClassName: com.mysql.cj.jdbc.Driver
driver-class-name: com.mysql.cj.jdbc.Driver # 配置MySQL的驱动程序类
druid:
# 主库数据源
master:
# 数据库连接地址
#生產
#url: jdbc:mysql://172.19.1.150:9012/inventory_manager?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&useSSL=false
#username: root # 数据库用户名
#password: 'Aa123456'
#測試
url: jdbc:mysql://demo.docmis.cn:23500/inventory_manager?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&useSSL=false
username: root
password: '!QAZ2wsx#EDC2022'
......
......@@ -16,7 +16,7 @@ ruoyi:
# 开发环境配置
server:
# 服务器的HTTP端口,默认为8080
port: 8080
port: 9001
servlet:
# 应用的访问路径
context-path: /
......
......@@ -12,17 +12,9 @@ import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.RegExUtils;
......@@ -1909,4 +1901,34 @@ public class ExcelUtil<T>
}
return method;
}
/**
* 读取Excel表头(第一行)
*/
public static List<String> getExcelHeader(InputStream inputStream) {
try (Workbook workbook = WorkbookFactory.create(inputStream)) {
Sheet sheet = workbook.getSheetAt(0);
Row headerRow = sheet.getRow(0); // 第一行是表头
if (headerRow == null) {
return Collections.emptyList();
}
return IntStream.range(0, headerRow.getLastCellNum())
.mapToObj(headerRow::getCell)
.map(cell -> {
// 单元格类型容错(数字/字符串统一转字符串)
if (cell == null) {
return "";
}
cell.setCellType(CellType.STRING);
return StringUtils.trim(cell.getStringCellValue());
})
.filter(StringUtils::isNotBlank)
.collect(Collectors.toList());
} catch (Exception e) {
log.error("读取Excel表头失败", e);
return Collections.emptyList();
}
}
}
......@@ -68,7 +68,7 @@ public class InventoryController extends BaseController
/**
* 查询库存列表(按物料汇总统计)
*/
@PreAuthorize("@ss.hasPermi('inventory:inventory:list')")
// @PreAuthorize("@ss.hasPermi('inventory:inventory:list')")
@GetMapping("/listCount")
public TableDataInfo listCount(Inventory inventory)
{
......@@ -80,7 +80,7 @@ public class InventoryController extends BaseController
/**
* 查询库存明细列表(根据物料标识及检索条件)
*/
@PreAuthorize("@ss.hasPermi('inventory:inventory:list')")
// @PreAuthorize("@ss.hasPermi('inventory:inventory:list')")
@GetMapping("/detailList")
public TableDataInfo detailList(Inventory inventory)
{
......
......@@ -31,7 +31,7 @@ public class InventoryStatisticsController extends BaseController {
/**
* 出入库统计列表
*/
@PreAuthorize("@ss.hasPermi('inventory:statistics:list')")
// @PreAuthorize("@ss.hasPermi('inventory:statistics:list')")
@GetMapping("/inboundOutbound")
public TableDataInfo list(InboundOutboundStatisticsVO query) {
startPage();
......
......@@ -43,7 +43,7 @@ public class ReturnOrderItemsController extends BaseController
/**
* 查询退库单明细列表
*/
@PreAuthorize("@ss.hasPermi('inventory:return_order_items:count_detail')")
// @PreAuthorize("@ss.hasPermi('inventory:return_order_items:count_detail')")
@GetMapping("/count_detail")
public TableDataInfo list(ReturnOrderItems returnOrderItems)
{
......@@ -69,7 +69,7 @@ public class ReturnOrderItemsController extends BaseController
/**
* 获取退库单明细详细信息
*/
@PreAuthorize("@ss.hasPermi('inventory:return_order_items:query')")
// @PreAuthorize("@ss.hasPermi('inventory:return_order_items:query')")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") String id)
{
......@@ -112,7 +112,7 @@ public class ReturnOrderItemsController extends BaseController
/**
* 查询退库单明细列表
*/
@PreAuthorize("@ss.hasPermi('inventory:return_order_items:count')")
// @PreAuthorize("@ss.hasPermi('inventory:return_order_items:count')")
@PostMapping("/count")
public TableDataInfo count(ReturnOrderItems returnOrderItems)
{
......
......@@ -178,4 +178,6 @@ public class Inventory extends BaseEntity
/** 特殊存储要求 */
// @Excel(name = "特殊存储要求")
private String specialRequirements;
private Double unitPrice;
}
......@@ -401,6 +401,6 @@
ioi.unit_price,
ioi.remark,
io.inbound_date
order by ioi.order_id asc,ioi.material_id asc
order by inbound_date desc,ioi.order_id asc,ioi.material_id asc
</select>
</mapper>
\ No newline at end of file
......@@ -93,6 +93,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="createUserCode != null and createUserCode != ''"> and create_user_code = #{createUserCode}</if>
<if test="updateUserCode != null and updateUserCode != ''"> and update_user_code = #{updateUserCode}</if>
</where>
order by inbound_date desc,create_time desc
</select>
<select id="selectInboundOrdersById" parameterType="String" resultMap="InboundOrdersInboundOrderItemsResult">
......
......@@ -459,7 +459,8 @@ and inventory_status = '1'
<if test="createUserCode != null">create_user_code,</if>
<if test="updateTime != null">update_time,</if>
<if test="updateUserCode != null">update_user_code,</if>
<if test="warehousesId != null"> warehouses_id,</if>
<if test="warehousesId != null">warehouses_id,</if>
<if test="unitPrice != null"> unit_price,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">#{id},</if>
......@@ -486,6 +487,7 @@ and inventory_status = '1'
<if test="updateTime != null">#{updateTime},</if>
<if test="updateUserCode != null">#{updateUserCode},</if>
<if test="warehousesId != null"> #{warehousesId},</if>
<if test="unitPrice != null"> #{unitPrice},</if>
</trim>
</insert>
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论