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.
udiwms-vue/src/views/inout/IOFinishOrder.vue

973 lines
36 KiB
Vue

<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="出入库类型"
>
<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="请选择业务类型">
<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">
<span style="color: #000; margin-left: 10px; margin-right: 6px"
>创建日期:</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="mergesOrders"
>合并单号
</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="action">
<template slot-scope="scope">
<span>{{ geActionName(scope.row.action) }}</span>
</template>
</el-table-column>
<el-table-column
label="订单号"
prop="id"
show-overflow-tooltip="true"
></el-table-column>
<!-- <el-table-column
label="来源订单号"
prop="corpOrderId"
:show-overflow-tooltip="true"
></el-table-column> -->
<el-table-column label="来源" prop="fromType"></el-table-column>
<el-table-column label="往来单位" prop="fromCorp" width="220">
<template slot-scope="scope">
<p v-if="scope.row.fromCorp == null">
<el-button
type="primary"
size="mini"
@click.native.stop="handleUnitClick(scope.row)"
>选择往来单位
</el-button
>
</p>
<p v-if="scope.row.fromCorp != null">
<el-button
type="primary"
size="mini"
@click.native.stop="handleUnitClick(scope.row)"
>{{ scope.row.fromCorp }}
</el-button
>
</p>
</template>
</el-table-column>
<el-table-column
label="创建时间"
prop="actDate"
width="120"
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="contrastStatus" width="120">
<template slot-scope="scope">
<el-tag
:type="(scope.row.contrastStatus == 1) | statusFilterType"
>{{ checkStatus[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)"
>重新校验
</el-button
>
<el-button
type="text"
size="small"
:disabled="scope.row.contrastStatus != 1"
@click.native.stop="handleErrorDetail(scope.$index)"
>校验信息
</el-button
>
</template>
</el-table-column>
<!-- <el-table-column label="上传状态" prop="exportStatus"></el-table-column> -->
<el-table-column label="操作" fixed="right" width="230">
<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="deleteDialog(scope.row.id)"
>删除
</el-button
>
<!--<el-button-->
<!--type="text"-->
<!--size="small"-->
<!--@click.native.stop="exportDialog(scope.row)"-->
<!--&gt;修改Erp-->
<!--</el-button-->
<!--&gt;-->
<el-button
type="text"
size="small"
@click.native.stop="importOrder(scope.row)"
>选择Erp订单
</el-button
>
</template>
</el-table-column>
</el-table>
<el-pagination
:page-size="query.limit"
@current-change="handleCurrentChange"
layout="prev, pager, next"
:total="total"
></el-pagination>
</el-card>
<el-card class="el-card">
<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="erpOrderId"-->
<!-- :show-overflow-tooltip="true"-->
<!-- ></el-table-column>-->
<!-- <el-table-column-->
<!-- label="货品名称"-->
<!-- prop="goodsname"-->
<!-- :show-overflow-tooltip="true"-->
<!-- ></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="reCount"
: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="count"></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"
:close-on-click-modal="false"
:close-on-press-escape="false"
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="选择erp业务单据"
:visible.sync="addDialogVisible"
:close-on-click-modal="false"
:close-on-press-escape="false"
width="80%"
v-if="addDialogVisible"
>
<selectErpOrder
v-on:closeManuDialog="closeManuDialog"
:orderId="orderId"
></selectErpOrder>
</el-dialog>
<el-dialog
title="单号详情"
:visible.sync="codeDetailVisible"
width="80%"
:close-on-click-modal="false"
:close-on-press-escape="false"
v-if="codeDetailVisible"
>
<codeDetail
:idQuery="idQuery"
v-on:closeDetailDialog="closeDetailDialog"
></codeDetail>
</el-dialog>
<el-dialog
title="校验信息"
:visible.sync="errDialogVisible"
width="30%"
:close-on-click-modal="false"
:close-on-press-escape="false"
>
<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 {
findAllByOrderId,
updateUnit,
filterOrder,
deleteByOrderId,
updateExportStatus,
uploadOrder,
mergeOrder,
orderDetail,
} from "../../api/inout/order";
import {getBussinessType} from "../../api/basic/bussinessType";
import {repeatCheck} from "../../api/inout/erpOrder";
import {getBasicUnitMaintains} from "../../api/basic/basicUnitMaintain"
import draggable from "vuedraggable";
import {saveAs} from "file-saver";
import codeDetail from "./IOFinishCode";
import selectErpOrder from "./DialogSelectErpOrder";
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: "正常",
},
//往来单位
unitquery: {key: "", page: 1, limit: 20},
unitlist: [],
list: [],
detailList: [],
unitUpdateQuery: {
id: "",
fromCorpId: "",
fromCorp: "",
},
actDateRange: [],
filterQuery: {
id: "",
mainAction: null,
action: null,
page: 1,
limit: 10,
code: "",
exportStatus: null,
unionStatus:1,
startTime: "",
endTime: "",
},
detailQuery: {
orderId: "",
},
deleteData: {
id: "",
},
idQuery: {
id: "",
},
curIndex: "",
adListNoDataText: "无数据",
queryAdIdAsyncLoading: false,
codeDetailVisible: false,
total: 0,
loading: true,
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,
selectErpOrder,
},
methods: {
onReset() {
this.$router.push({
path: "",
});
this.filterQuery = {
id: "",
mainAction: null,
action: null,
page: 1,
limit: 10,
code: "",
exportStatus: null,
unionStatus:1,
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) {
console.log(val);
this.multipleSelection = val;
},
handleErrorDetail(poistion) {
var mOrder = this.list[poistion];
this.errorDetail = mOrder.remark;
this.errDialogVisible = true;
},
getBusType() {
let query = {
enabled: true,
};
getBussinessType(query)
.then((response) => {
this.busTypes = response.data.list || [];
})
.catch(() => {
});
},
geActionName(action) {
for (let i = 0; i < this.busTypes.length; i++) {
if (this.busTypes[i].action === action) {
return this.busTypes[i].name;
}
}
},
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 = [];
let isMerge = true;
repeatData.forEach((obj) => {
if (unit != obj.fromCorp) {
this.$message.warning("所选单据往来单位不一致!");
isMerge = false;
return;
}
if (action != obj.action) {
this.$message.warning("所选单据业务类型不一致!");
isMerge = false;
return;
}
orderList.push(obj.id);
});
var tquery = {
orderList: orderList,
};
if (isMerge) {
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(() => {
});
}
},
//获取订单列表
getList() {
this.loading = true;
filterOrder(this.filterQuery)
.then((response) => {
this.loading = false;
this.list = response.data.list || [];
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();
});
},
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;
getBasicUnitMaintains(this.unitquery)
.then((response) => {
this.loading = false;
this.unitlist = response.data.page.list || [];
})
.catch(() => {
this.loading = false;
});
},
intentDetail(row) {
// this.$router.push({
// path: "../inout/detail",
// query: { id: row.id },
// });
this.codeDetailVisible = true;
this.idQuery.id = row.id;
},
selectUnit(row) {
console.log(row.id);
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.dtlgoodsqty == row.count) {
return "success-row";
} else {
return "warning-row";
}
},
exportDialog(value) {
var mOrder = value;
if (mOrder.exportStatus == "已上传") {
this.$confirm("该订单已修改, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
this.uploadOrderDialog(mOrder);
})
.catch(() => {
});
} else if (mOrder.contrastStatus == "error") {
this.$confirm("该订单校验异常, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
this.uploadOrderDialog(mOrder);
})
.catch(() => {
});
} else if (mOrder.contrastStatus == null) {
this.$confirm("该订单未校验, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
this.uploadOrderDialog(mOrder);
})
.catch(() => {
});
} else {
this.$confirm("是否确定修改ERP订单?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
this.uploadOrderDialog(mOrder);
})
.catch(() => {
});
}
},
exportXml(poistion) {
this.loading = true;
var mOrder = this.list[poistion];
var corpOrderId = mOrder.id;
var codeArry;
this.query = {
corpOrderId: corpOrderId,
page: 1,
limit: 20,
};
findAllByOrderId(this.query) //查找该单号下的所有条码
.then((response) => {
this.loading = false;
codeArry = response.data.list || [];
var document =
'<?xml version="1.0" encoding="utf-8"?>\n' +
'<Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="终端接口XML Schema-2.0.xsd" SN="" Version="3.0" License="123456">\n' +
"<Events>\n" +
'<Event Name="' +
mOrder.action +
'" MainAction="' +
mOrder.mainAction +
'">' +
"<ActionMaping>\n" +
'<Action Name="' +
mOrder.mainAction +
'">\n' +
"<ActionData>Code</ActionData>\n" +
"<ActionData>CorpOrderID</ActionData>\n" +
"<ActionData>Actor</ActionData>\n" +
"<ActionData>ActDate</ActionData>\n" +
"<ActionData>ToCorpID</ActionData>\n" +
"</Action>\n" +
" </ActionMaping>\n" +
"<DataMaping>\n" +
'<MetaData Name="Code" Type="string" />\n' +
'<MetaData Name="CorpOrderID" Type="string" />\n' +
'<MetaData Name="Actor" Type="string" />\n' +
'<MetaData Name="ActDate" Type="Date" />\n' +
'<MetaData Name="ToCorpID" Type="string" />\n' +
"</DataMaping>\n" +
"<DataField>\n";
for (var value of codeArry) {
if (value.fromCorpId == null) {
value.fromCorpId = "";
}
var tempdata =
' <Data Code="' +
value.code +
'" CorpOrderID="' +
value.corpOrderId +
'" Actor="' +
value.actor +
'" ActDate="' +
value.actDate +
'" ToCorpID="' +
value.fromCorpId +
'" />\n';
document = document + tempdata;
}
document =
document +
"</DataField>\n" +
"</Event>\n" +
"</Events>\n" +
"</Document>\n";
var blob = new Blob([document], {
type: "text/plain;charset=utf-8",
});
saveAs(blob, mOrder.action + mOrder.corpOrderId + ".xml");
this.exportQuery.orderId = corpOrderId;
this.exportQuery.exportStatus = "已上传";
updateExportStatus(this.exportQuery).then((response) => {
this.getList();
});
})
.catch(() => {
this.loading = false;
this.list = [];
this.total = 0;
});
},
uploadOrderDialog(value) {
console.log(value.id + "---" + value.orderid);
this.uploadQuery = {
orderId: value.id,
};
uploadOrder(this.uploadQuery)
.then((response) => {
if (response.code == 20000) {
this.$message.success(response.data);
this.getList();
} else {
this.$message.error(response.message);
}
})
.catch(() => {
});
},
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;
},
},
filters: {
statusFilterType(status) {
const statusMap = {
false: "success",
true: "danger",
};
return statusMap[status];
},
},
mounted() {
document.body.ondrop = function (event) {
event.preventDefault();
event.stopPropagation();
};
},
created() {
// 将参数拷贝进查询对象
let query = this.$route.query;
this.query = Object.assign(this.query, query);
this.query.limit = parseInt(this.query.limit);
// 加载表格数据
this.getList();
let end = new Date();
let start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
this.actDateRange = [start, end];
this.getBusType();
},
};
</script>
<style>
.el-table .warning-row {
background: #ffb5b5;
}
.el-table .success-row {
background: #ffffff;
}
</style>