You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

698 lines
24 KiB

<template>
<a-spin :spinning="confirmLoading">
<j-form-container :disabled="formDisabled">
<!-- 主表单区域 -->
<a-form :form="form" slot="detail">
<a-row>
<a-col :span="8" v-show="false">
<a-form-item label="ID" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input v-decorator="['id']" placeholder="" style="width: 100%"/>
</a-form-item>
</a-col>
<a-col :span="8" v-show="false">
<a-form-item label="ID" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input v-decorator="['id']" placeholder="" style="width: 100%"/>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="流程发起人" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-select-user-by-dep v-decorator="['createBy']" disabled/>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="流程发起公司" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-select-company v-decorator="['company']" multi disabled/>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="流程发起部门" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-select-depart v-decorator="['sysOrgCode']" multi disabled/>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="流程发起时间" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-date placeholder="请选择流程发起时间" v-decorator="['createTime']" :trigger-change="true" :show-time="true"
date-format="YYYY-MM-DD HH:mm:ss" style="width: 100%" disabled/>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="物资类型" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-dict-select-tag type="list" @change="materialType"
v-decorator="['materialType',validatorRules.materialType]" :trigger-change="true"
dictCode="material_type" placeholder="请选择物资类型"/>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="被调拨部门" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-select-depart v-decorator="['beAllotDepartment',validatorRules.beAllotDepartment]" multi/>
</a-form-item>
</a-col>
<a-col :span="8
">
<a-form-item label="文件" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-upload v-decorator="['fileId']" :trigger-change="true"></j-upload>
</a-form-item>
</a-col>
</a-row>
</a-form>
</j-form-container>
<!-- 子表单区域 -->
<a-tabs v-model="activeKey" @change="handleChangeTabs">
<a-tab-pane tab="物资调拨流程调拨清单" :key="refKeys[0]" :forceRender="true">
<j-editable-table
ref="processMaterialsAllotList"
:loading="processMaterialsAllotListTable.loading"
:columns="processMaterialsAllotListTable.columns"
:dataSource="processMaterialsAllotListTable.dataSource"
:maxHeight="300"
:disabled="this.heid"
:rowNumber="true"
:rowSelection="true"
:actionButton="true"
@valueChange ="onSelect"
/>
</a-tab-pane>
</a-tabs>
<div class="div_process">
<a-form-item v-if="!disabled" :wrapperCol="{ span: 24 }" style="text-align: center">
<a-button type="primary" :disabled="disabled||btndisabled" @click="handleSubmit">保存</a-button>
<a-button style="margin-left: 8px" :disabled="disabled" @click="close">取消</a-button>
</a-form-item>
<a-form-item v-if="task" :wrapperCol="{ span: 24 }" style="text-align: center">
<a-button type="primary" @click="passTask">通过</a-button>
<a-button style="margin-left: 8px" @click="backTask">驳回</a-button>
</a-form-item>
</div>
</a-spin>
</template>
<script>
import pick from 'lodash.pick'
import { getAction, getCurrentTime, httpAction, getStringArry, getRecord } from '@/api/manage'
import { FormTypes, getRefPromise, validateFormAndTables } from '@/utils/JEditableTableUtil'
import { JEditableTableMixin } from '@/mixins/JEditableTableMixin'
import JSelectCompany from '../../../components/jeecgbiz/JSelectCompany'
import JFormContainer from '@/components/jeecg/JFormContainer'
import JDate from '@/components/jeecg/JDate'
import JUpload from '@/components/jeecg/JUpload'
import JSelectDepart from '@/components/jeecgbiz/JSelectDepart'
import JSelectUserByDep from '@/components/jeecgbiz/JSelectUserByDep'
import JDictSelectTag from '@/components/dict/JDictSelectTag'
export default {
name: 'ProcessMaterialsAllotForm',
mixins: [JEditableTableMixin],
components: {
JFormContainer,
JDate,
JUpload,
JSelectDepart,
JSelectUserByDep,
JDictSelectTag,
JSelectCompany
},
data() {
return {
heid: true,
labelCol: {
xs: { span: 24 },
sm: { span: 6 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 16 }
},
labelCol2: {
xs: { span: 24 },
sm: { span: 3 }
},
wrapperCol2: {
xs: { span: 24 },
sm: { span: 20 }
},
// 新增时子表默认添加几行空数据
addDefaultRowNum: 1,
refKeys: ['processMaterialsAllotList'],
tableKeys: ['processMaterialsAllotList'],
activeKey: 'processMaterialsAllotList',
// 物资调拨流程调拨清单
processMaterialsAllotListTable: {
loading: false,
dataSource: [],
columns: [
{
title: '物料组',
key: 'materialGroup',
// type: FormTypes.slot, // <-------------改为 slot 格式
// slotName: 'actions', // <-------------slot 的名称,对应 v-slot 冒号后面和等号前面的内容
type: FormTypes.sel_search,
dictCode: '',
width: '200px',
placeholder: '请输入${title}',
options: []
// props:{title: 'show title'}
// scopedSlots: { customRender: 'edit' },//引入的插槽
// customRender:function (t,r,index) {
// console.log(t,r);
//
// }
},
{
title: '物料编号',
key: 'equipment',
type: FormTypes.sel_search,
dictCode: '',
width: '200px',
placeholder: '请输入${title}',
options: []
},
{
title: 'WBS',
key: 'wbs',
type: FormTypes.input,
dictCode: '',
width: '200px',
placeholder: '请输入${title}',
defaultValue: ''
},
{
title: '物料名称及规格型号',
key: 'materialName',
type: FormTypes.input,
dictCode: '',
width: '200px',
placeholder: '请输入${title}',
defaultValue: ''
},
{
title: '单位',
key: 'materialUnit',
type: FormTypes.input,
dictCode: '',
width: '200px',
placeholder: '请输入${title}',
defaultValue: ''
},
{
title: '调拨数量',
key: 'allotNumber',
type: FormTypes.inputNumber,
width: '200px',
placeholder: '请输入${title}',
defaultValue: ''
},
{
title: '库存数量',
key: 'number',
type: FormTypes.inputNumber,
width: '200px',
placeholder: '请输入${title}',
defaultValue: ''
},
{
title: '调拨目标',
key: 'allotTarget',
type: FormTypes.sel_search,
dictCode: '',
width: '200px',
placeholder: '请输入${title}',
options: []
},
{
title: '单价',
key: 'materialPrice',
type: FormTypes.inputNumber,
width: '200px',
placeholder: '请输入${title}',
defaultValue: ''
},
{
title: '金额',
key: 'materialAmount',
type: FormTypes.inputNumber,
width: '200px',
placeholder: '请输入${title}',
defaultValue: ''
},
{
title: '需求时间',
key: 'requiredTime',
type: FormTypes.date,
width: '200px',
placeholder: '请输入${title}',
defaultValue: ''
},
{
title: '供货商',
key: 'supplier',
type: FormTypes.input,
dictCode: '',
width: '200px',
placeholder: '请输入${title}',
defaultValue: ''
},
{
title: '用途',
key: 'purpose',
type: FormTypes.input,
width: '200px',
placeholder: '请输入${title}',
defaultValue: ''
}
]
},
url: {
getForm: '/actBusiness/getForm',
add: '/hy/processMaterialsAllot/add',
edit: '/hy/processMaterialsAllot/edit',
queryById: '/hy/processMaterialsAllot/queryById',
descriptionRake: '/wastematerials/processWasteMaterials/wasteMaterialsName', //查询物料组
merchandiseNewsList: '/wastematerials/processWasteMaterials/merchandiseNewsName',
unitWasteNameUrl: '/unitwaste/processUnitWasteWarehouseCode/unitWasteName',
processMaterialsAllotList: {
list: '/hy/processMaterialsAllot/queryProcessMaterialsAllotListByMainId'
}
},
btndisabled: false,
validatorRules: {
// 'blur'是鼠标失去焦点的时候会触发验证
materialType: { rules: [{ required: true, message: '请选择物资类型!' }] },
beAllotDepartment: { rules: [{ required: true, message: '被调拨部门不能为空!' }] },
processPlan: { rules: [{ required: true, message: '请选择流程计划!' }] }
},
bigIdMerchandiseNewsList:[],
}
},
props: {
/*流程数据*/
processData: {
type: Object,
default: () => {
return {}
},
required: false
},
/*是否新增*/
isNew: { type: Boolean, default: false, required: false },
/*是否处理流程*/
task: { type: Boolean, default: false, required: false },
//流程表单data
formData: {
type: Object,
default: () => {
},
required: false
},
//表单模式:false流程表单 true普通表单
formBpm: {
type: Boolean,
default: false,
required: false
},
//表单禁用
disabled: {
type: Boolean,
default: false,
required: false
}
},
computed: {
formDisabled() {
if (this.formBpm === true) {
if (this.formData.disabled === false) {
return false
}
return true
}
return this.disabled
},
showFlowSubmitButton() {
if (this.formBpm === true) {
if (this.formData.disabled === false) {
return true
}
}
return false
}
},
created() {
//如果是流程中表单,则需要加载流程表单data
this.showFlowData()
if (!this.isNew) {
this.init()
}
let company = sessionStorage.getItem('PARENT_ID')
let userInfo = sessionStorage.getItem('USER_INFORMATION')
console.log(userInfo)
// userInfo.company=company;
this.popupCallback(company, userInfo)
},
methods: {
async onSelect(record) {
// console.log(record)
if(record.row.materialGroup !== '' && record.row.materialGroup !== undefined && record.row.equipment === ''){
// console.log("执行materialGroup")
this.fetchMerchandiseNews(record.row.materialGroup,1);
}
if(record.row.materialGroup !== '' && record.row.materialGroup !== undefined && record.row.equipment !== '' && record.row.allotNumber === '' ){
// console.log("执行materialNumber")
let materialName = {}
this.bigIdMerchandiseNewsList.forEach(item => {
if (item.merchandiseNewsId === record.row.equipment) {
materialName = {
name: item.merchandiseName,
unit: item.unit,
supplierName: item.supplierName,
price: item.price,
number : item.number === undefined ? 0 : item.number,
}
}
})
let values = [
{
rowKey: record.row.id,
values: {
'equipment': record.row.equipment,
'materialGroup': record.row.materialGroup,
'materialName': materialName.name,
'materialUnit': materialName.unit,
'supplier': materialName.supplierName,
'materialPrice': materialName.price,
'number': materialName.number,
'materialAmount': 0,
},
},
]
// console.log("",values);
this.$refs.processMaterialsAllotList.setValues(values);
}
// 根据请发数量计算
if(record.row.allotNumber !== '' && record.row.allotNumber !== undefined){
let res = record.row;
let materialName = {}
this.bigIdMerchandiseNewsList.forEach(item => {
if (item.merchandiseNewsId === record.row.equipment) {
materialName = {
number : item.number === undefined ? 0 : item.number,
}
}
})
// console.log("materialName.residueNumber",materialName.residueNumber)
if(parseInt( res.allotNumber) > parseInt( materialName.number )){
// console.log("大于")
this.$message.warn("输入调拨数量不能大于库存数量")
res.allotNumber = materialName.number;
}
let value = [
{
rowKey: res.id,
values: {
'equipment': res.equipment,
// 'materialGroup': res.materialGroup,
// 'materialName': res.name,
// 'materialUnit': res.unit,
// 'supplier': res.supplierName,
// 'materialPrice': res.price,
// 'number': res.number,
'allotNumber': res.allotNumber,
'materialAmount': res.materialPrice * parseInt( res.allotNumber),
},
},
]
this.$nextTick(()=>{
this.$refs.processMaterialsAllotList.setValues(value);
})
// console.log('****>',value)
}
},
fetchMerchandiseNews(value){ //查询物料清单信息
//查询大品类数据
return new Promise((resolve, reject) => {
//你的逻辑代码
let par = {
delFlag: 0,
descriptionId:value,
}
this.bigIdMerchandiseNewsList = [];
let qc = [];
let numberList = [];
if(this.processMaterialsAllotListTable.columns[1].options.length > 0){
this.processMaterialsAllotListTable.columns[1].options = [];
}
this.$refs.processMaterialsAllotList.getValues((a,b,c)=>{
// console.log(a,b,c)
b.forEach(item =>{
if(item.equipment !== '' && item.equipment !== undefined && item.equipment !== null){
numberList.push(item.materialNumber);
}
});
});
getAction(this.url.merchandiseNewsList,par).then((res)=>{
if(res.success){
console.log(res.result);
let newList = res.result;
// console.log("12312312:"+numberList.length);
if(numberList.length > 0){
newList.forEach( item => {
qc.push({
title : item.materialsNumber,
value : item.merchandiseNewsId,
disabled : false
})
})
numberList.forEach( num => {
qc.forEach( i => {
if(num === i.value){
// console.log(num,i.value);
i.disabled = true;
}
});
})
this.processMaterialsAllotListTable.columns[1].options = qc;
}else{
newList.forEach( item => {
this.processMaterialsAllotListTable.columns[1].options.push({
title : item.materialsNumber,
value : item.merchandiseNewsId,
disabled : false
})
})
}
// console.log(this.processUdgetPlanMaterialTable.columns[1].options);
resolve(this.bigIdMerchandiseNewsList = res.result );
// return
}
});
});
},
fetchData(value){ //查询物料组
//查询大品类数据
let par = {
delFlag: 0,
accountingAttributes: value,
}
getAction(this.url.descriptionRake,par).then((res)=>{
if(res.success){
if(this.processMaterialsAllotListTable.columns[0].options.length > 0){
this.processMaterialsAllotListTable.columns[0].options = [];
}
res.result.forEach( item => {
this.processMaterialsAllotListTable.columns[0].options.push({
title : item.descriptionName,
value : item.descriptionId,
})
})
}
});
getAction(this.url.unitWasteNameUrl,null).then((res)=>{
if(res.success){
if(this.processMaterialsAllotListTable.columns[7].options.length > 0){
this.processMaterialsAllotListTable.columns[7].options = [];
}
res.result.forEach( item => {
this.processMaterialsAllotListTable.columns[7].options.push({
title : item.departName,
value : item.libraryAssociationIdInvisible,
})
})
}
});
},
materialType(val) {
if (val !== undefined) {
this.heid = false
this.fetchData(val);
}
},
/*回显数据*/
init() {
this.btndisabled = true
var r = this.processData
this.getAction(this.url.queryById, {
tableId: r.tableId,
tableName: r.tableName
}).then((res) => {
if (res.success) {
let formData = res.result
formData.tableName = r.tableName
this.data = formData
console.log('表单回显数据', this.data)
this.editAfter()
this.btndisabled = false
} else {
this.$message.error(res.message)
}
})
},
close() {
//todo 关闭后的回调
this.$emit('close')
},
/*通过审批*/
passTask() {
this.$emit('passTask')
},
/*驳回审批*/
backTask() {
this.$emit('backTask')
},
handleSubmit(e) {
this.getAllTable().then(tables => {
return validateFormAndTables(this.form, tables)
}).then(allValues => {
console.log('所有数据', allValues)
if (typeof this.classifyIntoFormData !== 'function') {
throw this.throwNotFunction('classifyIntoFormData')
}
let formData = this.classifyIntoFormData(allValues)
formData.fileId = getStringArry(formData.fileId)
// if (formData.materialType === null || formData.materialType ==='' || formData.materialType === undefined){
// this.$message.error("物资类型不能为空")
// return;
// }
// if (formData.beAllotDepartment === null || formData.beAllotDepartment ==='' || formData.beAllotDepartment === undefined){
// this.$message.error("被调拨部门不能为空")
// return;
// }
this.form.validateFields((err, values) => {
if (!err) {
formData.procDefId = this.processData.id
formData.procDeTitle = this.processData.name
formData.title = this.processData.description
if (!formData.tableName) formData.tableName = this.processData.businessTable
console.log('格式化后的数据', formData)
var url = this.url.add
let method = 'post'
if (!this.isNew) {
url = this.url.edit
method = 'put'
}
console.log('提交方法', method)
this.btndisabled = true
httpAction(url, formData, method).then((res) => {
if (res.success) {
this.$message.success('保存成功!')
//todo 将表单的数据传给父组件
this.$emit('afterSubmit', formData)
} else {
this.$message.error(res.message)
}
}).finally(() => {
this.btndisabled = false
})
}
})
})
},
addBefore() {
this.form.resetFields()
this.processMaterialsAllotListTable.dataSource = []
},
getAllTable() {
let values = this.tableKeys.map(key => getRefPromise(this, key))
return Promise.all(values)
},
/** 调用完edit()方法之后会自动调用此方法 */
editAfter() {
if (this.data.id != null && this.data.id != '' && this.data.id != undefined && this.data.fileId != null && this.data.fileId != '') {
//1、文件回显
this.data = getRecord(this.data)
}
let fieldval = pick(this.data, 'id', 'company', 'createTime', 'sysOrgCode', 'createBy', 'materialType', 'beAllotDepartment', 'fileId')
this.$nextTick(() => {
this.form.setFieldsValue(fieldval)
})
// 加载子表数据
if (this.data.id) {
let params = { id: this.data.id }
this.requestSubTableData(this.url.processMaterialsAllotList.list, params, this.processMaterialsAllotListTable)
}
},
/** 整理成formData */
classifyIntoFormData(allValues) {
let main = Object.assign(this.model, allValues.formValue)
return {
...main, // 展开
processMaterialsAllotListList: allValues.tablesValue[0].values
}
},
//渲染流程表单数据
showFlowData() {
if (this.formBpm === true) {
let params = { id: this.formData.dataId }
getAction(this.url.queryById, params).then((res) => {
if (res.success) {
this.edit(res.result)
}
})
}
},
validateError(msg) {
this.$message.error(msg)
},
popupCallback(company, row) {
let res = JSON.parse(row)
console.log('获取我的数据', res.id)
let param = {}
param.createBy = res.username
param.company = company
param.sysOrgCode = res.departIds
param.createTime = getCurrentTime()
this.data = param
let fieldval = pick(this.data, 'createBy', 'company', 'sysOrgCode', 'createTime')
this.$nextTick(() => {
this.form.setFieldsValue(fieldval)
})
}
}
}
</script>
<style scoped>
.div_process {
margin-top: 30px;
}
</style>