You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
spms-vue/src/views/warehouse/IOSearchOrder.vue

1028 lines
36 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div>
<el-card class="el-card">
<el-form
:inline="true"
:model="filterQuery"
class="query-form"
size="mini"
>
<el-row>
<el-form-item class="query-form-item">
<el-input v-model="filterQuery.id" placeholder="单号"></el-input>
</el-form-item>
<el-form-item class="query-form-item">
<el-select
v-model="filterQuery.mainAction"
placeholder="出入库类型"
clearable
>
<el-option label="全部" value=""></el-option>
<el-option label="入库" value="WareHouseIn"></el-option>
<el-option label="出库" value="WareHouseOut"></el-option>
</el-select>
</el-form-item>
<el-form-item class="query-form-item">
<el-select v-model="filterQuery.action" placeholder="请选择扫码单据类型" clearable>
<el-option
v-for="item in busTypes"
:key="item.name"
:label="item.name"
:value="item.action">
<span style="float: left">{{ item.name }}</span>
</el-option>
</el-select>
</el-form-item>
<el-form-item class="query-form-item">
<el-select v-model="filterQuery.locStorageCode" placeholder="请选择当前仓库" clearable="true"
@change="invChange"
size="mini">
<el-option
v-for="item in storageList"
:key="item.name"
:label="item.name"
:value="item.code">
<span style="float: left">{{ item.name }}</span>
</el-option>
</el-select>
</el-form-item>
<el-form-item class="query-form-item">
<el-select v-model="filterQuery.invWarehouseCode" placeholder="请选择当前分库" clearable="true"
size="mini"
@change="subInvChange">
<el-option
v-for="item in subInvList"
:key="item.name"
:label="item.name"
:value="item.code">
<span style="float: left">{{ item.name }}</span>
</el-option>
</el-select>
</el-form-item>
<el-form-item class="query-form-item">
<span style="color: #000; margin-left: 10px; margin-right: 6px;font-size: small"
>创建日期:</span
>
<el-date-picker
:picker-options="pickerOptions"
v-model="actDateRange"
type="daterange"
format="yyyy 年 MM 月 dd 日"
value-format="yyyy-MM-dd"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
>
</el-date-picker>
</el-form-item>
<el-form-item>
<el-button-group>
<el-button type="primary" icon="el-icon-refresh" @click="onReset"></el-button>
<el-button type="primary" icon="search" @click="onSubmit">查询</el-button>
<!-- <el-button type="primary" icon="search" @click="exportOrders">导出单据</el-button>-->
</el-button-group>
</el-form-item>
</el-row>
</el-form>
<el-table
v-loading="loading"
:data="list"
style="width: 100%"
@row-click="getOrderDetail"
highlight-current-row
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55"></el-table-column>
<el-table-column label="序号" type="index"></el-table-column>
<el-table-column label="扫码单据类型" prop="billTypeName">
</el-table-column>
<el-table-column
label="订单号"
prop="id"
show-overflow-tooltip="true"
></el-table-column>
<el-table-column label="来源" prop="fromType">
<template slot-scope="scope">
<span>{{ fromTypeMap[scope.row.fromType] }}</span>
</template>
</el-table-column>
<el-table-column label="往来单位" prop="fromCorp" width="250">
</el-table-column>
<el-table-column label="当前仓库" prop="invName" width="120">
</el-table-column>
<el-table-column label="当前分库" prop="subInvName" width="120">
</el-table-column>
<el-table-column
label="创建时间"
prop="actDate"
width="150"
show-overflow-tooltip="true"
>
<template slot-scope="scope">
<i class="el-icon-time"></i>
<span>{{ scope.row.actDate }}</span>
</template>
</el-table-column>
<!--<el-table-column label="校验状态" prop="status" width="100">-->
<!--<template slot-scope="scope">-->
<!--<el-tag :type="(scope.row.status === 3) | statusFilterType">{{-->
<!--checkStatus[scope.row.contrastStatus]-->
<!--}}-->
<!--</el-tag>-->
<!--</template>-->
<!--</el-table-column>-->
<el-table-column label="校验状态" prop="contrastStatus" width="120">
<template slot-scope="scope">
<el-tag :type="(scope.row.contrastStatus === 1) | statusFilterType">
{{ erpCheckStatus[scope.row.contrastStatus] }}
</el-tag>
</template>
</el-table-column>
<!--<el-table-column label="操作" width="150">-->
<!--<template slot-scope="scope">-->
<!--<el-button-->
<!--type="text"-->
<!--size="small"-->
<!--:disabled="scope.row.contrastStatus === null"-->
<!--@click.native.stop="repeatCheckClick(scope.row)"-->
<!--&gt;重新校验-->
<!--</el-button-->
<!--&gt;-->
<!--<el-button-->
<!--type="text"-->
<!--size="small"-->
<!--:disabled="scope.row.contrastStatus !== 0"-->
<!--@click.native.stop="handleErrorDetail(scope.$index)"-->
<!--&gt;校验信息-->
<!--</el-button-->
<!--&gt;-->
<!--</template>-->
<!--</el-table-column>-->
<!-- <el-table-column label="上传状态" prop="exportStatus"></el-table-column> -->
<!--<el-table-column label="操作" width="250">-->
<!--<template slot-scope="scope">-->
<!--<el-button-->
<!--type="text"-->
<!--size="small"-->
<!--:disabled="scope.row.status === 4"-->
<!--@click.native.stop="repeatCheckClick(scope.row)"-->
<!--&gt;重新校验-->
<!--</el-button-->
<!--&gt;-->
<!--<el-button-->
<!--type="text"-->
<!--size="small"-->
<!--:disabled="scope.row.status === 4"-->
<!--@click.native.stop="handleErrorDetail(scope.$index)"-->
<!--&gt;校验信息-->
<!--</el-button-->
<!--&gt;-->
<!--</template>-->
<!--</el-table-column>-->
<el-table-column label="操作" fixed="right" width="120">
<template slot-scope="scope">
<el-button
type="text"
size="small"
@click.native.stop="intentDetail(scope.row)"
>详情
</el-button
>
<!-- <el-button-->
<!-- type="text"-->
<!-- size="small"-->
<!-- @click.native.stop="successOrderExportPDF(scope.row)"-->
<!-- >单据打印-->
<!-- </el-button-->
<!-- >-->
<el-button
type="text"
size="small"
@click.native.stop="deleteDialog(scope.row.id)"
>删除
</el-button
>
<!--<el-button-->
<!--type="text"-->
<!--size="small"-->
<!--@click.native.stop="importOrder(scope.row)"-->
<!--&gt;选择单据校验-->
<!--</el-button>-->
</template>
</el-table-column>
</el-table>
<el-dialog
title="导出PDF"
:visible.sync="successOrderExportPDFSettingVisible"
width="80%"
v-if="successOrderExportPDFSettingVisible"
@close='closeDialog'
>
<successOrderExportPDFSetting
:closeDialog="closeDialog"
:idQuery="idQuery"
></successOrderExportPDFSetting>
</el-dialog>
<el-pagination
:page-size="filterQuery.limit"
@current-change="handleCurrentChange"
layout="prev, pager, next"
:total="total"
:current-page="filterQuery.page"
></el-pagination>
</el-card>
<el-card class="el-card" v-if="true" id="printJS-form">
<el-table
v-loading="loading"
:row-class-name="tableRowClassName"
:data="detailList"
style="width: 100%"
>
<el-table-column label="序号" type="index"></el-table-column>
<el-table-column
label="产品通用名"
prop="coName"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column
label="包装规格"
prop="packSpec"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column
label="批次号"
prop="batchNo"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column
label="生产日期"
prop="productDate"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column
label="失效日期"
prop="expireDate"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column
label="单据数量"
prop="erpCount"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column
label="实际数量"
prop="reCount"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column label="扫码数量" prop="count"></el-table-column>
<el-table-column
label="供应商"
prop="supName"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column
label="生产企业"
prop="productCompany"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column
label="注册/备案凭证号"
prop="authCode"
:show-overflow-tooltip="true"
></el-table-column>
</el-table>
</el-card>
<el-dialog
title="选择往来单位"
:visible.sync="dialogTableVisible"
width="70%"
>
<el-form :inline="true" :model="query" class="query-form" size="mini">
<el-form-item class="query-form-item">
<el-input v-model="unitquery.key" placeholder="搜索"></el-input>
</el-form-item>
<el-form-item>
<el-button
type="primary"
icon="search"
@click.native.stop="getUnitList()"
>查询
</el-button
>
</el-form-item>
</el-form>
<el-table
v-loading="loading"
:data="unitlist"
style="width: 100%"
@row-click="selectUnit"
>
<el-table-column label="往来单位ID" prop="unitId"></el-table-column>
<el-table-column
label="往来单位名称"
prop="name"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="往来单位简写"
prop="spell"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="地址"
prop="addr"
show-overflow-tooltip
></el-table-column>
<el-table-column label="状态" prop="status"></el-table-column>
<el-table-column label="类型" prop="type"></el-table-column>
</el-table>
</el-dialog>
<el-dialog
title="选择业务单据"
:visible.sync="addDialogVisible"
width="80%"
v-if="addDialogVisible"
>
<selectErpOrder
v-on:closeManuDialog="closeManuDialog"
:orderId="orderId"
></selectErpOrder>
</el-dialog>
<el-dialog
title="单号详情"
:visible.sync="codeDetailVisible"
width="80%"
v-if="codeDetailVisible"
:close-on-click-modal="false"
:close-on-press-escape="false"
>
<codeDetail
:idQuery="idQuery"
v-on:closeDetailDialog="closeDetailDialog"
></codeDetail>
</el-dialog>
<el-dialog title="校验信息" :visible.sync="errDialogVisible" width="30%">
<span>{{ errorDetail }}</span>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="errDialogVisible = false"
> </el-button
>
</span>
</el-dialog>
</div>
</template>
<script>
import {
orderList,
codeList,
findAllByOrderId,
updateUnit,
filterOrder,
deleteByOrderId,
updateExportStatus,
uploadOrder,
mergeOrder,
orderDetail, exportJson
} from "../../api/warehouse/order";
import {
orderDetailPDFFromTemplateCode,
orderDetailPDFFromTemplateFile,
inspectionOrderDetailPDFFromTemplateCode,
inspectionOrderDetailPDFFromTemplateFile, stockOrderPDFFromTemplateFile
} from "../../api/itextpdf/itextpdf";
import {repeatCheck} from "../../api/erp/erpOrder";
import {unitListBykey} from "../../api/warehouse/unit";
import draggable from "vuedraggable";
import {saveAs} from "file-saver";
import codeDetail from "./code";
import store from "../../store";
import successOrderExportPDFSetting from "./successOrderExportPDF";
import {downloadInoutOrderSuccessPDF} from "../../api/itextpdf/itextpdf";
import selectErpOrder from "./DialogSelectErpOrder";
import {getBussinessType} from "../../api/basic/bussinessType";
import {formatDate} from "../../utils/date";
import {filterAllByUser} from "@/api/basic/invWarehouse";
import {getLocalJoinByUser} from "@/api/basic/busLocalType";
import {filterSubByInv} from "@/api/basic/invSubWarehouse";
const formJson = {
site_id: "",
site_name: "",
describe: "",
ads: [],
};
export default {
props: {
isSelect: {
type: Boolean,
default: false,
},
},
data() {
return {
query: {
page: 1,
limit: 20,
},
checkStatus: {
1: "校验异常",
0: "未校验",
2: "正常",
},
erpCheckStatus: {
// error: "校验异常",
// null: "未校验",
// success: "正常",
1: "已完成",
0: "已完成",
2: "已完成",
},
fromTypeMap: {
"1": "UDIMS平台",
"2": "网页新增",
"3": "pda即时校验",
"4": "pda未校验",
"5": "pc端扫码精灵",
"6": "缺量补录单据",
"7": "UDI供应商平台",
"8": "平衡补录单据",
},
//往来单位
unitquery: {key: "", page: 1, limit: 20},
unitlist: [],
list: [],
detailList: [],
storageList: [],
subInvList: [],
unitUpdateQuery: {
id: "",
fromCorpId: "",
fromCorp: "",
},
actDateRange: [],
filterQuery: {
id: "",
mainAction: null,
action: null,
page: 1,
limit: 10,
code: "",
exportStatus: null,
unionCtrStatus: 1,
status: null,
startTime: "",
endTime: "",
locStorageCode: this.$store.getters.locInvCode,
invWarehouseCode: this.$store.getters.locSubInvCode,
},
detailQuery: {
orderId: "",
page: 1,
limit: 20
},
detailTotal: 0,
deleteData: {
id: "",
},
idQuery: {
id: "",
},
curIndex: "",
adListNoDataText: "无数据",
queryAdIdAsyncLoading: false,
codeDetailVisible: false,
successOrderExportPDFSettingVisible: false,
total: 0,
loading: false,
index: null,
formName: null,
orderId: "",
formMap: {
add: "新增",
edit: "编辑",
},
exportQuery: {
orderId: "",
exportStatus: "",
},
uploadQuery: {
orderId: "",
},
busTypes: [],
multipleSelection: [],
dialogTableVisible: false,
formLoading: false,
formVisible: false,
formData: formJson,
deleteLoading: false,
addDialogVisible: false,
errDialogVisible: false,
pickerOptions: {
shortcuts: [
{
text: "最近一周",
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
picker.$emit("pick", [start, end]);
},
},
{
text: "最近一个月",
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
picker.$emit("pick", [start, end]);
},
},
{
text: "最近三个月",
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
picker.$emit("pick", [start, end]);
},
},
],
},
};
},
components: {
draggable,
codeDetail,
successOrderExportPDFSetting,
selectErpOrder,
},
methods: {
onReset() {
this.$router.push({
path: "",
});
this.filterQuery = {
id: "",
mainAction: null,
action: null,
page: 1,
limit: 10,
code: "",
unionCtrStatus: 1,
exportStatus: null,
status: null,
startTime: "",
endTime: "",
};
this.actDateRange = [];
this.getList();
},
onSubmit() {
if (this.actDateRange !== null) {
this.filterQuery.startTime = this.actDateRange[0];
this.filterQuery.endTime = this.actDateRange[1];
} else {
this.filterQuery.startTime = null;
this.filterQuery.endTime = null;
}
this.getList();
},
handleSizeChange(val) {
this.filterQuery.limit = val;
this.getList();
},
handleCurrentChange(val) {
this.filterQuery.page = val;
this.getList();
},
handleSelectionChange(val) {
this.multipleSelection = val;
},
getStorage() {
this.storageList = [];
filterAllByUser()
.then((response) => {
this.storageList = response.data || [];
if (this.storageList.length > 0) {
this.filterQuery.locStorageCode = this.storageList[0].code;
this.getSubInvList();
this.getList();
}
})
.catch(() => {
});
},
getStorageName(code) {
for (let i = 0; i < this.storageList.length; i++) {
if (this.storageList[i].code === code) {
return this.storageList[i].name;
}
}
},
getSubStorageName(code) {
for (let i = 0; i < this.subInvList.length; i++) {
if (this.subInvList[i].code === code) {
return this.subInvList[i].name;
}
}
},
handleErrorDetail(poistion) {
var mOrder = this.list[poistion];
this.errorDetail = mOrder.remark;
this.errDialogVisible = true;
},
mergesOrders() {
var repeatData = this.multipleSelection;
if (repeatData.length <= 1) {
this.$message.warning("选择的订单需大于1");
return;
}
var orderid = repeatData[0].id;
var unit = repeatData[0].fromCorp;
var action = repeatData[0].action;
var orderList = [];
repeatData.forEach((obj, index) => {
if (unit !== obj.fromCorp) {
this.$message.warning("往来单位不一致!");
return;
}
if (action !== obj.action) {
this.$message.warning("业务类型不一致!");
return;
}
orderList.push(obj.id);
});
var tquery = {
orderList: orderList,
};
this.$confirm(
"所选择的订单将会合并到订单号为" + orderid + "的订单下",
"提示",
{
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}
)
.then(() => {
mergeOrder(tquery).then((response) => {
if (response.code === 20000) {
this.getList();
this.$message({
type: "success",
message: "合并成功",
});
} else {
this.$message.error(response.message);
}
});
})
.catch(() => {
});
},
exportOrders() {
var repeatData = this.multipleSelection;
if (repeatData.length < 1) {
this.$message.warning("选择的订单需大于1");
return;
}
var orderList = [];
repeatData.forEach((obj, index) => {
orderList.push(obj.id);
});
var tquery = {
ids: orderList,
};
exportJson(tquery).then((response) => {
const binaryData = [];
binaryData.push(response);
let url = window.URL.createObjectURL(
new Blob(binaryData, {type: "application/json"})
);
// window.open(url);
this.loading = false;
const eleLink = document.createElement('a');
var timestamp = formatDate(new Date(), "yyyyMMddhhmmss")
// var timestamp = formatDate(new Date(), "yyyy-MM-dd_hh:mm")
eleLink.download = "Order_" + timestamp + ".LowerIn";
eleLink.style.display = 'none';
eleLink.href = url;
document.body.appendChild(eleLink)
eleLink.click()
document.body.removeChild(eleLink)
}).catch(() => {
this.loading = false;
});
},
//获取订单列表
getList() {
this.loading = true;
this.filterQuery.customerId = store.getters.customerId;
filterOrder(this.filterQuery)
.then((response) => {
this.loading = false;
this.list = response.data.list || [];
this.detailList = [];
this.total = response.data.total || 0;
})
.catch(() => {
this.loading = false;
this.list = [];
this.total = 0;
});
},
//业务明细表
getOrderDetail(row) {
this.loading = true;
this.detailQuery = {
orderId: row.id,
};
this.refresgOrderDetail();
},
repeatCheckClick(row) {
let tQuery = {
orderId: row.id,
};
this.loading = true;
repeatCheck(tQuery)
.then((response) => {
this.loading = false;
if (response.code === 20000) {
this.$message.success(response.data);
this.getList();
this.detailQuery = {
orderId: row.id,
};
this.refresgOrderDetail();
} else {
this.$message.error(response.message);
}
})
.catch(() => {
this.loading = false;
this.getList();
this.$message.error(response.message);
});
},
refresgOrderDetail() {
orderDetail(this.detailQuery)
.then((response) => {
this.loading = false;
this.detailList = response.data || [];
})
.catch(() => {
this.loading = false;
this.detailList = [];
});
},
handleUnitClick(row) {
this.curIndex = row.id;
// this.dialogTableVisible = true;
},
getUnitList() {
this.loading = true;
unitListBykey(this.unitquery)
.then((response) => {
this.loading = false;
this.unitlist = response.data.list || [];
})
.catch(() => {
this.loading = false;
});
},
intentDetail(row) {
this.codeDetailVisible = true;
this.idQuery.id = row.id;
},
successOrderExportPDFSetting(row) {
this.idQuery.id = '';
if (this.$isNotBlank(row.id)) {
this.idQuery.id = row.id;
}
this.successOrderExportPDFSettingVisible = true;
},
successOrderExportPDF(row) {
let tQuery = {
orderId: row.id,
customerId: store.getters.customerId
}
this.loading = true;
inspectionOrderDetailPDFFromTemplateFile(tQuery).then((response) => {
if (response.code === 20000) {
orderDetailPDFFromTemplateFile(tQuery).then((response) => {
//将pdf文件转换为url。
const binaryData = [];
binaryData.push(response);
//获取blob链接。
let url = window.URL.createObjectURL(
new Blob(binaryData, {type: "application/pdf"})
);
this.loading = false;
window.open(url);//打开新标签页预览pdf。
}).catch(() => {
this.loading = false;
});
} else {
this.loading = false;
this.$message.error(response.message);
}
}).catch(() => {
this.loading = false;
});
},
closeDialog() {
this.successOrderExportPDFSettingVisible = false;
this.getList();
},
selectUnit(row) {
this.unitUpdateQuery.id = this.curIndex;
this.unitUpdateQuery.fromCorp = row.name;
this.unitUpdateQuery.fromCorpId = row.unitid;
updateUnit(this.unitUpdateQuery)
.then((response) => {
this.dialogTableVisible = false;
this.getList();
})
.catch(() => {
this.dialogTableVisible = false;
});
},
deleteOrders(data) {
this.loading = true;
this.deleteData.id = data;
deleteByOrderId(this.deleteData)
.then((response) => {
this.getList();
this.refresgOrderDetail();
this.$message({
type: "success",
message: "删除成功!",
});
})
.catch(() => {
});
},
tableRowClassName({row, rowIndex}) {
if (row.reCount === row.count) {
return "success-row";
} else {
return "warning-row";
}
},
deleteDialog(rowId) {
this.$confirm("此操作将永久删除该订单, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
this.deleteOrders(rowId);
})
.catch(() => {
});
},
closeDetailDialog(val) {
this.codeDetailVisible = false;
},
closeManuDialog(val) {
this.addDialogVisible = false;
if (val) {
this.$message.success("选入成功");
this.refresgOrderDetail();
this.getList();
} else {
this.$message.error("选入失败");
}
},
cancelDialog() {
this.addDialogVisible = false;
},
importOrder(row) {
this.orderId = row.id;
this.addDialogVisible = true;
},
getBusType() {
let query = {
code: this.filterQuery.invWarehouseCode,
enabled: true,
};
getLocalJoinByUser(query)
.then((response) => {
this.busTypes = response.data.list || [];
this.filterQuery.billAction = this.busTypes[0].action;
// this.getList();
})
.catch(() => {
});
},
getActionName(action) {
for (let i = 0; i < this.busTypes.length; i++) {
if (this.busTypes[i].action === action) {
return this.busTypes[i].name;
}
}
},
invChange() {
this.filterQuery.invWarehouseCode = "";
this.subInvList = [];
let query = {
pcode: this.filterQuery.locStorageCode
};
filterSubByInv(query)
.then((response) => {
this.subInvList = response.data || [];
})
.catch(() => {
});
},
getSubInvList() {
let query = {
pcode: this.filterQuery.locStorageCode
};
filterSubByInv(query)
.then((response) => {
this.subInvList = response.data || [];
})
.catch(() => {
});
},
subInvChange() {
this.getBusType();
}
}
,
filters: {
statusFilterType(status) {
const statusMap = {
false: "success",
true: "danger",
};
return statusMap[status];
}
,
}
,
mounted() {
document.body.ondrop = function (event) {
event.preventDefault();
event.stopPropagation();
};
}
,
created() {
this.getStorage();
this.getBusType();
let query = this.$route.query;
this.query = Object.assign(this.query, query);
this.query.limit = parseInt(this.query.limit);
let end = new Date();
let start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
this.actDateRange = [start, end];
}
,
}
;
</script>
<style>
.el-table .warning-row {
background: #ffb5b5;
}
.el-table .success-row {
background: #ffffff;
}
</style>