|
@@ -3,7 +3,7 @@
|
|
|
<ele-pro-table
|
|
<ele-pro-table
|
|
|
ref="table"
|
|
ref="table"
|
|
|
:needPage="false"
|
|
:needPage="false"
|
|
|
- :columns="[]"
|
|
|
|
|
|
|
+ :columns="columns"
|
|
|
:datasource="form.datasource"
|
|
:datasource="form.datasource"
|
|
|
class="time-form"
|
|
class="time-form"
|
|
|
@columns-change="handleColumnChange"
|
|
@columns-change="handleColumnChange"
|
|
@@ -293,7 +293,15 @@
|
|
|
<el-form-item
|
|
<el-form-item
|
|
|
:prop="'datasource.' + scope.$index + '.warehouseNum'"
|
|
:prop="'datasource.' + scope.$index + '.warehouseNum'"
|
|
|
>
|
|
>
|
|
|
- <span>{{ scope.row.warehouseNum }}</span>
|
|
|
|
|
|
|
+ <el-link
|
|
|
|
|
+ v-if="scope.row.isSuspend === 1"
|
|
|
|
|
+ :underline="false"
|
|
|
|
|
+ type="primary"
|
|
|
|
|
+ @click="pendingReplaceTable(scope.row, scope.$index)"
|
|
|
|
|
+ >
|
|
|
|
|
+ {{ scope.row.warehouseNum }}
|
|
|
|
|
+ </el-link>
|
|
|
|
|
+ <span v-else>{{ scope.row.warehouseNum }}</span>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</template>
|
|
</template>
|
|
|
<!-- <template v-slot:saleUnit="scope">
|
|
<!-- <template v-slot:saleUnit="scope">
|
|
@@ -368,6 +376,27 @@
|
|
|
>
|
|
>
|
|
|
替代料
|
|
替代料
|
|
|
</el-link>
|
|
</el-link>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- <template v-if="scope.row.batchNo && $hasPermission('eom:saleordersendrecord:pending' ) && needPending == 1">
|
|
|
|
|
+ <el-popconfirm
|
|
|
|
|
+ v-if="scope.row.isSuspend === 1"
|
|
|
|
|
+ class="ele-action"
|
|
|
|
|
+ title="确定要取消挂起吗?"
|
|
|
|
|
+ @confirm="pending(scope.row, 0)"
|
|
|
|
|
+ >
|
|
|
|
|
+ <template v-slot:reference>
|
|
|
|
|
+ <el-link
|
|
|
|
|
+ type="primary"
|
|
|
|
|
+ :underline="false"
|
|
|
|
|
+ >
|
|
|
|
|
+ 取消挂起
|
|
|
|
|
+ </el-link>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-popconfirm>
|
|
|
|
|
+ <el-link v-else type="primary" :underline="false" @click="pendingReplaceTable(scope.row, scope.$index)">
|
|
|
|
|
+ 挂起
|
|
|
|
|
+ </el-link>
|
|
|
|
|
+ </template> -->
|
|
|
</template>
|
|
</template>
|
|
|
</ele-pro-table>
|
|
</ele-pro-table>
|
|
|
<productListNew
|
|
<productListNew
|
|
@@ -392,6 +421,10 @@
|
|
|
ref="selectStockLedgerDialogRef"
|
|
ref="selectStockLedgerDialogRef"
|
|
|
@changeParent="replaceTable"
|
|
@changeParent="replaceTable"
|
|
|
></selectStockLedgerDialog>
|
|
></selectStockLedgerDialog>
|
|
|
|
|
+ <selectStockLedgerDialogPending
|
|
|
|
|
+ ref="selectStockLedgerDialogPendingRef"
|
|
|
|
|
+ @changeParent="pendingReplaceTableConfirm"
|
|
|
|
|
+ ></selectStockLedgerDialogPending>
|
|
|
<BIZproductList
|
|
<BIZproductList
|
|
|
ref="BIZproductListRef"
|
|
ref="BIZproductListRef"
|
|
|
classType="1"
|
|
classType="1"
|
|
@@ -427,6 +460,7 @@
|
|
|
import { parameterGetByCode } from '@/api/main/index.js';
|
|
import { parameterGetByCode } from '@/api/main/index.js';
|
|
|
import { getSummaries } from '@/utils/util.js';
|
|
import { getSummaries } from '@/utils/util.js';
|
|
|
import { getBatchList } from '@/api/wms';
|
|
import { getBatchList } from '@/api/wms';
|
|
|
|
|
+ import selectStockLedgerDialogPending from './selectStockLedger/selectStockLedgerDialog.vue';
|
|
|
|
|
|
|
|
export default {
|
|
export default {
|
|
|
mixins: [dictMixins, getDynamicsColumns, tabMixins],
|
|
mixins: [dictMixins, getDynamicsColumns, tabMixins],
|
|
@@ -463,6 +497,7 @@
|
|
|
stockLedgerDialog,
|
|
stockLedgerDialog,
|
|
|
selectStockLedgerDialog,
|
|
selectStockLedgerDialog,
|
|
|
BIZproductList,
|
|
BIZproductList,
|
|
|
|
|
+ selectStockLedgerDialogPending
|
|
|
},
|
|
},
|
|
|
data() {
|
|
data() {
|
|
|
const defaultForm = {
|
|
const defaultForm = {
|
|
@@ -531,11 +566,18 @@
|
|
|
},
|
|
},
|
|
|
rules: {},
|
|
rules: {},
|
|
|
columnsVersion: 1,
|
|
columnsVersion: 1,
|
|
|
|
|
+ needPending: 0
|
|
|
};
|
|
};
|
|
|
},
|
|
},
|
|
|
created() {
|
|
created() {
|
|
|
this.requestDict('产地');
|
|
this.requestDict('产地');
|
|
|
this.requestDict('生产类型');
|
|
this.requestDict('生产类型');
|
|
|
|
|
+ // 发起时物品清单是否需要挂起 //0否 1是
|
|
|
|
|
+ parameterGetByCode({
|
|
|
|
|
+ code: 'eom_saleOreder_invoice_pending'
|
|
|
|
|
+ }).then((res) => {
|
|
|
|
|
+ this.needPending = res.value;
|
|
|
|
|
+ });
|
|
|
parameterGetByCode({
|
|
parameterGetByCode({
|
|
|
code: 'eom_saleManage_invoice_warehouseId'
|
|
code: 'eom_saleManage_invoice_warehouseId'
|
|
|
}).then((res) => {
|
|
}).then((res) => {
|
|
@@ -952,6 +994,62 @@
|
|
|
// this.clientEnvironmentId =
|
|
// this.clientEnvironmentId =
|
|
|
},
|
|
},
|
|
|
methods: {
|
|
methods: {
|
|
|
|
|
+ // 挂起/取消挂起功能
|
|
|
|
|
+ async pending(row) {
|
|
|
|
|
+ console.log('pending~~~', row)
|
|
|
|
|
+ // 取消挂起不需要二次确认
|
|
|
|
|
+ this.$set(row, 'isSuspend', 0);
|
|
|
|
|
+ this.$forceUpdate();
|
|
|
|
|
+ this.current['offsetDetail'] = [];
|
|
|
|
|
+ this.current['isSuspend'] = 0;
|
|
|
|
|
+ this.$set(this.current, 'warehouseList', await getIdWarehouseList({
|
|
|
|
|
+ categoryId: this.current.id
|
|
|
|
|
+ }))
|
|
|
|
|
+ this.$set(this.current, 'warehouseId', '')
|
|
|
|
|
+ },
|
|
|
|
|
+ // 通过挂起状态设置行样式
|
|
|
|
|
+ tableRowClassName({row}) {
|
|
|
|
|
+ // console.log('tableRowClassName', row)
|
|
|
|
|
+ if (row.isSuspend == 1) {
|
|
|
|
|
+ return 'warning-row';
|
|
|
|
|
+ }
|
|
|
|
|
+ return '';
|
|
|
|
|
+ },
|
|
|
|
|
+ // 挂起选择库存
|
|
|
|
|
+ pendingReplaceTable(row, index) {
|
|
|
|
|
+ // console.log('handleWarehouseClick', row, index)
|
|
|
|
|
+ this.current = row;
|
|
|
|
|
+ this.$refs.selectStockLedgerDialogPendingRef.open(row, index)
|
|
|
|
|
+ },
|
|
|
|
|
+ pendingReplaceTableConfirm(list) {
|
|
|
|
|
+ console.log('confirm', list)
|
|
|
|
|
+ list.forEach((item) => {
|
|
|
|
|
+ // item.warehouseList = item.warehouseList.map( i => {
|
|
|
|
|
+ // return {
|
|
|
|
|
+ // warehouseName: i.warehouse_name,
|
|
|
|
|
+ // warehouseId: i.warehouse_id,
|
|
|
|
|
+ // }
|
|
|
|
|
+ // })
|
|
|
|
|
+ item.warehouseList = [{
|
|
|
|
|
+ warehouseName: item.warehouseName,
|
|
|
|
|
+ warehouseId: item.warehouseId,
|
|
|
|
|
+ }]
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // if(list[0].warehouseList.length == 1) {
|
|
|
|
|
+ // this.$set(this.current, 'warehouseId', list[0].warehouseId)
|
|
|
|
|
+ // }
|
|
|
|
|
+
|
|
|
|
|
+ this.$set(this.current, 'warehouseList', list[0].warehouseList)
|
|
|
|
|
+ this.$set(this.current, 'warehouseId', list[0].warehouseId)
|
|
|
|
|
+ this.$set(this.current, 'warehouseNum', list[0].measureQuantity)
|
|
|
|
|
+ this.current['offsetDetail'] = list
|
|
|
|
|
+ this.$set(this.current, 'isSuspend', 1)
|
|
|
|
|
+ console.log('current', this.current)
|
|
|
|
|
+ // this.$emit('pendingReplaceTableConfirm', list);
|
|
|
|
|
+ // this.$emit('replaceTableChange', list);
|
|
|
|
|
+ // console.log('pendingReplaceTableConfirm', list)
|
|
|
|
|
+ },
|
|
|
getSummaries(param) {
|
|
getSummaries(param) {
|
|
|
if (this.clientEnvironmentId != 4) {
|
|
if (this.clientEnvironmentId != 4) {
|
|
|
return;
|
|
return;
|
|
@@ -1460,7 +1558,7 @@
|
|
|
this.$set(
|
|
this.$set(
|
|
|
this.form.datasource[index],
|
|
this.form.datasource[index],
|
|
|
'warehouseNum',
|
|
'warehouseNum',
|
|
|
- await getWarehouseOutStock({
|
|
|
|
|
|
|
+ item.stockNum ? item.stockNum : await getWarehouseOutStock({
|
|
|
warehouseId: item.warehouseId,
|
|
warehouseId: item.warehouseId,
|
|
|
code: item.productCode
|
|
code: item.productCode
|
|
|
})
|
|
})
|
|
@@ -1514,7 +1612,7 @@
|
|
|
this.$set(
|
|
this.$set(
|
|
|
this.form.datasource[index],
|
|
this.form.datasource[index],
|
|
|
'warehouseNum',
|
|
'warehouseNum',
|
|
|
- await getWarehouseOutStock({
|
|
|
|
|
|
|
+ item.stockNum ? item.stockNum : await getWarehouseOutStock({
|
|
|
warehouseId: item.warehouseId,
|
|
warehouseId: item.warehouseId,
|
|
|
code: item.productCode
|
|
code: item.productCode
|
|
|
})
|
|
})
|
|
@@ -1551,7 +1649,7 @@
|
|
|
this.$set(
|
|
this.$set(
|
|
|
this.form.datasource[index],
|
|
this.form.datasource[index],
|
|
|
'warehouseNum',
|
|
'warehouseNum',
|
|
|
- batchNoObj.measureQuantity || 0
|
|
|
|
|
|
|
+ item.stockNum ? item.stockNum : batchNoObj.measureQuantity || 0
|
|
|
);
|
|
);
|
|
|
} else { //不存在
|
|
} else { //不存在
|
|
|
// 批次列表添加不存在的批次号对象
|
|
// 批次列表添加不存在的批次号对象
|
|
@@ -1569,7 +1667,7 @@
|
|
|
this.$set(
|
|
this.$set(
|
|
|
this.form.datasource[index],
|
|
this.form.datasource[index],
|
|
|
'warehouseNum',
|
|
'warehouseNum',
|
|
|
- ''
|
|
|
|
|
|
|
+ item.stockNum ? item.stockNum : ''
|
|
|
);
|
|
);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -1599,7 +1697,7 @@
|
|
|
this.$set(
|
|
this.$set(
|
|
|
this.form.datasource[index],
|
|
this.form.datasource[index],
|
|
|
'warehouseNum',
|
|
'warehouseNum',
|
|
|
- ''
|
|
|
|
|
|
|
+ item.stockNum ? item.stockNum : ''
|
|
|
);
|
|
);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -1842,10 +1940,18 @@
|
|
|
//开始表单校验
|
|
//开始表单校验
|
|
|
this.$refs.form.validate((valid, obj) => {
|
|
this.$refs.form.validate((valid, obj) => {
|
|
|
let is = false;
|
|
let is = false;
|
|
|
|
|
+ let isBatchNo = false;
|
|
|
|
|
+ let isSuspend = false;
|
|
|
this.form.datasource.forEach((item) => {
|
|
this.form.datasource.forEach((item) => {
|
|
|
if (Number(item.totalCount) > item.orderTotalCount) {
|
|
if (Number(item.totalCount) > item.orderTotalCount) {
|
|
|
is = true;
|
|
is = true;
|
|
|
}
|
|
}
|
|
|
|
|
+ if (item.batchStockId == 999) {
|
|
|
|
|
+ isBatchNo = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ if(item.isSuspend == 1 && (Number(item.totalCount) > item.warehouseNum)) {
|
|
|
|
|
+ isSuspend = true;
|
|
|
|
|
+ }
|
|
|
});
|
|
});
|
|
|
// 退货单退货不校验数量,实物赔偿无法计算
|
|
// 退货单退货不校验数量,实物赔偿无法计算
|
|
|
if (is && this.sourceType != 3) {
|
|
if (is && this.sourceType != 3) {
|
|
@@ -1854,6 +1960,15 @@
|
|
|
callback(false);
|
|
callback(false);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ if (isBatchNo) {
|
|
|
|
|
+ this.$message.warning('你填的批次号与库存批次号不相符,请重新选择批次号出库或删除批次号');
|
|
|
|
|
+ callback(false);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (isSuspend) {
|
|
|
|
|
+ this.$message.warning('挂起产品发货数量不能大于库存');
|
|
|
|
|
+ callback(false);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
if (obj) {
|
|
if (obj) {
|
|
|
let messages = Object.keys(obj).map((key) => obj[key][0]);
|
|
let messages = Object.keys(obj).map((key) => obj[key][0]);
|
|
|
if (messages.length > 0) {
|
|
if (messages.length > 0) {
|
|
@@ -1864,6 +1979,139 @@
|
|
|
callback(valid);
|
|
callback(valid);
|
|
|
});
|
|
});
|
|
|
},
|
|
},
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 优化后的表单校验方法 - 重构版本
|
|
|
|
|
+ * 添加了详细的注释、错误消息常量和更清晰的结构
|
|
|
|
|
+ */
|
|
|
|
|
+ validateFormOptimized(callback) {
|
|
|
|
|
+ // 使用常量存储错误消息
|
|
|
|
|
+ const ERROR_MESSAGES = {
|
|
|
|
|
+ QUANTITY_EXCEEDS_ORDER: '发货数量大于订单总数量',
|
|
|
|
|
+ BATCH_NUMBER_INVALID: '你填的批次号与库存批次号不相符,请重新选择批次号出库或删除批次号',
|
|
|
|
|
+ SUSPENDED_PRODUCT_OVERSTOCK: '挂起产品发货数量不能大于库存'
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ // 开始表单校验
|
|
|
|
|
+ this.$refs.form.validate((valid, obj) => {
|
|
|
|
|
+ // 收集所有校验错误
|
|
|
|
|
+ const errors = [];
|
|
|
|
|
+
|
|
|
|
|
+ // 遍历数据源进行业务规则校验
|
|
|
|
|
+ this.form.datasource.forEach((item, index) => {
|
|
|
|
|
+ const productInfo = this.getProductDisplayInfo(item);
|
|
|
|
|
+
|
|
|
|
|
+ // 检查数量是否超过订单数量(退货单除外)
|
|
|
|
|
+ if (this.isQuantityExceedsOrder(item)) {
|
|
|
|
|
+ if (this.sourceType != 3) { // 非退货单
|
|
|
|
|
+ errors.push({
|
|
|
|
|
+ type: 'quantity',
|
|
|
|
|
+ message: `产品[${productInfo.name}]的发货数量${item.totalCount}大于订单总数量${item.orderTotalCount}`,
|
|
|
|
|
+ stopValidation: this.isTotalCount == 1,
|
|
|
|
|
+ item: item
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 检查批次号是否正确
|
|
|
|
|
+ // if (this.isBatchNumberInvalid(item)) {
|
|
|
|
|
+ // errors.push({
|
|
|
|
|
+ // type: 'batch',
|
|
|
|
|
+ // message: `产品[${productInfo.name}]填写的批次号与库存批次号不相符,请重新选择批次号出库或删除批次号`,
|
|
|
|
|
+ // stopValidation: true,
|
|
|
|
|
+ // item: item
|
|
|
|
|
+ // });
|
|
|
|
|
+ // }
|
|
|
|
|
+
|
|
|
|
|
+ if (this.isBatchNumberInvalid(item) && item.isSuspend != 1) {
|
|
|
|
|
+ // 获取当前批次号和正确的库存批次号信息
|
|
|
|
|
+ const currentBatchNumber = item.batchNo || '未填写';
|
|
|
|
|
+ // const availableBatches = item.availableBatchNumbers || item.validBatchNumbers || [];
|
|
|
|
|
+ // const batchInfo = availableBatches.length > 0
|
|
|
|
|
+ // ? `当前可选择批次号:${availableBatches.join('、')}`
|
|
|
|
|
+ // : '当前无有效批次';
|
|
|
|
|
+
|
|
|
|
|
+ errors.push({
|
|
|
|
|
+ type: 'batch',
|
|
|
|
|
+ message: `第${index + 1}条产品[${productInfo.name}]填写的批次号"${currentBatchNumber}"与库存批次号不相符,请重新选择批次号出库或删除批次号`,
|
|
|
|
|
+ stopValidation: true,
|
|
|
|
|
+ item: item
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 检查产品库存
|
|
|
|
|
+ if (this.isProductOverstock(item)) {
|
|
|
|
|
+ errors.push({
|
|
|
|
|
+ type: 'suspend',
|
|
|
|
|
+ message: `产品[${productInfo.name}]的发货数量${item.totalCount}不能大于库存${item.warehouseNum}`,
|
|
|
|
|
+ stopValidation: true,
|
|
|
|
|
+ item: item
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // 如果存在错误,显示第一个错误并根据情况终止校验
|
|
|
|
|
+ if (errors.length > 0) {
|
|
|
|
|
+ this.$message.warning(errors[0].message);
|
|
|
|
|
+ if (errors[0].stopValidation) {
|
|
|
|
|
+ callback(false);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 显示表单字段错误(如果存在)
|
|
|
|
|
+ if (obj) {
|
|
|
|
|
+ let messages = Object.keys(obj).map((key) => obj[key][0]);
|
|
|
|
|
+ if (messages.length > 0) {
|
|
|
|
|
+ this.$message.warning(messages[0].message);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ callback(valid);
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 检查数量是否超过订单数量
|
|
|
|
|
+ * @param {Object} item 数据项
|
|
|
|
|
+ * @returns {boolean} 是否超过
|
|
|
|
|
+ */
|
|
|
|
|
+ isQuantityExceedsOrder(item) {
|
|
|
|
|
+ return Number(item.totalCount) > item.orderTotalCount;
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 检查批次号是否无效
|
|
|
|
|
+ * @param {Object} item 数据项
|
|
|
|
|
+ * @returns {boolean} 是否无效
|
|
|
|
|
+ */
|
|
|
|
|
+ isBatchNumberInvalid(item) {
|
|
|
|
|
+ return item.batchStockId == 999;
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 检查挂起产品是否超过库存
|
|
|
|
|
+ * @param {Object} item 数据项
|
|
|
|
|
+ * @returns {boolean} 是否超过
|
|
|
|
|
+ */
|
|
|
|
|
+ isProductOverstock(item) {
|
|
|
|
|
+ return Number(item.totalCount) > item.warehouseNum;
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 获取产品显示信息
|
|
|
|
|
+ * @param {Object} item 数据项
|
|
|
|
|
+ * @returns {Object} 包含产品名称和编码的对象
|
|
|
|
|
+ */
|
|
|
|
|
+ getProductDisplayInfo(item) {
|
|
|
|
|
+ return {
|
|
|
|
|
+ name: item.productName || item.name || '未知产品',
|
|
|
|
|
+ code: item.productCode || item.code || '',
|
|
|
|
|
+ info: item.productName && item.productCode
|
|
|
|
|
+ ? `${item.productName}(${item.productCode})`
|
|
|
|
|
+ : (item.productName || item.name || '未知产品')
|
|
|
|
|
+ };
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
</script>
|
|
</script>
|