Compare commits

...

18 Commits

Author SHA1 Message Date
zx
daeabed075 已出库状态不可修改 2026-03-12 15:47:54 +08:00
zx
2e569a8165 修改入库、出库页面列表字段顺序 2026-03-12 14:42:58 +08:00
adaa774236 优化 2026-03-10 10:52:48 +08:00
f2b8f2f6de 提交 2026-03-10 09:33:29 +08:00
a491fd75c3 优化 2026-03-06 16:53:11 +08:00
f6c665c8fa 添加从供应计划累加的功能 2026-03-06 14:48:18 +08:00
7059706e9b 修改调度任务判断逻辑 2026-03-06 10:31:49 +08:00
d05e577d13 Merge branch 'main' of http://47.100.212.83:3000/yangzifeng/shzg_projectManage 2026-03-06 10:11:28 +08:00
23a49fc297 优化出库管理的打印单据 2026-03-06 09:47:55 +08:00
81bef6a164 Merge branch 'main' of http://47.100.212.83:3000/yangzifeng/shzg_projectManage 2026-03-06 09:09:48 +08:00
7b77ab0996 优化添加至入库的逻辑 2026-03-03 15:19:02 +08:00
zx
079818aa0f 修改盘点正常的列表 2026-02-28 09:35:39 +08:00
zx
2897bc3f51 修改库存页面查询条件 2026-02-25 16:15:47 +08:00
zx
8e818b7430 修改打印单据总计求和方法 2026-02-24 15:23:09 +08:00
8af7570fe8 Merge branch 'main' of http://47.100.212.83:3000/yangzifeng/shzg_projectManage 2026-02-11 09:35:24 +08:00
03eedebacd 调度 2026-02-11 09:35:22 +08:00
b0db03bf52 Merge branch 'main' of http://47.100.212.83:3000/yangzifeng/shzg_projectManage 2026-02-10 09:30:30 +08:00
48d900355d 1 2026-02-10 09:30:27 +08:00
10 changed files with 586 additions and 759 deletions

View File

@@ -6,6 +6,6 @@ VITE_APP_ENV = 'development'
# 后台管理系统/开发环境 # 后台管理系统/开发环境
# VITE_APP_BASE_API = 'http://192.168.1.112:8086' # VITE_APP_BASE_API = 'http://192.168.1.112:8086'
VITE_APP_BASE_API = 'http://192.168.1.5:8087' # VITE_APP_BASE_API = 'http://192.168.1.5:8087' #温
# VITE_APP_BASE_API = 'http://192.168.1.19:8086' VITE_APP_BASE_API = 'http://192.168.1.13:8087' #雨欣
# VITE_APP_BASE_API = 'http://192.168.1.251:8086' # VITE_APP_BASE_API = 'http://192.168.1.251:8087'

View File

@@ -1,11 +1,12 @@
import request from '@/utils/request' import request from '@/utils/request'
// 开始盘点 // 开始盘点
export function getTaskCount(query) { export function getTaskCount(data) {
return request({ return request({
url: '/statistics/count', // url: '/statistics/count',
method: 'get', url: '/MatchScan/countByWarehouseAndScene',
params: query method: 'post',
data: data
}) })
} }
@@ -17,7 +18,14 @@ export function getScan(query) {
params: query params: query
}) })
} }
// 统计
export function getTotalStatistics(data) {
return request({
url: '/MatchScan/statistics',
method: 'post',
data: data
})
}
// 开始匹配 // 开始匹配
export function getMatch(data) { export function getMatch(data) {
return request({ return request({
@@ -44,6 +52,15 @@ export function getScanResult(query) {
params: query params: query
}) })
} }
// 获取盘点结果 - 最新再用
export function inventoryList(data) {
return request({
url: '/MatchScan/inventoryList',
method: 'post',
data: data
})
}
// 获取图表 // 获取图表
export function getChart(data) { export function getChart(data) {

View File

@@ -25,7 +25,7 @@
</tr> </tr>
<tr v-if="!isRuKu"> <tr v-if="!isRuKu">
<td class="label-td">项目编号</td> <td class="label-td">项目编号</td>
<td class="value-td" colspan="3">{{ billAllObj[0]?.xmNo }}</td> <td class="value-td" colspan="3">{{ billAllObj[0]?.bizType == 1 ? xmNo :billAllObj[0]?.xmNo }}</td>
</tr> </tr>
<tr v-if="!isRuKu"> <tr v-if="!isRuKu">
<td class="label-td">项目描述</td> <td class="label-td">项目描述</td>
@@ -80,7 +80,7 @@
<th>数量</th> <th>数量</th>
<th>库位码</th> <th>库位码</th>
<th>订单编号</th> <th>订单编号</th>
<th v-if="isRuKu">项目编号</th> <th>项目编号</th>
<th v-if="isRuKu">项目描述</th> <th v-if="isRuKu">项目描述</th>
<th>备注</th> <th>备注</th>
<th>身份码</th> <th>身份码</th>
@@ -96,7 +96,7 @@
<td style="text-align: center;">{{ item.realQty }}</td> <td style="text-align: center;">{{ item.realQty }}</td>
<td style="text-align: center;">{{ item.pcode }}</td> <td style="text-align: center;">{{ item.pcode }}</td>
<td style="text-align: center;">{{ item.sapNo }}</td> <td style="text-align: center;">{{ item.sapNo }}</td>
<td v-if="isRuKu" style="text-align: center;">{{ item.xmNo }}</td> <td style="text-align: center;">{{ item.xmNo }}</td>
<td v-if="isRuKu" style="text-align: center;">{{ item.xmMs }}</td> <td v-if="isRuKu" style="text-align: center;">{{ item.xmMs }}</td>
<td style="text-align: center;">{{ item.remark }}</td> <td style="text-align: center;">{{ item.remark }}</td>
<td style="text-align: center;">{{ item.entityId }}</td> <td style="text-align: center;">{{ item.entityId }}</td>
@@ -134,6 +134,17 @@ const isRuKu = computed(() => {
return props.billAllObj[0]?.bizType == 0; return props.billAllObj[0]?.bizType == 0;
}); });
// 获取不同的项目编号
const xmNo = computed(() => {
const validXmMsValues = props.billAllObj
.map(item => item.xmNo) // 提取所有 xmMs 属性值
.filter(value => !!value); // 过滤掉 null/undefined/空字符串等假值
// 3. 去重:得到所有不同的 xmMs 值
const uniqueXmMs = [...new Set(validXmMsValues)];
// 4. 核心逻辑:多个值用 + 拼接,单个值直接返回,无值返回空字符串
return uniqueXmMs.length > 1 ? uniqueXmMs.join('、') : uniqueXmMs[0] || '';
});
// 获取不同的项目描述 // 获取不同的项目描述
const xmMs = computed(() => { const xmMs = computed(() => {
const validXmMsValues = props.billAllObj const validXmMsValues = props.billAllObj
@@ -153,8 +164,8 @@ const summaryList = computed(() => {
props.billAllObj.forEach(item => { props.billAllObj.forEach(item => {
if (map.has(item.wlNo)) { if (map.has(item.wlNo)) {
const existing = map.get(item.wlNo); const existing = map.get(item.wlNo);
const total = (parseFloat(existing.totalQty) + parseFloat(item.realQty)) * 100*10000 const total = parseFloat(existing.totalQty) * 1000000+ parseFloat(item.realQty) * 1000000
existing.totalQty = total / ( 100 * 10000); existing.totalQty = total / ( 1000000);
} else { } else {
map.set(item.wlNo, { map.set(item.wlNo, {
...item, ...item,

View File

@@ -145,8 +145,8 @@ const summaryList = computed(() => {
props.billAllObj.forEach(item => { props.billAllObj.forEach(item => {
if (map.has(item.wlNo)) { if (map.has(item.wlNo)) {
const existing = map.get(item.wlNo); const existing = map.get(item.wlNo);
const total = (parseFloat(existing.totalQty) + parseFloat(item.realQty)) * 100*10000 const total = parseFloat(existing.totalQty) * 1000000+ parseFloat(item.realQty) * 1000000
existing.totalQty = total / ( 100 * 10000); existing.totalQty = total / ( 1000000);
} else { } else {
map.set(item.wlNo, { map.set(item.wlNo, {
...item, ...item,

View File

@@ -31,7 +31,7 @@
</div> </div>
</div> </div>
<div style="flex: 1;"> <div style="flex: 1;">
<div id="chartsMain" style="height: 300px;padding: 20px 0;"></div> <!-- <div id="chartsMain" style="height: 300px;padding: 20px 0;"></div> -->
</div> </div>
</div> </div>
<el-divider style="margin-top: 0;" /> <el-divider style="margin-top: 0;" />
@@ -69,14 +69,47 @@
<el-text v-show="status == 1">当前为未扫描到但数据库里有的数据</el-text> <el-text v-show="status == 1">当前为未扫描到但数据库里有的数据</el-text>
<el-text v-show="status == 2">当前为已扫描到但数据库里没有的数据</el-text> <el-text v-show="status == 2">当前为已扫描到但数据库里没有的数据</el-text>
</div> </div>
<el-table :data="matchData" border empty-text="暂无数据" v-if="status == 0 || status == 1"> <el-table :data="matchData" border empty-text="暂无数据" show-overflow-tooltip show-summary
<el-table-column prop="rkPcode" label="存放位置" /> :summary-method="getSummaries" v-if="status == 0 || status == 1">
<el-table-column prop="realQty" label="数量" /> <el-table-column label="序号" align="center" type="index" width="70" />
<el-table-column prop="count" label="操作" class-name="small-padding fixed-width"> <el-table-column label="单据号" align="center" prop="billNo" width="180" />
<el-table-column label="库存类型" align="center" prop="operationTypeName" width="150" />
<el-table-column label="订单编号" align="center" prop="sapNo" width="150" />
<el-table-column label="项目号" align="center" prop="xmNo" width="150" />
<el-table-column label="项目描述" align="center" prop="xmMs" width="150" />
<el-table-column label="物料号" align="center" prop="wlNo" width="100" />
<el-table-column label="物料描述" align="center" prop="wlMs" width="150" />
<el-table-column label="供应商名称" align="center" prop="gysMc" width="150" />
<el-table-column label="合同单价" align="center" prop="htDj" />
<el-table-column label="总计" align="center" prop="totalAmount" />
<el-table-column label="单位" align="center" prop="dw" />
<el-table-column label="实际入库数量" align="center" prop="realQty" width="120" />
<el-table-column label="库位码" align="center" prop="pcode" width="120" />
<el-table-column label="托盘码" align="center" prop="trayCode" />
<el-table-column label="身份码" align="center" prop="entityId" width="150" />
<el-table-column label="物资类型" align="center" prop="wlTypeName" />
<el-table-column label="场景" align="center" prop="sceneName" width="150" />
<el-table-column label="所属大库" align="center" prop="parentWarehouseName" width="150" />
<el-table-column label="所属小库" align="center" prop="warehouseName" width="150" />
<el-table-column label="入库类型" align="center" prop="operationTypeName" width="150" />
<el-table-column label="入库时间" align="center" prop="operationTime" width="150" />
<el-table-column label="还料时间" align="center" prop="returnTime" width="150">
<template #default="scope">
<span>{{ parseTime(scope.row.returnTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template>
</el-table-column>
<el-table-column label="库龄" align="center" prop="stockAge" />
<el-table-column label="备注" align="center" prop="remark" width="150" />
<el-table-column label="一次封样号" align="center" prop="fycde1" width="150" />
<el-table-column label="二次封样号" align="center" prop="fycde2" width="150" />
<!-- <el-table-column prop="count" label="操作" class-name="small-padding fixed-width">
<template #default="scope"> <template #default="scope">
<el-button link type="primary" icon="View" @click="handleView(scope.row)">查看</el-button> <el-button link type="primary" icon="View" @click="handleView(scope.row)">查看</el-button>
</template> </template>
</el-table-column> </el-table-column> -->
</el-table> </el-table>
<el-table :data="matchData" border empty-text="暂无数据" v-if="status == 2"> <el-table :data="matchData" border empty-text="暂无数据" v-if="status == 2">
@@ -115,7 +148,7 @@
<script setup name="AutoInventory"> <script setup name="AutoInventory">
import { ElLoading } from 'element-plus'; import { ElLoading } from 'element-plus';
import { getTaskCount, getScan, getMatch, getChart, stopScan, getScanResult, getStockList } from "@/api/Inventory/autoInventory" import { getTaskCount, getScan, getMatch, getChart, stopScan, getTotalStatistics, getStockList, inventoryList } from "@/api/Inventory/autoInventory"
import { ref, reactive, onMounted, onBeforeUnmount, markRaw } from "vue"; import { ref, reactive, onMounted, onBeforeUnmount, markRaw } from "vue";
import avatar from "@/assets/images/avatar.jpg" import avatar from "@/assets/images/avatar.jpg"
import { useRoute } from 'vue-router'; import { useRoute } from 'vue-router';
@@ -143,7 +176,8 @@ const handleView = (row) => {
const scanTotal = ref("") const scanTotal = ref("")
const getTotal = () => { const getTotal = () => {
let obj = { let obj = {
taskId: taskId.value warehouseCode: deviceObj.value.warehouseCode,
sceneId: deviceObj.value.sceneId,
} }
getTaskCount(obj).then(res => { getTaskCount(obj).then(res => {
scanTotal.value = res.data scanTotal.value = res.data
@@ -160,7 +194,7 @@ const startScan = async (formEl) => {
}) })
} }
let chartInt = ref("") // let chartInt = ref("")
const status = ref(0) // 盘点状态 const status = ref(0) // 盘点状态
const statusList = ref( const statusList = ref(
[ [
@@ -238,49 +272,49 @@ const getMatchData = () => {
matchStatus.value = 2 matchStatus.value = 2
getResultList() getResultList()
// 渲染图表 // 渲染图表
let chartObj = { // let chartObj = {
ids: arr, // ids: arr,
} // }
getChart(chartObj).then(res => { // getChart(chartObj).then(res => {
console.log(res.data) // console.log(res.data)
chartInt.value.setOption({ // chartInt.value.setOption({
title: { // title: {
text: '本次共计盘点到' + res.data.total + "个库位(库位货品数如下表)", // text: '本次共计盘点到' + res.data.total + "个库位(库位货品数如下表)",
}, // },
tooltip: { // tooltip: {
trigger: 'axis', // trigger: 'axis',
axisPointer: { // axisPointer: {
type: 'shadow' // type: 'shadow'
} // }
}, // },
grid: { // grid: {
left: '3%', // left: '3%',
right: '4%', // right: '4%',
bottom: '3%', // bottom: '3%',
containLabel: true // containLabel: true
}, // },
xAxis: { // xAxis: {
type: 'category', // type: 'category',
data: res.data.xdata, // data: res.data.xdata,
axisTick: { // axisTick: {
alignWithLabel: true // alignWithLabel: true
} // }
}, // },
yAxis: { // yAxis: {
type: 'value' // type: 'value'
}, // },
series: [ // series: [
{ // {
data: res.data.ydata, // data: res.data.ydata,
type: 'bar', // type: 'bar',
showBackground: true, // showBackground: true,
backgroundStyle: { // backgroundStyle: {
color: 'rgba(180, 180, 180, 0.2)' // color: 'rgba(180, 180, 180, 0.2)'
} // }
} // }
] // ]
}) // })
}) // })
}) })
} }
@@ -290,9 +324,15 @@ const getResultList = () => {
pageNum: queryParams.value.pageNum, pageNum: queryParams.value.pageNum,
pageSize: queryParams.value.pageSize, pageSize: queryParams.value.pageSize,
status: status.value, status: status.value,
taskId: taskId.value warehouseCode: deviceObj.value.warehouseCode,
sceneId: deviceObj.value.sceneId,
} }
getScanResult(obj).then(res => { if (status.value != 0) {
matchData.value = null
matchTotal.value = 0
return;
}
inventoryList(obj).then(res => {
matchData.value = res.rows matchData.value = res.rows
matchTotal.value = res.total matchTotal.value = res.total
}) })
@@ -390,7 +430,41 @@ if (deviceInfo) {
}); });
connectWebSocket(); // 组件加载时连接 WebSocket connectWebSocket(); // 组件加载时连接 WebSocket
} }
// 获取总计
const totalMoney = ref(null)
const pcodeCount = ref(null)
const sumQty = ref(null)
function getSummaries(param) {
const { columns, data } = param;
const sums = [];
columns.forEach((column, index) => {
if (index === 1) { // 第一列不进行合计操作,通常是序列号或选择框等非数值列。
sums[index] = '总计'; // 这里可以设置为其他文字或空字符串。
return;
} else if (index === 2) { // 第二列是金额列,进行求和操作。
sums[index] = '总金额:' + totalMoney.value;
} else if (index === 3) {
sums[index] = '共存于:' + pcodeCount.value + '个库位'
} else if (index === 4) {
sums[index] = '总数:' + sumQty.value
}
})
return sums
}
function getSumInfo() {
//统计信息
console.log(deviceObj.value,'deviceObj');
let rkInfo = JSON.parse(JSON.stringify({
warehouseCode: deviceObj.value.warehouseCode,
sceneId: deviceObj.value.sceneId,
}))
getTotalStatistics(rkInfo).then(response => {
totalMoney.value = response.data.totalAmount
pcodeCount.value = response.data.locationCount
sumQty.value = response.data.totalQuantity
});
}
getSumInfo()
// 使用 Websocket 发送消息 // 使用 Websocket 发送消息
const send = () => { const send = () => {
let obj = { let obj = {
@@ -420,7 +494,7 @@ const stopTask = () => {
const route = useRoute() const route = useRoute()
onMounted(() => { onMounted(() => {
chartInt.value = markRaw(echarts.init(document.getElementById('chartsMain'))) // chartInt.value = markRaw(echarts.init(document.getElementById('chartsMain')))
taskId.value = route.query.taskId taskId.value = route.query.taskId
getTotal() getTotal()
// chartInt.value.setOption({ // chartInt.value.setOption({

View File

@@ -408,13 +408,17 @@ function handleInventory(row) {
/** 查看结果操作 */ /** 查看结果操作 */
function handleHistory(row) { function handleHistory(row) {
router.push({ path: "/Inventory/task/inventoryResult" , query: {"taskId": row.id} }) router.push({ path: "/Inventory/task/inventoryResult" , query: {"taskId": row.id,'warehouseCode':row.warehouseCode,"sceneId":row.sceneId} })
} }
/** 导出按钮操作 */ /** 导出按钮操作 */
function handleExport(row) { function handleExport(row) {
let taskId = row.id // let taskId = row.id
proxy.download('/MatchScan/export', {taskId}, `${row.taskName}_${new Date().getTime()}.xlsx`) let obj = {
sceneId: row.sceneId,
warehouseCode: row.warehouseCode,
}
proxy.download('/MatchScan/exportInventory', obj, `${row.taskName}_${new Date().getTime()}.xlsx`)
} }
getList(); getList();

View File

@@ -18,14 +18,47 @@
<el-tabs v-model="activeTabs" type="border-card" @tab-change="handleQueryInfo"> <el-tabs v-model="activeTabs" type="border-card" @tab-change="handleQueryInfo">
<el-tab-pane v-for="item in statusList" :label="item.label" :name="item.value"> <el-tab-pane v-for="item in statusList" :label="item.label" :name="item.value">
<el-table :data="dialogData" border empty-text="暂无数据" v-if="dialogParams.status == 0 || dialogParams.status == 1"> <el-table :data="dialogData" border empty-text="暂无数据" show-overflow-tooltip show-summary
<el-table-column prop="rkPcode" label="存放位置" /> :summary-method="getSummaries" v-if="dialogParams.status == 0 || dialogParams.status == 1">
<el-table-column prop="realQty" label="数量" /> <el-table-column label="序号" align="center" type="index" width="70" />
<el-table-column prop="count" label="操作" class-name="small-padding fixed-width"> <el-table-column label="单据号" align="center" prop="billNo" width="180" />
<el-table-column label="库存类型" align="center" prop="operationTypeName" width="150" />
<el-table-column label="订单编号" align="center" prop="sapNo" width="150" />
<el-table-column label="项目号" align="center" prop="xmNo" width="150" />
<el-table-column label="项目描述" align="center" prop="xmMs" width="150" />
<el-table-column label="物料号" align="center" prop="wlNo" width="100" />
<el-table-column label="物料描述" align="center" prop="wlMs" width="150" />
<el-table-column label="供应商名称" align="center" prop="gysMc" width="150" />
<el-table-column label="合同单价" align="center" prop="htDj" />
<el-table-column label="总计" align="center" prop="totalAmount" />
<el-table-column label="单位" align="center" prop="dw" />
<el-table-column label="实际入库数量" align="center" prop="realQty" width="120" />
<el-table-column label="库位码" align="center" prop="pcode" width="120" />
<el-table-column label="托盘码" align="center" prop="trayCode" />
<el-table-column label="身份码" align="center" prop="entityId" width="150" />
<el-table-column label="物资类型" align="center" prop="wlTypeName" />
<el-table-column label="场景" align="center" prop="sceneName" width="150" />
<el-table-column label="所属大库" align="center" prop="parentWarehouseName" width="150" />
<el-table-column label="所属小库" align="center" prop="warehouseName" width="150" />
<el-table-column label="入库类型" align="center" prop="operationTypeName" width="150" />
<el-table-column label="入库时间" align="center" prop="operationTime" width="150" />
<el-table-column label="还料时间" align="center" prop="returnTime" width="150">
<template #default="scope">
<span>{{ parseTime(scope.row.returnTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template>
</el-table-column>
<el-table-column label="库龄" align="center" prop="stockAge" />
<el-table-column label="备注" align="center" prop="remark" width="150" />
<el-table-column label="一次封样号" align="center" prop="fycde1" width="150" />
<el-table-column label="二次封样号" align="center" prop="fycde2" width="150" />
<!-- <el-table-column prop="count" label="操作" class-name="small-padding fixed-width">
<template #default="scope"> <template #default="scope">
<el-button link type="primary" icon="View" @click="handleView(scope.row)">查看</el-button> <el-button link type="primary" icon="View" @click="handleView(scope.row)">查看</el-button>
</template> </template>
</el-table-column> </el-table-column> -->
</el-table> </el-table>
<el-table :data="dialogData" border empty-text="暂无数据" v-if="dialogParams.status == 2"> <el-table :data="dialogData" border empty-text="暂无数据" v-if="dialogParams.status == 2">
@@ -64,7 +97,7 @@
</template> </template>
<script setup name="InventoryResult"> <script setup name="InventoryResult">
import { getScanResult, getStockList } from "@/api/Inventory/autoInventory"; import { getStockList, getTotalStatistics, inventoryList } from "@/api/Inventory/autoInventory";
import { onMounted, ref } from "vue"; import { onMounted, ref } from "vue";
import { useRoute } from 'vue-router'; import { useRoute } from 'vue-router';
@@ -91,13 +124,19 @@ const dialogParams = ref({
status: 0, status: 0,
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
taskId: "" warehouseCode: '',
sceneId: '',
}) })
const dialogData = ref([]) const dialogData = ref([])
const dialogTotal = ref(0) const dialogTotal = ref(0)
const getHistoryInfo = () => { const getHistoryInfo = () => {
getScanResult(dialogParams.value).then(res => { if(dialogParams.value.status!=0){
dialogData.value =null
dialogTotal.value = 0
return;
}
inventoryList(dialogParams.value).then(res => {
dialogData.value = res.rows dialogData.value = res.rows
dialogTotal.value = res.total dialogTotal.value = res.total
}) })
@@ -105,7 +144,11 @@ const getHistoryInfo = () => {
/** 导出按钮操作 */ /** 导出按钮操作 */
function handleExport() { function handleExport() {
proxy.download('/MatchScan/export', {taskId: dialogParams.value.taskId}, `盘点结果_${new Date().getTime()}.xlsx`) let obj = {
warehouseCode:route.query.warehouseCode,
sceneId:route.query.sceneId,
}
proxy.download('/MatchScan/exportInventory', obj, `盘点结果_${new Date().getTime()}.xlsx`)
} }
const handleQueryInfo = (tab) => { const handleQueryInfo = (tab) => {
@@ -122,25 +165,59 @@ const chageDialogPage = (e) => {
const taskView = ref(false) const taskView = ref(false)
const viewData = ref([]) const viewData = ref([])
const handleView = (row) => { const handleView = (row) => {
// let obj = {
// pageNum: 1,
// pageSize: 100,
// pcode: row.rkPcode
// }
getStockList(row.rkPcode).then(res => { getStockList(row.rkPcode).then(res => {
console.log(res) console.log(res)
viewData.value = res.data viewData.value = res.data
taskView.value = true taskView.value = true
}) })
} }
const totalMoney = ref(null)
const pcodeCount = ref(null)
const sumQty = ref(null)
function getSummaries(param) {
const { columns, data } = param;
const sums = [];
columns.forEach((column, index) => {
if (index === 1) { // 第一列不进行合计操作,通常是序列号或选择框等非数值列。
sums[index] = '总计'; // 这里可以设置为其他文字或空字符串。
return;
} else if (index === 2) { // 第二列是金额列,进行求和操作。
sums[index] = '总金额:' + totalMoney.value;
} else if (index === 3) {
sums[index] = '共存于:' + pcodeCount.value + '个库位'
} else if (index === 4) {
sums[index] = '总数:' + sumQty.value
}
})
return sums
}
const route = useRoute() const route = useRoute()
onMounted(() => { onMounted(() => {
dialogParams.value.taskId = route.query.taskId // dialogParams.value.taskId = route.query.taskId
dialogParams.value.warehouseCode = route.query.warehouseCode
dialogParams.value.sceneId = route.query.sceneId
dialogParams.value.pageNum = 1
dialogParams.value.pageSize = 10
getHistoryInfo() getHistoryInfo()
}) })
// 获取总计
function getSumInfo() {
//统计信息
let rkInfo = JSON.parse(JSON.stringify({
warehouseCode:route.query.warehouseCode,
sceneId:route.query.sceneId,
}))
delete rkInfo.pageNum
delete rkInfo.pageSize
getTotalStatistics(rkInfo).then(response => {
totalMoney.value = response.data.totalAmount
pcodeCount.value = response.data.locationCount
sumQty.value = response.data.totalQuantity
});
}
getSumInfo()
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss"></style>
</style>

View File

@@ -50,8 +50,9 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-table v-loading="loading" ref="billTableRef" :data="billList" highlight-current-row @row-click="(row) => tableInfoRowClick(row, billTableRef)" :row-class-name="tableBillRowClassName" @row-dblclick="billClick" <el-table v-loading="loading" ref="billTableRef" :data="billList" highlight-current-row
@selection-change="billSelectionChange"> @row-click="(row) => tableInfoRowClick(row, billTableRef)" :row-class-name="tableBillRowClassName"
@row-dblclick="billClick" @selection-change="billSelectionChange">
<!-- <el-table-column type="selection" width="55" align="center" /> --> <!-- <el-table-column type="selection" width="55" align="center" /> -->
<el-table-column label="单据号" align="center" prop="billNo" width="180" /> <el-table-column label="单据号" align="center" prop="billNo" width="180" />
<el-table-column label="库存状态" align="center"> <el-table-column label="库存状态" align="center">
@@ -64,7 +65,7 @@
<dict-tag :options="dictTagData()" :value="scope.row.bizType" /> <dict-tag :options="dictTagData()" :value="scope.row.bizType" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="理货员" align="center" prop="operatorName" width="100" />
<el-table-column label="入库类型" align="center" prop="operationTypeName" width="120" /> <el-table-column label="入库类型" align="center" prop="operationTypeName" width="120" />
<el-table-column label="物资类型" align="center" prop="wlTypeName" width="100" /> <el-table-column label="物资类型" align="center" prop="wlTypeName" width="100" />
<el-table-column label="入库时间" align="center" prop="operationTime" width="170"> <el-table-column label="入库时间" align="center" prop="operationTime" width="170">
@@ -74,6 +75,7 @@
}}</span> }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="理货员" align="center" prop="operatorName" width="100" />
<el-table-column label="操作" align="center" fixed="right" width="260"> <el-table-column label="操作" align="center" fixed="right" width="260">
<template #default="scope"> <template #default="scope">
<el-button link type="primary" @click="picDetailFun(scope.row.billNo, 0, 1)">入库图片</el-button> <el-button link type="primary" @click="picDetailFun(scope.row.billNo, 0, 1)">入库图片</el-button>
@@ -128,7 +130,8 @@
<el-button type="primary" plain icon="Delete" @click="handleOneClickStockDel">一键删除</el-button> <el-button type="primary" plain icon="Delete" @click="handleOneClickStockDel">一键删除</el-button>
</el-col> </el-col>
</el-row> </el-row>
<el-table v-loading="detailLoading" ref="infoTableRef" highlight-current-row @row-click="(row) => tableInfoRowClick(row, infoTableRef)" show-overflow-tooltip border :data="stockList" <el-table v-loading="detailLoading" ref="infoTableRef" highlight-current-row
@row-click="(row) => tableInfoRowClick(row, infoTableRef)" show-overflow-tooltip border :data="stockList"
@selection-change="printSelectionChange"> @selection-change="printSelectionChange">
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" align="center" type="index" width="70" /> <el-table-column label="序号" align="center" type="index" width="70" />
@@ -310,21 +313,27 @@
<div class="addBox"> <div class="addBox">
<div style="display: flex;align-items: center;"> <div style="display: flex;align-items: center;">
<div class="addData" @click="addData"> <div class="addData" @click="addData">
<el-icon style="margin-right: 10px;" size="20"><FolderAdd /></el-icon> <el-icon style="margin-right: 10px;" size="20">
<FolderAdd />
</el-icon>
添加至入库 添加至入库
</div> </div>
<div @click="viewData" style="color: #000;text-decoration: underline;margin-left: 5px;">[已添加{{ outTempData.length }}条库存]</div> <div @click="viewData" style="color: #000;text-decoration: underline;margin-left: 5px;">[已添加{{
outTempData.length }}条库存]</div>
<!-- <div @click="viewData" style="color: red;text-decoration: underline;font-weight: bold;">[凭证重复入库或项目已关闭,请点击查看!]</div> --> <!-- <div @click="viewData" style="color: red;text-decoration: underline;font-weight: bold;">[凭证重复入库或项目已关闭,请点击查看!]</div> -->
</div> </div>
<div v-show="outTempData.length > 0 && planList.length === outTempData.length" @click="deleteData" style="display: flex;align-items: center;color: var(--el-color-primary);"> <div v-show="outTempData.length > 0 && planList.length === outTempData.length" @click="deleteData"
<el-icon><delete /></el-icon> style="display: flex;align-items: center;color: var(--el-color-primary);">
<el-icon>
<delete />
</el-icon>
<span>删除</span> <span>删除</span>
</div> </div>
</div> </div>
<el-table :data="planList" height="400" style="width: 100%" show-overflow-tooltip <el-table :data="planList" height="400" style="width: 100%" show-overflow-tooltip border
:row-class-name="tableRowClassName" @selection-change="handleSelectionChange"> :row-class-name="tableRowClassName" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="30" align="center" /> <el-table-column type="selection" width="30" align="center" />
<el-table-column label="序号" align="center" type="index" width="50" /> <el-table-column label="序号" align="center" type="index" width="70" />
<el-table-column label="状态" align="center" prop="status" width="100" v-if="idEdit == 0"> <el-table-column label="状态" align="center" prop="status" width="100" v-if="idEdit == 0">
<template #default="scoped"> <template #default="scoped">
<el-tag :type="scoped.row.status == 1 <el-tag :type="scoped.row.status == 1
@@ -896,7 +905,7 @@ const statusList = ref([
]); ]);
const checkPlanList = ref([]); //已选中的要入库的数据 const checkPlanList = ref([]); //已选中的要入库的数据
// 点击添加至 // 点击添加至
const outTempData = ref([]); const outTempData = ref([]);
function addData() { function addData() {
if (checkPlanList.value.length == 0) { if (checkPlanList.value.length == 0) {
@@ -904,27 +913,74 @@ function addData() {
return; return;
} }
let data = outTempData.value.concat(checkPlanList.value); let data = outTempData.value.concat(checkPlanList.value);
let arr = [] // let arr = []; // 去重后的最终数组
let spaNoTotal = '' // let duplicateSapNos = ''; // 存储重复数据的sapNo
const idList = []; // 用于统计每个id出现的次数 // let invalidQtySapNos = ''; // 存储入库数量有误的sapNo
// 第一步遍历数组统计id出现次数 // const uniqueKeys = new Set(); // 用于存储唯一的组合键 (id+pcode+realQty)
data.forEach(item => {
if (idList.includes(item.id)) { // // 遍历数组,先校验数量合法性,再判断唯一性
spaNoTotal += item.sapNo + ',' // data.forEach(item => {
} else { // // 1. 校验realQty是否大于0处理空值/非数字情况)
arr.push(item) // const realQty = Number(item.realQty);
idList.push(item.id); // if (isNaN(realQty) || realQty <= 0) {
// // 避免同一个sapNo重复添加到提示中
// if (!invalidQtySapNos.includes(item.sapNo)) {
// invalidQtySapNos += item.sapNo + ',';
// }
// return; // 数量不合法,直接跳过后续唯一性判断
// }
// // 2. 生成唯一标识组合键
// const uniqueKey = `${item.id}_${item.pcode}_${realQty}`;
// // 3. 检查组合键是否已存在
// if (uniqueKeys.has(uniqueKey)) {
// // 存在重复拼接sapNo去重避免重复拼接
// if (!duplicateSapNos.includes(item.sapNo)) {
// duplicateSapNos += item.sapNo + ',';
// }
// } else {
// // 不存在重复,加入结果数组并记录组合键
// arr.push(item);
// uniqueKeys.add(uniqueKey);
// }
// console.log(uniqueKeys)
// });
// // 处理入库数量有误的提示
// if (invalidQtySapNos) {
// invalidQtySapNos = invalidQtySapNos.slice(0, -1); // 去掉最后一个逗号
// proxy.$modal.msgError(`入库数量有误:${invalidQtySapNos}入库数量需大于0`);
// return
// }
// // 处理重复数据的提示
// if (duplicateSapNos) {
// duplicateSapNos = duplicateSapNos.slice(0, -1); // 去掉最后一个逗号
// proxy.$modal.msgError(`存在重复数据:${duplicateSapNos}`);
// }
outTempData.value = data
} }
});
if (spaNoTotal) { const generateSimpleUniqueStr = () => {
proxy.$modal.msgError("存在重复数据:" + spaNoTotal); if (typeof crypto !== 'undefined' && crypto.randomUUID) {
return crypto.randomUUID();
} }
outTempData.value = arr
// 兼容旧版浏览器/Node.jscrypto API 降级)
return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c =>
(c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)
);
} }
// 查看所有的出库数据 // 查看所有的出库数据
const viewData = () => { const viewData = () => {
planList.value = JSON.parse(JSON.stringify(outTempData.value)); let arr = JSON.parse(JSON.stringify(outTempData.value));
planList.value = arr.map(item => ({
...item,
uniqueId: generateSimpleUniqueStr() // 新增随机唯一值
}));
} }
// 删除选中的出库数据 // 删除选中的出库数据
@@ -934,11 +990,11 @@ const deleteData = () => {
return; return;
} }
proxy.$modal.confirm("确认删除选中的出库数据吗").then(() => { proxy.$modal.confirm("确认删除选中的出库数据吗").then(() => {
const ids = checkPlanList.value.map(item => item.id); const uniqueIds = checkPlanList.value.map(item => item.uniqueId);
console.log(ids) console.log(uniqueIds)
planList.value = planList.value.filter(item => { planList.value = planList.value.filter(item => {
// 无id的元素默认保留如果想删除无id的可改为 item?.id && !arr2Ids.has(item.id) // 无id的元素默认保留如果想删除无id的可改为 item?.id && !arr2Ids.has(item.id)
return !ids.includes(item?.id); return !uniqueIds.includes(item?.uniqueId);
}); });
outTempData.value = planList.value outTempData.value = planList.value
}); });
@@ -946,7 +1002,7 @@ const deleteData = () => {
//新增入库 多选框选中数据 //新增入库 多选框选中数据
function handleSelectionChange(selection) { function handleSelectionChange(selection, $event) {
checkPlanList.value = selection; checkPlanList.value = selection;
} }
@@ -963,6 +1019,7 @@ function searchPlan() {
for (let i = 0; i < planData.length; i++) { for (let i = 0; i < planData.length; i++) {
planData[i].realQty = planData[i].waitQty; planData[i].realQty = planData[i].waitQty;
planData[i].gysJhId = planData[i].id; planData[i].gysJhId = planData[i].id;
planData[i].pcode = "";
if (autoFill.value && kzms.value != "") { if (autoFill.value && kzms.value != "") {
planData[i].remark = kzms.value; planData[i].remark = kzms.value;
} }
@@ -975,7 +1032,7 @@ function searchPlan() {
proxy.$modal.msgWarning("暂无数据"); proxy.$modal.msgWarning("暂无数据");
return; return;
} }
planList.value = planData; planList.value = planList.value.concat(planData);
}); });
} }
@@ -1383,6 +1440,7 @@ function handleUpdate(row) {
]; ];
pcodeList(storeData.value.warehouseCode); pcodeList(storeData.value.warehouseCode);
open.value = true; open.value = true;
outTempData.value = []
title.value = "修改库存单据"; title.value = "修改库存单据";
} }
// 取消按钮 // 取消按钮
@@ -1530,6 +1588,11 @@ function handleDispatch() {
proxy.$modal.msgError("请勾选数据"); proxy.$modal.msgError("请勾选数据");
return; return;
} }
let isDiaodu = checkStockList.value.some((item) => item.execStatus == 0);
if (isDiaodu) {
proxy.$modal.msgWarning("预入库数据不能生成调度任务");
return;
}
dispatchOpen.value = true; dispatchOpen.value = true;
} }
// 提交调度任务 // 提交调度任务
@@ -1540,7 +1603,7 @@ function submitDispatch() {
return; return;
} }
let data; let data;
if (billStatus.value == "rk") {
data = checkStockList.value.map((item) => ({ data = checkStockList.value.map((item) => ({
sourceName: "V01-010101", sourceName: "V01-010101",
targetName: item.pcode, targetName: item.pcode,
@@ -1550,17 +1613,28 @@ function submitDispatch() {
num: 1, num: 1,
dispatchMode: resource.value, dispatchMode: resource.value,
})); }));
} else if (billStatus.value == "ck") {
data = checkStockList.value.map((item) => ({ // if (billStatus.value == "rk") {
sourceName: item.pcode, // data = checkStockList.value.map((item) => ({
targetName: "V01-010101", // sourceName: "V01-010101",
taskTypeName: "下架", // targetName: item.pcode,
taskType: 1, // taskTypeName: "上架",
mid: item.wlNo, // taskType: 0,
num: 1, // mid: item.wlNo,
dispatchMode: resource.value, // num: 1,
})); // dispatchMode: resource.value,
} // }));
// } else if (billStatus.value == "ck") {
// data = checkStockList.value.map((item) => ({
// sourceName: item.pcode,
// targetName: "V01-010101",
// taskTypeName: "下架",
// taskType: 1,
// mid: item.wlNo,
// num: 1,
// dispatchMode: resource.value,
// }));
// }
//调用生成调度任务接口 //调用生成调度任务接口
generateDispatch(data).then((response) => { generateDispatch(data).then((response) => {
// console.log(11111) // console.log(11111)
@@ -1793,7 +1867,6 @@ function isAudit() {
isAudit(); isAudit();
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.printMeBox { .printMeBox {
div { div {
line-height: 30px; line-height: 30px;
@@ -1867,6 +1940,7 @@ isAudit();
justify-content: space-between; justify-content: space-between;
margin-bottom: 10px; margin-bottom: 10px;
cursor: pointer; cursor: pointer;
.addData { .addData {
display: flex; display: flex;
align-items: center; align-items: center;

View File

@@ -2,101 +2,51 @@
<div class="app-container"> <div class="app-container">
<el-splitter> <el-splitter>
<el-splitter-panel size="40%"> <el-splitter-panel size="40%">
<el-form <el-form :model="queryParams" ref="queryRef" v-show="showSearch" label-width="80">
:model="queryParams"
ref="queryRef"
v-show="showSearch"
label-width="80"
>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="出库时间" prop="ckTime"> <el-form-item label="出库时间" prop="ckTime">
<el-date-picker <el-date-picker v-model="ckTime" type="datetimerange" start-placeholder="开始时间" end-placeholder="结束时间"
v-model="ckTime" format="YYYY/MM/DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" />
type="datetimerange"
start-placeholder="开始时间"
end-placeholder="结束时间"
format="YYYY/MM/DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="10"> <el-col :span="10">
<el-form-item label="单据号" prop="billNo"> <el-form-item label="单据号" prop="billNo">
<el-input <el-input v-model="queryParams.billNo" placeholder="请输入单据号" clearable @keyup.enter="handleQuery" />
v-model="queryParams.billNo"
placeholder="请输入单据号"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="出库类型" prop="operationType"> <el-form-item label="出库类型" prop="operationType">
<el-select <el-select v-model="queryParams.operationType" placeholder="请选择出库类型" clearable>
v-model="queryParams.operationType" <el-option v-for="dict in storeTypeList" :key="dict.id" :label="dict.typeName"
placeholder="请选择出库类型" :value="dict.typeCode" />
clearable
>
<el-option
v-for="dict in storeTypeList"
:key="dict.id"
:label="dict.typeName"
:value="dict.typeCode"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item> <el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery" <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
>搜索</el-button
>
<el-button icon="Refresh" @click="resetQuery">重置</el-button> <el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-button type="primary" plain icon="Plus" @click="handleAdd"
type="primary" v-hasPermi="['wisdom:bill:add']">新增出库</el-button>
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['wisdom:bill:add']"
>新增出库</el-button
>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-button type="warning" plain icon="Download" @click="handleExport"
type="warning" v-hasPermi="['wisdom:bill:export']">导出</el-button>
plain
icon="Download"
@click="handleExport"
v-hasPermi="['wisdom:bill:export']"
>导出</el-button
>
</el-col> </el-col>
</el-row> </el-row>
</el-form> </el-form>
<el-table <el-table v-loading="loading" :data="billList" :row-class-name="tableBillRowClassName" @row-dblclick="billClick"
v-loading="loading" ref="billTableRef" highlight-current-row @row-click="(row) => tableInfoRowClick(row, billTableRef)">
:data="billList" <el-table-column label="单据号" align="center" prop="billNo" width="180" />
:row-class-name="tableBillRowClassName"
@row-dblclick="billClick"
ref="billTableRef"
highlight-current-row
@row-click="(row) => tableInfoRowClick(row, billTableRef)"
>
<el-table-column
label="单据号"
align="center"
prop="billNo"
width="180"
/>
<el-table-column label="库存状态" align="center"> <el-table-column label="库存状态" align="center">
<template #default="scope"> <template #default="scope">
<span>{{ getExecStatusName(scope.row.execStatus) }}</span> <span>{{ getExecStatusName(scope.row.execStatus) }}</span>
@@ -109,21 +59,15 @@
</el-table-column> </el-table-column>
<el-table-column label="是否派送" align="center" prop="isDelivery"> <el-table-column label="是否派送" align="center" prop="isDelivery">
<template #default="scope"> <template #default="scope">
<span v-if="scope.row.isDelivery == '0' || !scope.row.isDelivery" <span v-if="scope.row.isDelivery == '0' || !scope.row.isDelivery">否</span>
>否</span
>
<span v-else-if="scope.row.isDelivery === '1'">是</span> <span v-else-if="scope.row.isDelivery === '1'">是</span>
<span v-else-if="scope.row.isDelivery === '2'">待配送</span> <span v-else-if="scope.row.isDelivery === '2'">待配送</span>
<span v-else-if="scope.row.isDelivery === '3'">配送中</span> <span v-else-if="scope.row.isDelivery === '3'">配送中</span>
<span v-else-if="scope.row.isDelivery === '4'">配送完成</span> <span v-else-if="scope.row.isDelivery === '4'">配送完成</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column label="出库类型" align="center" prop="operationTypeName" width="160" />
label="出库类型" <el-table-column label="施工队" align="center" prop="teamName" width="200" />
align="center"
prop="operationTypeName"
width="160"
/>
<el-table-column label="出库时间" align="center" width="180"> <el-table-column label="出库时间" align="center" width="180">
<template #default="scope"> <template #default="scope">
<span>{{ <span>{{
@@ -132,253 +76,86 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="理货员" align="center" prop="operatorName" /> <el-table-column label="理货员" align="center" prop="operatorName" />
<el-table-column
label="施工队" <el-table-column label="操作" align="center" width="220" fixed="right">
align="center"
prop="teamName"
width="200"
/>
<el-table-column
label="操作"
align="center"
width="220"
fixed="right"
>
<template #default="scope"> <template #default="scope">
<el-button <el-button link type="primary" @click="picDetailFun(scope.row.billNo)">图片</el-button>
link <el-button link type="primary" @click="billClick(scope.row, 'bill')">出库单</el-button>
type="primary" <el-button link type="primary" @click="editData(scope.row)">修改</el-button>
@click="picDetailFun(scope.row.billNo)"
>图片</el-button
>
<el-button
link
type="primary"
@click="billClick(scope.row, 'bill')"
>出库单</el-button
>
<el-button link type="primary" @click="editData(scope.row)"
>修改</el-button
>
<el-button link type="primary" @click="delData(scope.row)">删除</el-button> <el-button link type="primary" @click="delData(scope.row)">删除</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
v-show="total > 0" v-model:limit="queryParams.pageSize" @pagination="getList" />
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</el-splitter-panel> </el-splitter-panel>
<el-splitter-panel :min="200"> <el-splitter-panel :min="200">
<el-row :gutter="10" v-show="outboundList.length > 0" class="mb8"> <el-row :gutter="10" v-show="outboundList.length > 0" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-button type="success" plain icon="Printer" @click="handlePrint" v-print="printViewInfo"
type="success" v-hasPermi="['wisdom:bill:print']">打印单据</el-button>
plain
icon="Printer"
@click="handlePrint"
v-print="printViewInfo"
v-hasPermi="['wisdom:bill:print']"
>打印单据</el-button
>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleDispatch" <el-button type="primary" plain icon="Plus" @click="handleDispatch">生成调度任务</el-button>
>生成调度任务</el-button
>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-button type="primary" plain icon="Plus" @click="handleOneClickWarehousing">一键出库</el-button>
type="primary"
plain
icon="Plus"
@click="handleOneClickWarehousing"
>一键出库</el-button
>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-button type="primary" plain icon="Plus" @click="handleOneClickStockDelete">一键撤销</el-button>
type="primary"
plain
icon="Plus"
@click="handleOneClickStockDelete"
>一键撤销</el-button
>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-button type="primary" plain icon="Delete" @click="handleOneClickStockDel">一键删除</el-button>
type="primary"
plain
icon="Delete"
@click="handleOneClickStockDel"
>一键删除</el-button
>
</el-col> </el-col>
</el-row> </el-row>
<el-table <el-table v-loading="detailLoading" show-overflow-tooltip border :data="outboundList"
v-loading="detailLoading" @selection-change="selectionChange" ref="infoTableRef" highlight-current-row
show-overflow-tooltip @row-click="(row) => tableInfoRowClick(row, infoTableRef)">
border
:data="outboundList"
@selection-change="selectionChange"
ref="infoTableRef"
highlight-current-row
@row-click="(row) => tableInfoRowClick(row, infoTableRef)"
>
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column <el-table-column label="序号" align="center" type="index" width="70" />
label="序号"
align="center"
type="index"
width="70"
/>
<el-table-column label="库存状态" align="center"> <el-table-column label="库存状态" align="center">
<template #default="scope"> <template #default="scope">
<span>{{ getExecStatusName(scope.row.execStatus) }}</span> <span>{{ getExecStatusName(scope.row.execStatus) }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column label="订单编号" align="center" prop="sapNo" width="150" />
label="订单编" <el-table-column label="项目" align="center" prop="xmNo" width="150" />
align="center" <el-table-column label="项目描述" align="center" prop="xmMs" width="250" />
prop="sapNo" <el-table-column label="物料号" align="center" prop="wlNo" width="100" />
width="150" <el-table-column label="物料描述" align="center" prop="wlMs" width="250" />
/> <el-table-column label="供应商名称" align="center" prop="gysMc" width="200" />
<el-table-column <el-table-column label="合同单价" align="center" prop="htDj" width="120" />
label="项目号"
align="center"
prop="xmNo"
width="150"
/>
<el-table-column
label="项目描述"
align="center"
prop="xmMs"
width="250"
/>
<el-table-column
label="物料号"
align="center"
prop="wlNo"
width="100"
/>
<el-table-column
label="物料描述"
align="center"
prop="wlMs"
width="250"
/>
<el-table-column
label="供应商名称"
align="center"
prop="gysMc"
width="200"
/>
<el-table-column
label="合同单价"
align="center"
prop="htDj"
width="120"
/>
<el-table-column label="总计" align="center" prop="totalAmount" /> <el-table-column label="总计" align="center" prop="totalAmount" />
<el-table-column label="计量单位" align="center" prop="dw" /> <el-table-column label="计量单位" align="center" prop="dw" />
<el-table-column <el-table-column label="实际出库数量" align="center" prop="realQty" width="120" />
label="实际出库数量" <el-table-column label="所属仓库" align="center" prop="cangkuName" width="150">
align="center"
prop="realQty"
width="120"
/>
<el-table-column
label="所属仓库"
align="center"
prop="cangkuName"
width="150"
>
<template #default="scope"> <template #default="scope">
<span>{{ <span>{{
scope.row.parentWarehouseName + "/" + scope.row.warehouseName scope.row.parentWarehouseName + "/" + scope.row.warehouseName
}}</span> }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column label="备注" align="center" prop="remark" width="200" />
label="备注" <el-table-column label="库位码" align="center" prop="pcode" width="120" />
align="center"
prop="remark"
width="200"
/>
<el-table-column
label="库位码"
align="center"
prop="pcode"
width="120"
/>
<el-table-column label="托盘码" align="center" prop="trayCode" /> <el-table-column label="托盘码" align="center" prop="trayCode" />
<el-table-column <el-table-column label="身份码" align="center" prop="entityId" width="200" />
label="身份码"
align="center"
prop="entityId"
width="200"
/>
<el-table-column label="物资类型" align="center" prop="wlTypeName" /> <el-table-column label="物资类型" align="center" prop="wlTypeName" />
<el-table-column <el-table-column label="现场图片" align="center" v-if="isExamine == 1">
label="现场图片"
align="center"
v-if="isExamine == 1"
>
<template #default="scope"> <template #default="scope">
<el-image <el-image :src="scope.row.scenePhotoUrl" style="width: 50px; height: 50px" :zoom-rate="1.2" :max-scale="7"
:src="scope.row.scenePhotoUrl" :min-scale="0.2" :preview-src-list="srcList" show-progress :initial-index="4" :preview-teleported="true"
style="width: 50px; height: 50px" @click="preview(scope.row.scenePhotoUrl)" />
:zoom-rate="1.2"
:max-scale="7"
:min-scale="0.2"
:preview-src-list="srcList"
show-progress
:initial-index="4"
:preview-teleported="true"
@click="preview(scope.row.scenePhotoUrl)"
/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column label="一次封样号" align="center" prop="fycde1" width="150" />
label="次封样号" <el-table-column label="次封样号" align="center" prop="fycde2" width="150" />
align="center" <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="150">
prop="fycde1"
width="150"
/>
<el-table-column
label="二次封样号"
align="center"
prop="fycde2"
width="150"
/>
<el-table-column
label="操作"
align="center"
class-name="small-padding fixed-width"
width="150"
>
<template #default="scope"> <template #default="scope">
<el-button <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
link v-hasPermi="['wisdom:bill:edit']" v-show="scope.row.execStatus == 0">修改</el-button>
type="primary" <el-button link type="primary" icon="Delete" @click="handleStockDelete(scope.row)"
icon="Edit" v-show="scope.row.execStatus == 1" v-hasPermi="['wisdom:bill:delete']">撤销</el-button>
@click="handleUpdate(scope.row)"
v-hasPermi="['wisdom:bill:edit']"
>修改</el-button
>
<el-button
link
type="primary"
icon="Delete"
@click="handleStockDelete(scope.row)"
v-show="scope.row.execStatus == 1"
v-hasPermi="['wisdom:bill:delete']"
>撤销</el-button
>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@@ -386,50 +163,27 @@
</el-splitter> </el-splitter>
<!-- 添加或修改库存单据主对话框 --> <!-- 添加或修改库存单据主对话框 -->
<el-dialog <el-dialog :title="title" v-model="open" width="75%" :close-on-click-modal="false" :z-index="4" :draggable="true">
:title="title"
v-model="open"
width="75%"
:close-on-click-modal="false"
:z-index="4"
:draggable="true"
>
<el-form ref="stockRef" :model="storeData" :rules="rules"> <el-form ref="stockRef" :model="storeData" :rules="rules">
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="6"> <el-col :span="6">
<el-form-item label="项目号"> <el-form-item label="项目号">
<el-input <el-input v-model="outQueryParams.xmNo" placeholder="请输入项目号" clearable />
v-model="outQueryParams.xmNo"
placeholder="请输入项目号"
clearable
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="订单号"> <el-form-item label="订单号">
<el-input <el-input v-model="outQueryParams.sapNo" placeholder="请输入订单号" clearable />
v-model="outQueryParams.sapNo"
placeholder="请输入订单号"
clearable
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="物料号"> <el-form-item label="物料号">
<el-input <el-input v-model="outQueryParams.wlNo" placeholder="请输入物料号" clearable />
v-model="outQueryParams.wlNo"
placeholder="请输入物料号"
clearable
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="物料描述"> <el-form-item label="物料描述">
<el-input <el-input v-model="outQueryParams.wlMs" placeholder="请输入物料描述" clearable />
v-model="outQueryParams.wlMs"
placeholder="请输入物料描述"
clearable
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@@ -446,33 +200,18 @@
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="物资类型"> <el-form-item label="物资类型">
<el-select <el-select v-model="outQueryParams.wlType" placeholder="请选择物资类型" clearable>
v-model="outQueryParams.wlType" <el-option v-for="dict in wzlxList" :key="dict.id" :label="dict.typeName" :value="dict.typeCode" />
placeholder="请选择物资类型"
clearable
>
<el-option
v-for="dict in wzlxList"
:key="dict.id"
:label="dict.typeName"
:value="dict.typeCode"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="所属仓库"> <el-form-item label="所属仓库">
<el-cascader <el-cascader style="width: 100%" :options="warehouseList" v-model="outQueryParams.cangku" :props="{
style="width: 100%"
:options="warehouseList"
v-model="outQueryParams.cangku"
:props="{
children: 'children', children: 'children',
label: 'warehouseName', label: 'warehouseName',
value: 'warehouseCode', value: 'warehouseCode',
}" }" clearable />
clearable
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@@ -495,60 +234,28 @@
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="6"> <el-col :span="6">
<el-form-item label="出库类型" prop="operationType"> <el-form-item label="出库类型" prop="operationType">
<el-select <el-select v-model="storeData.operationType" placeholder="请选择出库类型" clearable>
v-model="storeData.operationType" <el-option v-for="dict in storeTypeList" :key="dict.id" :label="dict.typeName" :value="dict.typeCode" />
placeholder="请选择出库类型"
clearable
>
<el-option
v-for="dict in storeTypeList"
:key="dict.id"
:label="dict.typeName"
:value="dict.typeCode"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="施工队" prop="teamCode"> <el-form-item label="施工队" prop="teamCode">
<el-select <el-select v-model="storeData.teamCode" placeholder="请选择施工队" clearable filterable>
v-model="storeData.teamCode" <el-option v-for="dict in wzTypeList" :key="dict.id" :label="dict.teamName" :value="dict.teamCode" />
placeholder="请选择施工队"
clearable
filterable
>
<el-option
v-for="dict in wzTypeList"
:key="dict.id"
:label="dict.teamName"
:value="dict.teamCode"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="理货员" prop="operator"> <el-form-item label="理货员" prop="operator">
<el-select <el-select v-model="storeData.operator" placeholder="请选择理货员" clearable>
v-model="storeData.operator" <el-option v-for="dict in personList" :key="dict.userId" :label="dict.userName" :value="dict.userId" />
placeholder="请选择理货员"
clearable
>
<el-option
v-for="dict in personList"
:key="dict.userId"
:label="dict.userName"
:value="dict.userId"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="是否配送" prop="isDelivery"> <el-form-item label="是否配送" prop="isDelivery">
<el-select <el-select v-model="storeData.isDelivery" placeholder="请选择是否配送" clearable>
v-model="storeData.isDelivery"
placeholder="请选择是否配送"
clearable
>
<el-option :key="1" label="" value="1" /> <el-option :key="1" label="" value="1" />
<el-option :key="0" label="" value="0" /> <el-option :key="0" label="" value="0" />
</el-select> </el-select>
@@ -556,17 +263,8 @@
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="库存状态" prop="execStatus"> <el-form-item label="库存状态" prop="execStatus">
<el-select <el-select v-model="storeData.execStatus" placeholder="请选择" clearable>
v-model="storeData.execStatus" <el-option v-for="dict in execStatusList" :key="dict.value" :label="dict.label" :value="dict.value" />
placeholder="请选择"
clearable
>
<el-option
v-for="dict in execStatusList"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
@@ -574,14 +272,21 @@
<div class="addOutBoundBox"> <div class="addOutBoundBox">
<div style="display: flex;align-items: center;"> <div style="display: flex;align-items: center;">
<div class="addOutBound" @click="addOutBoundData"> <div class="addOutBound" @click="addOutBoundData">
<el-icon style="margin-right: 10px;" size="20"><FolderAdd /></el-icon> <el-icon style="margin-right: 10px;" size="20">
<FolderAdd />
</el-icon>
添加至出库 添加至出库
</div> </div>
<div @click="viewOutBoundData" style="color: #000;text-decoration: underline;margin-left: 5px;">[已添加{{ outBoundData.length }}条库存]</div> <div @click="viewOutBoundData" style="color: #000;text-decoration: underline;margin-left: 5px;">[已添加{{
<div @click="viewOutBoundData" style="color: red;text-decoration: underline;font-weight: bold;">[凭证重复出库或项目已关闭,请点击查看!]</div> outBoundData.length }}条库存]</div>
<div @click="viewOutBoundData" style="color: red;text-decoration: underline;font-weight: bold;">
[凭证重复出库或项目已关闭,请点击查看!]</div>
</div> </div>
<div v-show="outBoundData.length > 0 && planList.length === outBoundData.length" @click="deleteOutBoundData" style="display: flex;align-items: center;color: var(--el-color-primary);"> <div v-show="outBoundData.length > 0 && planList.length === outBoundData.length" @click="deleteOutBoundData"
<el-icon><delete /></el-icon> style="display: flex;align-items: center;color: var(--el-color-primary);">
<el-icon>
<delete />
</el-icon>
<span>删除</span> <span>删除</span>
</div> </div>
</div> </div>
@@ -598,135 +303,44 @@
</el-col> </el-col>
</el-row> --> </el-row> -->
</el-form> </el-form>
<el-table <el-table :data="planList" ref="addTableRef" height="400" border show-overflow-tooltip style="width: 100%"
:data="planList" @selection-change="handleSelectionChange">
ref="addTableRef"
height="400"
border
show-overflow-tooltip
style="width: 100%"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" type="index" align="center" width="70" /> <el-table-column label="序号" type="index" align="center" width="70" />
<el-table-column <el-table-column label="物料号" align="center" prop="wlNo" width="100" />
label="物料" <el-table-column label="订单" align="center" prop="sapNo" width="100" />
align="center" <el-table-column label="物料描述" align="center" prop="wlMs" width="200" />
prop="wlNo" <el-table-column label="出库数量" align="center" prop="realQty" width="100">
width="100"
/>
<el-table-column
label="订单号"
align="center"
prop="sapNo"
width="100"
/>
<el-table-column
label="物料描述"
align="center"
prop="wlMs"
width="200"
/>
<el-table-column
label="出库数量"
align="center"
prop="realQty"
width="100"
>
<template #default="scope"> <template #default="scope">
<el-input <el-input v-model="scope.row.realQty" placeholder="请输入出库数量" />
v-model="scope.row.realQty"
placeholder="请输入出库数量"
/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="单价" align="center" prop="htDj" /> <el-table-column label="单价" align="center" prop="htDj" />
<el-table-column label="单位" align="center" prop="dw" /> <el-table-column label="单位" align="center" prop="dw" />
<el-table-column <el-table-column label="库位" align="center" prop="pcode" width="150"></el-table-column>
label="库位" <el-table-column label="项目定义号" align="center" prop="xmNo" width="150" />
align="center" <el-table-column label="项目名称" align="center" prop="xmMs" width="250" />
prop="pcode" <el-table-column label="供应商" align="center" prop="gysMc" width="200" />
width="150" <el-table-column label="容器码" align="center" prop="trayCode"></el-table-column>
></el-table-column> <el-table-column label="身份码" align="center" prop="entityId" width="200"></el-table-column>
<el-table-column
label="项目定义号"
align="center"
prop="xmNo"
width="150"
/>
<el-table-column
label="项目名称"
align="center"
prop="xmMs"
width="250"
/>
<el-table-column
label="供应商"
align="center"
prop="gysMc"
width="200"
/>
<el-table-column
label="容器码"
align="center"
prop="trayCode"
></el-table-column>
<el-table-column
label="身份码"
align="center"
prop="entityId"
width="200"
></el-table-column>
<el-table-column label="备注" align="center" width="200"> <el-table-column label="备注" align="center" width="200">
<template #default="scope"> <template #default="scope">
<el-input <el-input v-model="scope.row.remark" placeholder="请输入备注"></el-input>
v-model="scope.row.remark"
placeholder="请输入备注"
></el-input>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column label="一次封样号" align="center" prop="fycde1" width="150" />
label="次封样号" <el-table-column label="次封样号" align="center" prop="fycde2" width="150" />
align="center" <el-table-column label="上传" align="center" width="150" v-if="isExamine == 1">
prop="fycde1"
width="150"
/>
<el-table-column
label="二次封样号"
align="center"
prop="fycde2"
width="150"
/>
<el-table-column
label="上传"
align="center"
width="150"
v-if="isExamine == 1"
>
<template #default="scope"> <template #default="scope">
<el-upload <el-upload class="upload-demo" :action="actionUrl" :multiple="false" :headers="headers"
class="upload-demo" :on-preview="handlePreview" :on-remove="function (response) {
:action="actionUrl"
:multiple="false"
:headers="headers"
:on-preview="handlePreview"
:on-remove="
function (response) {
return handleRemove(response, scope.row.id); return handleRemove(response, scope.row.id);
} }
" " :on-success="function (response) {
:on-success="
function (response) {
return handleAvatarSuccess(response, scope.row.id); return handleAvatarSuccess(response, scope.row.id);
} }
" ">
> <el-button type="primary" size="small" v-show="!scope.row.photoUrl">选择图片</el-button>
<el-button
type="primary"
size="small"
v-show="!scope.row.photoUrl"
>选择图片</el-button
>
</el-upload> </el-upload>
</template> </template>
</el-table-column> </el-table-column>
@@ -739,18 +353,8 @@
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="8"> <el-col :span="8">
<el-form-item label="审批人"> <el-form-item label="审批人">
<el-select <el-select v-model="storeData.approverId" clearable filterable placeholder="请选择审批人">
v-model="storeData.approverId" <el-option v-for="dict in personList" :key="dict.userId" :label="dict.userName" :value="dict.userId" />
clearable
filterable
placeholder="请选择审批人"
>
<el-option
v-for="dict in personList"
:key="dict.userId"
:label="dict.userName"
:value="dict.userId"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
@@ -766,52 +370,20 @@
<!-- 修改主单据等字段 --> <!-- 修改主单据等字段 -->
<el-dialog title="修改" v-model="openBill" append-to-body width="40%"> <el-dialog title="修改" v-model="openBill" append-to-body width="40%">
<el-form <el-form :model="billData" :rules="rules" ref="editRef" label-width="100px">
:model="billData"
:rules="rules"
ref="editRef"
label-width="100px"
>
<el-form-item label="出库类型" prop="operationType"> <el-form-item label="出库类型" prop="operationType">
<el-select <el-select v-model="billData.operationType" placeholder="请选择出库类型" clearable>
v-model="billData.operationType" <el-option v-for="dict in storeTypeList" :key="dict.id" :label="dict.typeName" :value="dict.typeCode" />
placeholder="请选择出库类型"
clearable
>
<el-option
v-for="dict in storeTypeList"
:key="dict.id"
:label="dict.typeName"
:value="dict.typeCode"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="施工队" prop="teamCode"> <el-form-item label="施工队" prop="teamCode">
<el-select <el-select v-model="billData.teamCode" placeholder="请选择施工队" clearable>
v-model="billData.teamCode" <el-option v-for="dict in wzTypeList" :key="dict.id" :label="dict.teamName" :value="dict.teamCode" />
placeholder="请选择施工队"
clearable
>
<el-option
v-for="dict in wzTypeList"
:key="dict.id"
:label="dict.teamName"
:value="dict.teamCode"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="理货员" prop="operator"> <el-form-item label="理货员" prop="operator">
<el-select <el-select v-model="billData.operator" placeholder="请选择理货员" clearable>
v-model="billData.operator" <el-option v-for="dict in personList" :key="dict.userId" :label="dict.userName" :value="dict.userId" />
placeholder="请选择理货员"
clearable
>
<el-option
v-for="dict in personList"
:key="dict.userId"
:label="dict.userName"
:value="dict.userId"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- <el-form-item label="库存状态" prop="execStatus"> <!-- <el-form-item label="库存状态" prop="execStatus">
@@ -829,11 +401,7 @@
</el-select> </el-select>
</el-form-item> --> </el-form-item> -->
<el-form-item label="是否配送" prop="isDelivery"> <el-form-item label="是否配送" prop="isDelivery">
<el-select <el-select v-model="billData.isDelivery" placeholder="请选择是否配送" clearable>
v-model="billData.isDelivery"
placeholder="请选择是否配送"
clearable
>
<el-option :key="1" label="" value="1" /> <el-option :key="1" label="" value="1" />
<el-option :key="0" label="" value="0" /> <el-option :key="0" label="" value="0" />
</el-select> </el-select>
@@ -847,13 +415,7 @@
</el-dialog> </el-dialog>
<!-- 出库单 --> <!-- 出库单 -->
<el-dialog <el-dialog title="出库单" v-model="dialogBill" append-to-body width="80%" :close-on-click-modal="false">
title="出库单"
v-model="dialogBill"
append-to-body
width="80%"
:close-on-click-modal="false"
>
<bill :billAllObj="billAllObj" billStatus="ck" /> <bill :billAllObj="billAllObj" billStatus="ck" />
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
@@ -872,21 +434,11 @@
<img w-full :src="dialogImageUrl" alt="Preview Image" /> <img w-full :src="dialogImageUrl" alt="Preview Image" />
</el-dialog> </el-dialog>
<el-dialog title="图片详情" v-model="dialogPicDetailVisible"> <el-dialog title="图片详情" v-model="dialogPicDetailVisible">
<el-image <el-image style="width: 100px; height: 100px; margin-right: 20px" :src="url" v-for="url in picList" :key="url"
style="width: 100px; height: 100px; margin-right: 20px" :preview-src-list="picList" />
:src="url"
v-for="url in picList"
:key="url"
:preview-src-list="picList"
/>
</el-dialog> </el-dialog>
<el-dialog <el-dialog title="调度任务" v-model="dispatchOpen" width="30%" :close-on-click-modal="false">
title="调度任务"
v-model="dispatchOpen"
width="30%"
:close-on-click-modal="false"
>
<el-form> <el-form>
<el-row> <el-row>
<el-col> <el-col>
@@ -908,17 +460,9 @@
<!-- 修改主单据,入库时间等字段 --> <!-- 修改主单据,入库时间等字段 -->
<el-dialog title="修改" v-model="outInfoDialog" append-to-body width="40%"> <el-dialog title="修改" v-model="outInfoDialog" append-to-body width="40%">
<el-form <el-form :model="outInfoData" :rules="outInfoRules" ref="outInfoRef" label-width="100px">
:model="outInfoData"
:rules="outInfoRules"
ref="outInfoRef"
label-width="100px"
>
<el-form-item label="出库数量" prop="realQty"> <el-form-item label="出库数量" prop="realQty">
<el-input <el-input v-model="outInfoData.realQty" placeholder="请输入出库数量" />
v-model="outInfoData.realQty"
placeholder="请输入出库数量"
/>
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="remark">
<el-input v-model="outInfoData.remark" placeholder="请输入备注" /> <el-input v-model="outInfoData.remark" placeholder="请输入备注" />
@@ -1374,6 +918,7 @@ const editRef = ref(null);
function editForm() { function editForm() {
editRef.value.validate((valid) => { editRef.value.validate((valid) => {
if (valid) { if (valid) {
delete billData.value.execStatus
updateBill(billData.value).then((response) => { updateBill(billData.value).then((response) => {
proxy.$modal.msgSuccess("操作成功"); proxy.$modal.msgSuccess("操作成功");
openBill.value = false; openBill.value = false;
@@ -1654,6 +1199,12 @@ function handleDispatch() {
proxy.$modal.msgError("请勾选数据"); proxy.$modal.msgError("请勾选数据");
return; return;
} }
let isDiaodu = checkStockList.value.some((item) => item.execStatus == 0);
if (isDiaodu) {
proxy.$modal.msgWarning("预出库数据不能生成调度任务");
return;
}
dispatchOpen.value = true; dispatchOpen.value = true;
} }
// 提交调度任务 // 提交调度任务
@@ -1665,7 +1216,8 @@ function submitDispatch() {
//调用生成调度任务接口 //调用生成调度任务接口
const data = checkStockList.value.map((item) => ({ const data = checkStockList.value.map((item) => ({
sourceName: item.pcode, sourceName: item.pcode,
targetName: "V01-230101", // targetName: "V01-230101",
targetName: "V01-010101",
taskTypeName: "下架", taskTypeName: "下架",
taskType: 1, taskType: 1,
mid: item.wlNo, mid: item.wlNo,
@@ -1690,12 +1242,14 @@ function submitDispatch() {
line-height: 30px; line-height: 30px;
} }
} }
.addOutBoundBox { .addOutBoundBox {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
margin-bottom: 10px; margin-bottom: 10px;
cursor: pointer; cursor: pointer;
.addOutBound { .addOutBound {
display: flex; display: flex;
align-items: center; align-items: center;

View File

@@ -60,29 +60,34 @@
:props="{ children: 'children', label: 'warehouseName', value: 'warehouseCode' }" clearable /> :props="{ children: 'children', label: 'warehouseName', value: 'warehouseCode' }" clearable />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6">
<el-form-item label="场景" prop="scene">
<el-select v-model="queryParams.scene" placeholder="请选择场景" clearable>
<el-option v-for="dict in sceneTypeList" :key="dict.sceneCode" :label="dict.sceneName" :value="dict.sceneCode" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="供应商名称" prop="gysMc"> <el-form-item label="供应商名称" prop="gysMc">
<el-input v-model="queryParams.gysMc" placeholder="请输入供应商名称" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.gysMc" placeholder="请输入供应商名称" clearable @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="16"> <el-col :span="6">
<el-form-item label="物料描述" prop="wlMs"> <el-form-item label="物料描述" prop="wlMs">
<el-input v-model="queryParams.wlMs" placeholder="请输入物料描述" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.wlMs" placeholder="请输入物料描述" clearable @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="16"> <el-col :span="6">
<el-form-item label="备注" prop="remark">
<el-input v-model="queryParams.remark" placeholder="请输入备注" clearable @keyup.enter="handleQuery" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="入库时间" prop="optionTime"> <el-form-item label="入库时间" prop="optionTime">
<el-date-picker v-model="optionTime" type="datetimerange" start-placeholder="开始时间" end-placeholder="结束时间" <el-date-picker v-model="optionTime" type="datetimerange" start-placeholder="开始时间" end-placeholder="结束时间"
format="YYYY/MM/DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" /> format="YYYY/MM/DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6">
<el-form-item label="备注" prop="remark">
<el-input v-model="queryParams.remark" placeholder="请输入备注" clearable @keyup.enter="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="12" class="searchBtn"> <el-col :span="12" class="searchBtn">
<el-form-item> <el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
@@ -90,6 +95,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
</el-form> </el-form>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
@@ -134,6 +140,7 @@
<el-table-column label="托盘码" align="center" prop="trayCode" /> <el-table-column label="托盘码" align="center" prop="trayCode" />
<el-table-column label="身份码" align="center" prop="entityId" width="150" /> <el-table-column label="身份码" align="center" prop="entityId" width="150" />
<el-table-column label="物资类型" align="center" prop="wlTypeName" /> <el-table-column label="物资类型" align="center" prop="wlTypeName" />
<el-table-column label="场景" align="center" prop="sceneName" width="150" />
<el-table-column label="所属大库" align="center" prop="parentWarehouseName" width="150" /> <el-table-column label="所属大库" align="center" prop="parentWarehouseName" width="150" />
<el-table-column label="所属小库" align="center" prop="warehouseName" width="150" /> <el-table-column label="所属小库" align="center" prop="warehouseName" width="150" />
<el-table-column label="入库类型" align="center" prop="operationTypeName" width="150" /> <el-table-column label="入库类型" align="center" prop="operationTypeName" width="150" />
@@ -334,6 +341,7 @@ import { listStock, getTotal, editStock, printTag } from "@/api/wisdom/
import { warehousingDict } from "@/api/information/warehousingtype"; //入库类型 import { warehousingDict } from "@/api/information/warehousingtype"; //入库类型
import { materialtypeDict } from "@/api/information/materialtype"; //物资类型 import { materialtypeDict } from "@/api/information/materialtype"; //物资类型
import { warehouseAll } from "@/api/information/warehouseinfo"; //所属仓库 import { warehouseAll } from "@/api/information/warehouseinfo"; //所属仓库
import { listScene } from "@/api/information/scene"; //所属仓库
import { personListDict } from "@/api/system/user"; //理货员 import { personListDict } from "@/api/system/user"; //理货员
import { getKwAllList } from "@/api/information/pcdedetail"; //库位下拉数据 import { getKwAllList } from "@/api/information/pcdedetail"; //库位下拉数据
import { parseTime } from '@/utils/manage' import { parseTime } from '@/utils/manage'
@@ -456,6 +464,14 @@ function materialFun() {
}) })
} }
materialFun() materialFun()
//场景下拉
const sceneTypeList = ref([]);
function listSceneFun() {
listScene().then(response => {
sceneTypeList.value = response.rows
})
}
listSceneFun()
//理货员 //理货员
const personList = ref([]); const personList = ref([]);