<template>
|
<win-md class="stock-edit" title="物品分发" @close="close" width="900px" :loading="loading">
|
<el-form class="form" ref="ruleForm" :model="formData" :rules="rules" label-width="120px">
|
<div class="main-w">
|
<el-row :gutter="24" class="headerHeight">
|
<el-col :span="12">
|
<el-form-item label="部门" prop="departmentId">
|
<el-select ref="department" v-model="formData.departmentId" clearable placeholder="请选择" style="width: 100%">
|
<el-option v-for="item in departmentOptions" :key="item.id" :label="item.name" :value="item.id"
|
clearable/>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="领取人" prop="operatorName">
|
<el-input v-model="formData.operatorName" placeholder="请输入" clearable></el-input>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-row :gutter="24" class="headerHeight">
|
<el-col :span="12">
|
<el-form-item label="联系电话" prop="tel">
|
<el-input v-model.number="formData.tel" placeholder="请输入" clearable></el-input>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="领取时间" prop="createTime">
|
<el-date-picker
|
v-model="formData.createTime"
|
type="datetime"
|
clearable
|
value-format="yyyyMMddHHmmss"
|
placeholder="请选择日期"
|
style="width: 100%"
|
>
|
</el-date-picker>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-row :gutter="24" class="headerHeight">
|
<el-col :span="24">
|
<el-form-item label="分发审批手续" prop="procureDoc">
|
<upload ref="uploadRef" :values="fileList" :settings="uploadSettings" @on-change="uploadChange"></upload>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<div class="goods-card" v-for="(goodsItem, goodsIndex) in formData.transferGoods" :key="goodsIndex">
|
<el-row :gutter="24">
|
<el-col :span="12">
|
<el-form-item
|
label="物品分类"
|
:prop="`transferGoods.${goodsIndex}.baseCategoryId`"
|
:rules="{
|
required: true,
|
message: '请选择物品分类',
|
trigger: 'change',
|
}"
|
>
|
<el-cascader
|
v-model="goodsItem.baseCategoryId"
|
:options="categoryOptions"
|
:props="{ value: 'id',emitPath: false }"
|
:show-all-levels="false"
|
filterable
|
clearable
|
@change="categoryChange($event, goodsIndex)"
|
style="width: 100%"
|
></el-cascader>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item
|
label="物品名称"
|
:prop="`transferGoods.${goodsIndex}.baseGoodsTemplateId`"
|
:rules="rules.baseGoodsTemplateId"
|
>
|
<el-select
|
v-model="goodsItem.baseGoodsTemplateId"
|
:placeholder="goodsItem.baseCategoryId?'请选择物品':'请先选择物品分类'"
|
filterable
|
clearable
|
:disabled="!goodsItem.baseCategoryId"
|
style="width: 100%"
|
@change="goodsTemplateChange($event, goodsIndex)"
|
>
|
<el-option
|
v-for="item in goodsItem.goodsOptions"
|
:key="item.id"
|
:label="item.goodsName"
|
:value="item.id"
|
/>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-row :gutter="24">
|
<el-col :span="12">
|
<el-form-item
|
label="规格型号"
|
:prop="`transferGoods.${goodsIndex}.modelsIds`"
|
:rules="{required: true,message: '请选择规格型号',trigger: 'change',}">
|
<el-select
|
v-model="goodsItem.modelsIds"
|
multiple
|
:placeholder="goodsItem.baseGoodsTemplateId?'请选择规格型号':'请先选择物品名称'"
|
:disabled="!goodsItem.baseGoodsTemplateId"
|
@change="modelChange($event, goodsIndex)"
|
@remove-tag="modelRemoveTag($event, goodsIndex)"
|
style="width: 100%"
|
>
|
<el-option
|
v-for="item in goodsItem.modelsOptions"
|
:key="item.id"
|
:label="item.modelName"
|
:value="item.id"
|
/>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-row class="card3" v-for="(mItem, mIndex) in goodsItem.models" :key="mIndex">
|
<el-col style="padding: 15px 0" :span="10">
|
<el-form-item label="规格型号:" style="margin-bottom: 0">
|
{{ getGoodsModelsName(mItem.baseGoodsModelsId) }}
|
</el-form-item>
|
</el-col>
|
<el-col style="padding: 15px 0" :span="4">
|
<el-form-item label="剩余数量:" style="margin-bottom: 0" label-width="80">
|
{{ mItem.worehouseCount }}
|
</el-form-item>
|
</el-col>
|
<!--A类商品 -->
|
<el-col :span="24" v-if="goodsItem.classification==='A'">
|
<el-table :data="mItem.procureModelUserList" :stripe="true">
|
<el-table-column label="分发数量" align="center">
|
<template slot-scope="{$index,row}">
|
<el-form-item
|
:prop="`transferGoods.${goodsIndex}.models.${mIndex}.procureModelUserList.${$index}.goodsNum`"
|
:rules="[
|
{validator: checkCounts,type: 1, userList: mItem.procureModelUserList,worehouseCount: mItem.worehouseCount, trigger: ['blur', 'change']}
|
]"
|
label-width="0"
|
>
|
<el-input v-model.number="row.goodsNum" style="width: 100%"></el-input>
|
</el-form-item>
|
</template>
|
</el-table-column>
|
<el-table-column prop="nowUserName" label="使用人" align="center">
|
<template slot-scope="{$index,row}">
|
<el-form-item
|
:prop="`transferGoods.${goodsIndex}.models.${mIndex}.procureModelUserList.${$index}.nowUserName`"
|
:rules="[{required: true, message: '请输入使用人姓名', trigger: ['blur', 'change']}]"
|
label-width="0"
|
>
|
<el-input v-model="row.nowUserName" style="width: 100%"></el-input>
|
</el-form-item>
|
</template>
|
</el-table-column>
|
<el-table-column prop="nowUserPhone" label="联系电话" align="center">
|
<template slot-scope="{$index,row}">
|
<el-form-item
|
:prop="`transferGoods.${goodsIndex}.models.${mIndex}.procureModelUserList.${$index}.nowUserPhone`"
|
:rules="[{required: true, message: '请输入联系电话', trigger: ['blur', 'change']}]"
|
label-width="0"
|
>
|
<el-input v-model="row.nowUserPhone" style="width: 100%"></el-input>
|
</el-form-item>
|
</template>
|
</el-table-column>
|
<el-table-column align="left" width="60">
|
<template slot-scope="scope">
|
<i
|
v-if="mItem.procureModelUserList.length > 1"
|
class="el-icon-remove-outline"
|
style="color: #f56c6c; font-size: 16px; cursor: pointer"
|
@click="handleDel(goodsIndex, mIndex, scope.$index)"
|
></i>
|
<i
|
v-if="mItem.procureModelUserList.length - 1 == scope.$index"
|
class="el-icon-circle-plus-outline"
|
style="color: #0d997c; font-size: 16px; cursor: pointer"
|
@click="handleAdd(goodsIndex, mIndex, scope.$index)"
|
></i>
|
</template>
|
</el-table-column>
|
</el-table>
|
</el-col>
|
<!--BC类商品 -->
|
<el-col style="padding: 15px 0" :span="10" v-else>
|
<el-form-item
|
label="分发数量:"
|
:prop="`transferGoods.${goodsIndex}.models.${mIndex}.counts`"
|
:rules="[
|
{validator: checkCounts, type: 2,worehouseCount: mItem.worehouseCount, trigger: ['blur', 'change']}
|
]"
|
style="margin-bottom: 0" label-width="80">
|
<el-input v-model.number="mItem.counts" style="width: 160px;"></el-input>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<div class="btn-group">
|
<el-button
|
v-if="formData.transferGoods.length > 1"
|
name="移除"
|
type="danger"
|
plain
|
size="mini"
|
@click="removeGoods(goodsIndex)"
|
>移除
|
</el-button>
|
<el-button
|
v-if="formData.transferGoods.length - 1 == goodsIndex"
|
name="新增物品"
|
type="primary"
|
plain
|
size="mini"
|
@click="addGoods"
|
>新增物品
|
</el-button>
|
</div>
|
</div>
|
</div>
|
</el-form>
|
<div slot="footer" align="center" class="dialog-footer">
|
<my-button name="取消" site="form" @click="close"/>
|
<my-button name="保存" site="form" @click="handleSubmit"/>
|
</div>
|
</win-md>
|
</template>
|
<script>
|
import {goodsModel, goodsTemplate,} from '@/api/stock/procure/purchaseOrder';
|
import {transferAdd} from '@/api/stock/transfer';
|
import {departmentListAll} from '@/api/system/deptment';
|
import {getTree} from '@/api/foudation/classification';
|
import MyButton from '@/components/myButton/myButton';
|
import winMd from '@/components/win/win-md';
|
import upload from '@/components/upload/index';
|
import {getUploadUrl} from '@/utils/base';
|
import {mapGetters} from 'vuex';
|
import * as DateFormatter from '@/utils/DateFormatter';
|
import {warehouseAllSelectNumber} from "@/api/baseSetting/finsystenant";
|
|
export default {
|
components: {MyButton, winMd, upload},
|
props: {
|
setting: {
|
type: Object,
|
default: () => {
|
},
|
},
|
},
|
data() {
|
// 自定义校验
|
// 物品重复校验
|
var checkGoodsTemplateId = (rule, value, callback) => {
|
if (!value) {
|
return callback(new Error('请选择'));
|
}
|
let temp = this.formData.transferGoods.filter((v) => v.baseGoodsTemplateId == value);
|
if (!temp || temp.length != 1) {
|
return callback(new Error('已选过此物品'));
|
}
|
callback();
|
};
|
return {
|
checkCounts: (rule, value, callback) => {
|
if (!value) {
|
return callback(new Error('请输入分发数量'));
|
}
|
if (!Number.isInteger(value)) {
|
// this.$message.warning('请输入数字值');
|
return callback(new Error('请输入数字值'));
|
}
|
if (value < 1) {
|
// this.$message.warning('数字值不能为0');
|
return callback(new Error('数字值必须大于0'));
|
}
|
if (value > rule.worehouseCount) {
|
// this.$message.warning('分发数量不能大于剩余数量');
|
return callback(new Error('分发数量不能大于剩余数量'));
|
}
|
if(rule.type===1){
|
let sum = 0
|
rule.userList.map(item=>{
|
sum+=(item.goodsNum||0)
|
})
|
if (sum > rule.worehouseCount) {
|
// this.$message.warning('分发数量总和不能大于剩余数量');
|
return callback(new Error('分发数量总和不能大于剩余数量'));
|
}
|
}
|
callback();
|
},
|
loading: true,
|
fileList: [],
|
departmentOptions: [], // 部门列表
|
categoryOptions: [], // 物品分类列表
|
modelList: [], //型号列表
|
formData: {
|
transferBusinessType: 1, // 单据类型。0仓库调拨;1部门分发;2部门物品回退
|
departmentId: '', // 部门id
|
departmentName: '', // 部门名称
|
operatorName: '', // 领取人
|
tel: '', // 联系电话
|
createTime: DateFormatter.formatDate(new Date(), 'yyyyMMddhhmmss'), // 分发时间
|
procureDoc: '',
|
transferGoods: [],
|
},
|
goodsItem: {
|
baseCategoryId: '', // 分类编号
|
classification: '',
|
baseGoodsTemplateId: '', // 物品模版编号
|
goodsTemplateName: '', // 物品模版名称
|
goodsOptions: [], // 物品列表select
|
modelsOptions: [], //规格型号select
|
models: [], // 物品名称
|
modelsIds: [], //规格型号
|
},
|
modelsItem: {
|
baseGoodsModelsId: '', // 规格型号编号
|
procureModelUserList: [],
|
counts: '',
|
},
|
clistItem: {
|
goodsNum: null,
|
nowUserName: null,
|
nowUserPhone: null,
|
},
|
rules: {
|
departmentId: [{required: true, message: '请选择部门', trigger: 'change'}],
|
operatorName: [{required: true, message: '请填写领取人', trigger: 'blur'}],
|
tel: [{required: true, message: '请填写联系电话', trigger: 'blur'}],
|
createTime: [{required: true, message: '请选择分发时间', trigger: 'change'}],
|
// 增加了分发的中间流程,若后期序号此流程(下载分发单,上传分发单)则注掉procureDoc
|
procureDoc: [{required: true, message: '请上传审批手续', trigger: 'change'}],
|
baseCategoryIds: [{required: true, message: '请选择', trigger: 'change'}],
|
baseGoodsTemplateId: [{required: true, message: '请选择', trigger: 'change'},{validator: checkGoodsTemplateId, trigger: ['blur', 'change']}],
|
modelsIds: [{required: true, message: '请选择', trigger: 'change'}],
|
transferGoods: [
|
{
|
models: [
|
{
|
counts: [
|
{required: true, message: '请输入', trigger: 'change'},
|
{type: 'number', message: '数量必须为整数'},
|
],
|
procureModelUserList: [
|
{
|
goodsNum: [{required: true, message: '请输入', trigger: 'blur'}],
|
nowUserName: [{required: true, message: '请输入', trigger: 'blur'}],
|
nowUserPhone: [{required: true, message: '请输入', trigger: 'blur'}],
|
}
|
]
|
}
|
]
|
}
|
]
|
},
|
|
uploadSettings: {
|
title: '上传',
|
max: 20, // 最大大小,单位M
|
num: 10, // 支持上传图片个数
|
tip: '', // 提示 默认:`只能上传${this.defaultSettings.num}个${this.defaultSettings.accept}文件,且不超过${this.defaultSettings.max}kb`
|
uploadUrl: getUploadUrl(), // 上传路径
|
multiple: true, // 是否支持批量上传
|
disabled: false, // 是否禁用
|
},
|
};
|
},
|
computed: {
|
...mapGetters(['userInfo']),
|
},
|
created() {
|
this.init();
|
},
|
methods: {
|
async init() {
|
await this.getdeptmentList();
|
// 获取物品分类列表
|
const treeRes = await getTree();
|
this.categoryOptions = this.removeEmptyChildren(treeRes);
|
this.loading = false
|
this.getgoodsTemplate();
|
this.getgoodsModel();
|
},
|
|
// 获取部门列表
|
getdeptmentList() {
|
departmentListAll({tenantId: this.userInfo.tenantId})
|
.then((res) => {
|
this.departmentOptions = res;
|
this.formData.transferGoods.push(JSON.parse(JSON.stringify(this.goodsItem)));
|
})
|
.catch((err) => {
|
console.log('err', err);
|
});
|
},
|
|
removeEmptyChildren(arr) {
|
arr.forEach((item) => {
|
if (!item.children || !item.children.length) {
|
delete item.children;
|
} else {
|
this.removeEmptyChildren(item.children);
|
}
|
});
|
return arr;
|
},
|
|
// 获取物品名称列表
|
getgoodsTemplate(id, index) {
|
goodsTemplate({categoryId: id || '', agencyId: this.userInfo.tenantId}).then((res) => {
|
if (index || index == 0) {
|
this.$set(this.formData.transferGoods[index], 'goodsOptions', res);
|
this.$set(this.formData.transferGoods[index], 'classification', res[0].classification);
|
} else {
|
this.goodsTemplatelAll = res;
|
}
|
});
|
},
|
|
// 规格型号
|
getgoodsModel(id, index) {
|
goodsModel({goodsTemplatesId: id || '', agencyId: this.userInfo.tenantId}).then((res) => {
|
if (index || index == 0) {
|
this.$set(this.formData.transferGoods[index], 'modelsOptions', res);
|
} else {
|
this.goodsModelAll = res;
|
}
|
});
|
},
|
|
// 根据物品名称id获取名字
|
getGoodsTemplateName(id) {
|
let item = this.goodsTemplatelAll.find((v) => v.id == id);
|
if (item) {
|
return item.goodsName;
|
}
|
return;
|
},
|
|
// 根据规格型号id获取名字
|
getGoodsModelsName(id) {
|
let item = this.goodsModelAll.find((v) => v.id == id);
|
if (item) {
|
return item.modelName;
|
}
|
return;
|
},
|
|
// 物品分类选择
|
categoryChange(e, index) {
|
this.formData.transferGoods[index].goodsOptions = [];
|
this.formData.transferGoods[index].baseGoodsTemplateId = '';
|
this.formData.transferGoods[index].goodsTemplateName = '';
|
this.formData.transferGoods[index].modelsOptions = [];
|
this.formData.transferGoods[index].modelsIds = [];
|
this.formData.transferGoods[index].models = [];
|
// 根据选中分类请求物品名称列表
|
this.getgoodsTemplate(e, index);
|
},
|
|
// 物品名称列表
|
goodsTemplateChange(e, index) {
|
this.formData.transferGoods[index].modelsOptions = [];
|
this.formData.transferGoods[index].modelsIds = [];
|
this.formData.transferGoods[index].models = [];
|
|
this.formData.transferGoods[index].goodsTemplateName = this.getGoodsTemplateName(e);
|
// 根据选中物品名称id获取规格型号列表
|
this.getgoodsModel(e, index);
|
},
|
|
// 规格型号选择
|
async modelChange(e, index) {
|
let arr = [...this.formData.transferGoods[index].models];
|
let str = JSON.stringify(arr);
|
for (const item of e) {
|
if (str.indexOf(item) === -1) {
|
let num = await warehouseAllSelectNumber({
|
baseGoodsModelsId: item,
|
states: 1,
|
agencyId: this.userInfo.tenantId,
|
});
|
let procureModelUserList = [JSON.parse(JSON.stringify(this.clistItem))];
|
arr.push({...this.modelsItem, baseGoodsModelsId: item, procureModelUserList, worehouseCount: num});
|
// arr.push({...this.modelsItem, baseGoodsModelsId: item, procureModelUserList});
|
}
|
}
|
this.formData.transferGoods[index].models = arr;
|
},
|
|
// 规格型号移除
|
modelRemoveTag(e, index) {
|
let arr = this.formData.transferGoods[index].models;
|
let delIndex = arr.findIndex((v) => v.baseGoodsModelsId == e);
|
this.formData.transferGoods[index].models.splice(delIndex, 1);
|
},
|
|
//型号分发新增
|
handleAdd(goodsIndex, mIndex, cIndex) {
|
this.formData.transferGoods[goodsIndex].models[mIndex].procureModelUserList.push(JSON.parse(JSON.stringify(this.clistItem)));
|
},
|
handleDel(goodsIndex, mIndex, cIndex) {
|
this.formData.transferGoods[goodsIndex].models[mIndex].procureModelUserList.splice(cIndex, 1);
|
},
|
|
// 价格input监听 转为分
|
priceChange(e, goodsIndex, index) {
|
this.formData.transferGoods[goodsIndex].models[index].price = e * 100;
|
},
|
|
// 上传
|
uploadChange() {
|
let arr = this.$refs.uploadRef.fileList;
|
this.formData.procureDoc = JSON.stringify(arr);
|
},
|
|
// 点击新增物品
|
addGoods() {
|
this.formData.transferGoods.push(JSON.parse(JSON.stringify(this.goodsItem)));
|
},
|
|
// 点击移除
|
removeGoods(index) {
|
this.formData.transferGoods.splice(index, 1);
|
},
|
|
// 提交
|
handleSubmit() {
|
console.log('formData', this.formData);
|
this.$refs['ruleForm'].validate((valid) => {
|
if (valid) {
|
this.formData.transferGoods.map(goods => {
|
goods.models.map(mod => {
|
if (goods.classification === 'A') {
|
let counts = 0
|
mod.procureModelUserList.map(user => {
|
counts += parseInt(user.goodsNum || '0')
|
})
|
mod.counts = counts
|
}
|
})
|
})
|
|
this.formData.departmentName = this.$refs.department.selected.currentLabel
|
this.formData.outAgencyId = this.userInfo.tenantId
|
if(this.loading) return
|
this.loading = true
|
transferAdd(this.formData)
|
.then((res) => {
|
this.loading = false
|
this.$message.success('保存成功!');
|
this.close();
|
this.$emit('search');
|
})
|
.catch((err) => {
|
this.loading = false
|
console.log('create err', err);
|
//this.$message.error('保存失败');
|
});
|
} else {
|
this.$message.error('校验未通过,请检查。');
|
}
|
});
|
},
|
|
close() {
|
this.formData = {
|
warehouseId: '', // 入库仓库id
|
procureTime: '', // 采购时间
|
transferGoods: [],
|
};
|
this.$emit('close');
|
},
|
},
|
};
|
</script>
|
<style scoped lang="scss">
|
@import url(../../../../styles/store.scss);
|
|
.card3 {
|
border-radius: 2px;
|
background: #ffffff;
|
}
|
</style>
|