123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632 |
- <template>
- <el-card shadow="always" :body-style="{ padding: '10px' }">
- <div class="app-container">
- <el-row :gutter="10">
- <el-col :span="10">
- <div class="table-area">
- <el-button
- class="mb10"
- type="success"
- size="small"
- @click="handleRefresh"
- :icon="loading ? 'el-icon-loading' : 'el-icon-refresh'"
- :disabled="loading"
- >刷新
- </el-button>
- <el-table
- :data="leftTableData"
- border
- stripe
- @selection-change="handleSelectionChange"
- @cell-click="cellClick"
- highlight-current-row
- >
- <!-- <el-table-column type="selection" width="55" /> -->
- <el-table-column type="index" label="序号" width="50" />
- <el-table-column
- align="center"
- prop="customerName"
- label="客户名称"
- >
- </el-table-column>
- <el-table-column
- align="center"
- prop="saleOrderNo"
- label="销售单号"
- >
- </el-table-column>
- <el-table-column
- align="center"
- prop="noticeNumber"
- label="通知单号"
- >
- </el-table-column>
- <el-table-column
- align="center"
- prop="noticeDate"
- label="开单日期"
- >
- </el-table-column>
- </el-table></div
- ></el-col>
- <el-col :span="14">
- <div class="form-area">
- <el-row :gutter="20">
- <el-form
- :model="form"
- ref="form"
- label-width="80px"
- :inline="true"
- size="mini"
- :rules="rules"
- >
- <el-col :span="16">
- <el-form-item label="通知单号" prop="noticeNumber">
- <div class="text-area">
- <span class="mr10">{{ form.noticeNumber }}</span>
- <span>{{ form.documentTypeName }}</span>
- </div>
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="销售员" prop="salesman">
- {{ form.salesman }}
- </el-form-item>
- </el-col>
- <el-col :span="16">
- <el-form-item label="客户名称" prop="customerName">
- {{ form.customerName }}
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="售货单位" prop="sellingUnit">
- {{ form.sellingUnit }}
- </el-form-item>
- </el-col>
- <el-col :span="16">
- <el-form-item label="货车信息" prop="truckRegistration">
- {{ form.truckRegistration }}
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="发货员" prop="deliveryClerk">
- {{ form.deliveryClerk }}
- </el-form-item>
- </el-col>
- <el-col :span="24">
- <el-form-item label="备注" prop="dispatchNoteRemark">
- {{ form.dispatchNoteRemark }}
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="发货日期" prop="deliveryDate">
- <el-date-picker
- v-model="form.deliveryDate"
- type="date"
- size="mini"
- placeholder="选择日期"
- >
- </el-date-picker>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="发货仓库" prop="deliveryWarehouse">
- <el-select
- v-model="form.deliveryWarehouse"
- clearable
- filterable
- >
- <el-option
- v-for="item in warehouseList"
- :key="item.id"
- :label="item.warehouseName"
- :value="item.id"
- >
- </el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <!-- <el-col :span="12">
- <el-form-item label="调拨仓库" prop="transferWarehouse">
- <el-select
- v-model="form.transferWarehouse"
- clearable
- filterable
- >
- <el-option
- v-for="item in warehouseList"
- :key="item.id"
- :label="item.warehouseName"
- :value="item.id"
- >
- </el-option>
- </el-select>
- </el-form-item>
- </el-col> -->
- <el-col :span="24">
- <el-form-item>
- <el-button type="primary" @click="outStockHandler"
- >出库
- </el-button>
- <el-button @click="refreshHandler">刷新</el-button>
- </el-form-item>
- </el-col>
- </el-form>
- </el-row>
- <el-table
- :data="saleProductInfoList"
- border
- stripe
- :span-method="objectSpanMethod"
- :row-class-name="tableRowClassName"
- >
- <el-table-column align="center" label="编码" prop="productCode">
- </el-table-column>
- <el-table-column align="center" label="品名" prop="productName">
- </el-table-column>
- <el-table-column align="center" label="批号" prop="lotNum" v-if="this.dlotNum">
- </el-table-column>
- <el-table-column
- align="center"
- label="规格"
- prop="productSpecifications"
- >
- </el-table-column>
- <el-table-column align="center" label="颜色" prop="productColor">
- </el-table-column>
- <!-- <el-table-column align="center" label="批号" prop="lotNum">
- </el-table-column>
- <el-table-column align="center" label="等级" prop="levels">
- </el-table-column> -->
- <el-table-column align="center" label="通知">
- <el-table-column
- align="center"
- label="重量"
- prop="actualWeight"
- >
- </el-table-column>
- </el-table-column>
- <el-table-column align="center" label="实发">
- <!-- <el-table-column
- align="center"
- label="总箱数"
- prop="coutBoxNum"
- >
- <template slot-scope="scope">
- <el-input
- v-model="scope.row.coutBoxNum"
- size="mini"
- @input="iptChange"
- ></el-input>
- </template>
- </el-table-column> -->
- <el-table-column
- align="center"
- label="箱数"
- prop="oldActualBoxNum"
- >
- <template slot-scope="scope">
- <el-input
- v-model="scope.row.oldActualBoxNum"
- size="mini"
- @input="iptChange"
- ></el-input>
- </template>
- </el-table-column>
- <!-- <el-table-column
- align="center"
- label="总重量"
- prop="coutweight"
- >
- <template slot-scope="scope">
- <el-input
- v-model="scope.row.coutweight"
- size="mini"
- @input="iptChange"
- ></el-input>
- </template>
- </el-table-column> -->
- <el-table-column
- align="center"
- label="重量"
- prop="oldActualWeight"
- >
- <template slot-scope="scope">
- <el-input
- v-model="scope.row.oldActualWeight"
- size="mini"
- @input="iptChange"
- ></el-input>
- </template>
- </el-table-column>
- </el-table-column>
- </el-table>
- </div>
- </el-col>
- </el-row>
- </div>
- </el-card>
- </template>
- <script>
- import {
- productInvoiceList,
- saleStorageDetails,
- queryDropDownBoxData,
- noticeOutStorage,
- oldNoticeOutStorage, checkOldInventory,
- } from "@/api/tablelist/commonTable";
- import { mapState } from "vuex";
- export default {
- name: "OutStock",
- props: [],
- dicts: ["billing_type", "document_type"],
- components: {},
- data() {
- return {
- spanArr: [], // 用于记录每个 productCode 的跨行信息
- loading: false,
- dlotNum: false,
- currentIndex: "",
- form: {
- noticeNumber: "", //通知单号
- documentType: "", //通知单类型
- documentTypeName: "",
- salesman: "", //销售员
- sellingUnit: "", //售货单位
- truckRegistration: "", //货车信息
- drawer: "", //开票员
- deliveryClerk: "", // 发货员
- dispatchNoteRemark: "", //备注
- customerName: "", //客户名称
- deliveryDate: new Date(), //发货日期
- deliveryWarehouse: "", //发货仓库
- transferWarehouse: "", //调拨仓库
- id: "",
- },
- leftTableData: [],
- warehouseList: [],
- saleProductInfoList: [],
- rules: {
- deliveryDate: [
- { required: true, message: "请选择发货日期", trigger: "change" },
- ],
- deliveryWarehouse: [
- { required: true, message: "请选择发货仓库", trigger: "change" },
- ],
- transferWarehouse: [
- { required: true, message: "请选择调拨仓库", trigger: "change" },
- ],
- },
- };
- },
- methods: {
- iptChange(value) {
- console.log(value);
- this.$forceUpdate(); //强制刷新
- },
- tableRowClassName({ row, rowIndex }) {
- if (!row.actualWeight && row.actualWeight != 0) {
- return "warning-row";
- }
- },
- objectSpanMethod({ row, column, rowIndex, columnIndex }) {
- // 重量
- if (columnIndex === 6 || columnIndex === 7 || columnIndex === 9) {
- const prevRow2 = this.saleProductInfoList[rowIndex - 1]; //上一行数据
- let nextRow2 = this.saleProductInfoList[rowIndex + 1]; //下一行数据
- // 当上一行的数据等于当前行数据时,当前行单元格隐藏
- if (
- prevRow2 &&
- prevRow2.productCode == row.productCode &&
- prevRow2.productColor == row.productColor
- ) {
- return { rowspan: 0, colspan: 0 };
- } else {
- // 反之,则循环判断若下一行数据等于当前行数据,则当前行开始进行合并单元格
- let countRowspan2 = 1; //用于合并计数多少单元格
- while (
- nextRow2 &&
- nextRow2.productCode == row.productCode &&
- nextRow2.productColor == row.productColor
- ) {
- nextRow2 = this.saleProductInfoList[++countRowspan2 + rowIndex];
- }
- if (countRowspan2 > 1) {
- // this.saleProductInfoList[rowIndex].coutBoxNum = 9;
- return { rowspan: countRowspan2, colspan: 1 };
- }
- }
- }
- },
- // 刷新回调
- async handleRefresh() {
- this.loading = true;
- await this.initData();
- await this.initWarehouse();
- this.loading = false;
- },
- // 左侧表格点击回调
- cellClick(row, column, cell, event) {
- this.currentIndex = this.leftTableData.findIndex(
- (item) => item.id == row.id
- );
- this.initFormData();
- },
- // 刷新回调
- refreshHandler() {
- this.initFormData();
- },
- // 出库回调
- outStockHandler() {
- this.$refs.form.validate(async (valid) => {
- if (valid) {
- this.$confirm("是否确认出库?", "提示", {
- confirmButtonText: "确定",
- cancelButtonText: "取消",
- type: "warning",
- })
- .then(async () => {
- let payLoad = { ...this.form };
- payLoad.oldProductInvoiceList = this.saleProductInfoList;
- payLoad.transferWarehouse = payLoad.deliveryWarehouse;
- payLoad.saleOrderNo =
- this.leftTableData[this.currentIndex || 0].saleOrderNo;
- if (!this.form.id) {
- return;
- }
- delete payLoad.documentTypeName;
- //校验库存是否足够
- let res1 = await checkOldInventory(payLoad);
- //等于200 可以进行老库存出库
- if (res1.code == 200) {
- if(res1.isG==1){
- this.$confirm(res1.msg, "库存不足提示", {
- confirmButtonText: "确定",
- cancelButtonText: "取消",
- type: "warning",
- })
- .then(async () => {
- this.$message.success("出库成功");
- let res = await oldNoticeOutStorage(payLoad);
- if (res.code == 200) {
- this.$message.success("出库成功");
- this.currentIndex = 0;
- await this.initData();
- this.refreshHandler();
- } else {
- this.$message.error(res.msg);
- }
- }).catch(() => {
- this.$message({
- type: "info",
- message: "已取消出库",
- });
- });
- }else {
- let res = await oldNoticeOutStorage(payLoad);
- if (res.code == 200) {
- this.$message.success("出库成功");
- this.currentIndex = 0;
- await this.initData();
- this.refreshHandler();
- } else {
- this.$message.error(res.msg);
- }
- }
- } else {
- console.log("当前code",res1);
- }
- })
- .catch(() => {
- this.$message({
- type: "info",
- message: "已取消出库",
- });
- });
- } else {
- return false;
- }
- });
- },
- handleSelectionChange() {},
- // 初始化仓库选项数据
- async initWarehouse() {
- try {
- let payload = [
- {
- basicMap: {
- tableName: "warehouse",
- },
- conditionMap: {
- warehouse_type: ["1"],
- },
- },
- ];
- let res = await queryDropDownBoxData(payload);
- if (res.code == 200) {
- this.warehouseList = res.data.resultMap?.warehouse || [];
- } else {
- throw new Error(res.msg);
- }
- } catch (error) {}
- },
- // 初始化数据
- async initData() {
- try {
- let payload = {
- isEnablePaging: false,
- status: 1,
- };
- let res = await productInvoiceList(payload);
- if (res.code == 200) {
- this.leftTableData = res.rows;
- if (this.leftTableData.length > 0) {
- this.currentIndex = 0;
- this.initFormData();
- }
- } else {
- throw new Error(res.msg);
- }
- } catch (error) {}
- },
- // 根据字典获取文件类型
- getdocumentTypeName(value) {
- return (
- this.dict.type.document_type.find((item) => {
- return item.value === value;
- })?.label || ""
- );
- },
- // 加载表单数据
- async initFormData() {
- // let { id, customerName } = this.leftTableData[this.currentIndex];
- let id = false,
- customerName;
- if (this.leftTableData[this.currentIndex]) {
- id = this.leftTableData[this.currentIndex].id;
- customerName = this.leftTableData[this.currentIndex].customerName;
- }
- if (!id) {
- //重置表单数据
- Object.assign(this.form, {
- noticeNumber: "", //通知单号
- documentType: "", //通知单类型
- documentTypeName: "", //通知单类型 名
- salesman: "", //销售员
- sellingUnit: "", //售货单位
- truckRegistration: "", //货车信息
- dispatchNoteRemark: "", //备注
- customerName: "", //客户名称
- deliveryClerk: "", //发货员
- id: "",
- });
- return;
- }
- try {
- let res = await saleStorageDetails(id);
- if (res.code == 200) {
- let {
- noticeNumber, //通知单号
- documentType, //通知单类型
- salesman, //销售员
- sellingUnit, //售货单位
- truckRegistration, //货车信息
- drawer, //开票员
- dispatchNoteRemark, //备注
- saleProductInfoList, //产品信息
- id,
- } = res.data;
- let documentTypeName = this.getdocumentTypeName(documentType);
- // let list = saleProductInfoList.sort( (a,b)=>{
- // let {productColor : colorA,productCode :codeA}=a
- // let {productColor : colorB,productCode : codeB}=b
- // return (colorA+codeA)-(colorB-codeB)
- // })
- this.saleProductInfoList = saleProductInfoList;
- // 使用 reduce 方法来累加相同 productCode 和 productColor 的第一条数据的 boxNum
- const codeColorSums = this.saleProductInfoList.reduce(
- (acc, curr, index) => {
- // 创建一个用于组合 productCode 和 productColor 的键
- const key = `${curr.productCode}-${curr.productColor}`;
- // 检查当前 key 是否已经存在
- if (!acc[key]) {
- // 如果不存在,添加 key 作为键,并将 boxNum 设置为当前值
- acc[key] = {
- firstIndex: index,
- sum: curr.boxNum,
- weight: curr.weight,
- count: 1,
- };
- } else {
- acc[key].count++; // 增加计数
- acc[key].sum += curr.boxNum;
- acc[key].weight += curr.weight;
- }
- return acc;
- },
- {}
- );
- this.saleProductInfoList.forEach((item, index) => {
- if (codeColorSums[`${item.productCode}-${item.productColor}`]) {
- item.coutBoxNum =
- codeColorSums[`${item.productCode}-${item.productColor}`].sum;
- item.coutweight =
- codeColorSums[
- `${item.productCode}-${item.productColor}`
- ].weight.toFixed(2);
- }
- });
- if(this.saleProductInfoList.length > 0){
- if(this.saleProductInfoList[0].lotNum == null || this.saleProductInfoList[0].lotNum == '' || this.saleProductInfoList[0].lotNum == undefined){
- this.dlotNum = false;
- }else{
- this.dlotNum = true;
- }
- }else{
- this.dlotNum = false;
- }
- Object.assign(this.form, {
- noticeNumber, //通知单号
- documentType, //通知单类型
- documentTypeName, //通知单类型 名
- salesman, //销售员
- sellingUnit, //售货单位
- truckRegistration, //货车信息
- dispatchNoteRemark, //备注
- customerName, //客户名称
- id,
- });
- this.form.deliveryClerk = this.nickName;
- } else {
- console.log(res);
- this.$message.error("网络异常");
- }
- } catch (error) {
- console.log(error);
- }
- },
- },
- computed: {
- ...mapState({
- nickName: (state) => state.user.nickName,
- }),
- },
- mounted() {
- this.initData();
- this.initWarehouse();
- },
- };
- </script>
- <style scoped lang="scss">
- .app-container {
- display: flex;
- width: 100%;
- .table-area {
- // width: 600px;
- }
- .form-area {
- // flex: 1;
- }
- }
- ::v-deep .el-table__body tr.current-row > td.el-table__cell {
- background-color: #55e905 !important;
- }
- .table-data > .gutter {
- display: table-cell !important;
- }
- ::v-deep .el-table .warning-row {
- color: red;
- }
- </style>
|