yxk_gk_master/pages/dispatch/add.vue

689 lines
17 KiB
Vue
Raw Normal View History

2025-08-28 15:18:09 +08:00
<template>
<view class="container">
<view class="top_head">
<view class="top_head1">工序计划单号:{{ info.workOrderNo }}</view>
<view class="top_head2">
<span>产品名称:{{ info.materielName }}</span>|<span>规格型号:{{ info.specification }}</span>|<span>工序名:{{
info.processName }}</span>|<span>已派/待派/计划数量:{{ info.alreadyCount }}/{{ leftCount }}/{{
info.planCount }}</span>
</view>
</view>
<view class="content">
<view class="item_list" v-for="(items, index) in dataList" :key='index'>
<view class="select_out" @click="chooseUser(index)">
<span class="select_text" required v-if="items.operator">{{ items.operatorName }}</span>
<span class="select_text" required v-else-if="info.isOutsource == 0">选择操作工</span>
<span class="select_text" required v-else-if="info.isOutsource == 1">选择业务员</span>
<uni-icons type="arrowdown" size="26"></uni-icons>
</view>
<view class="select_out" @click="chooseDevice(index)" v-if="info.isOutsource == 0">
<span class="select_text" v-if="items.deviceId">{{ items.deviceName }}</span>
<span class="select_text" v-else>选择设备</span>
<uni-icons type="arrowdown" size="26"></uni-icons>
</view>
<view class="select_out" @click="chooseSpplier(index)" v-else-if="info.isOutsource == 1">
<span class="select_text" required v-if="items.supplierId">{{ items.spplierName }}</span>
<span class="select_text" required v-else>选择供应商</span>
<uni-icons type="arrowdown" size="26"></uni-icons>
</view>
<view class="input_out">
<span class="input_text" required>生产数量</span>
<input class="input_view" type="number" v-model="items.planCount" placeholder="请填写"
@change='toFixed1(index)' />
</view>
<view class="select_out">
<view class="date_text" required>计划开工日期</view>
<view class="date_value">
<span v-if="items.startTime">{{ items.startTime }}</span>
<span v-else>选择日期</span>
<uni-icons type="arrowdown" size="20" class="date_arrowdown"></uni-icons>
</view>
<picker class="picker_date" mode="date" :value="items.startTime" :start="startDate"
@change="bindStartDateChange($event, index)">
</picker>
</view>
<view class="select_out">
<view class="date_text" required>计划完工日期</view>
<view class="date_value">
<span v-if="items.endTime">{{ items.endTime }}</span>
<span v-else>选择日期</span>
<uni-icons type="arrowdown" size="20" class="date_arrowdown"></uni-icons>
</view>
<picker class="picker_date" mode="date" :value="items.endTime" :start="startDate"
@change="bindEndDateChange($event, index)">
</picker>
</view>
<view class="input_out">
<span class="input_text">备注</span>
<input class="input_view" type="text" v-model="items.remark" placeholder="请填写" />
</view>
<uni-icons type="minus-filled" size="30" class="delete_icon" color="#ff5151"
@click="deletData(index)"></uni-icons>
</view>
<uni-icons type="plus" size="35" class="plus_icon" color="#2b6ab9" @click="addData"></uni-icons>
</view>
<view class="bottom_btn_container">
<view class="bottom_btn_out">
<view class="bottom_btn" @click="toBack">取消</view>
<!-- <view class="bottom_btn" style="background-color: #eae68bdb;">暂存</view> -->
<!-- <view class="bottom_btn" @click="submit">提交</view> -->
<button class="bottom_btn" @click="submit" :disabled="isDisabled">提交</button>
</view>
</view>
<!-- 选择操作工 -->
<chooseUserMulti v-if="chooseUserVisible" @change="getUser"></chooseUserMulti>
<!-- 选择设备 -->
<chooseDeviceSingle v-if="chooseDeviceVisible" @change="getDevice" :device_type='device_type'>
</chooseDeviceSingle>
<!-- 选择供应商 -->
<chooseSpplierSingle v-if="chooseSpplierVisible" @change="getSpplier"></chooseSpplierSingle>
</view>
</template>
<script>
import uniIcons from '@/components/uni-icons/uni-icons.vue'
import chooseUserMulti from '@/components/system/chooseUserMulti.vue'
import chooseDeviceSingle from '@/components/system/chooseDeviceSingle.vue'
import chooseSpplierSingle from '@/components/system/chooseSpplier.vue'
export default {
components: {
uniIcons,
chooseUserMulti,
chooseDeviceSingle,
chooseSpplierSingle
},
data() {
return {
targetList: [],
device_type: '',
chooseUserVisible: false,
chooseDeviceVisible: false,
chooseSpplierVisible: false,
isDisabled: false,
currentIndex: 0,
id: "",
deptId: "",
info: {},
leftCount: "",
planStartTime: '',
planEndTime: '',
planCount: '',
dataList: [
// {
// operator: "",
// operatorName: "",
// planCount:"",
// },
],
}
},
computed: {
startDate() {
return this.getDate('start');
},
endDate() {
return this.getDate('end');
}
},
onLoad: function(option) {
const id = JSON.parse(decodeURIComponent(option.id));
this.id = id;
this.getInfo();
},
mounted() {
let _this = this;
uni.getStorage({
key: 'userInfo',
success: function(res) {
_this.deptId = res.data.deptId
},
fail: function(res) {
uni.redirectTo({
url: '../login/login'
});
}
});
},
methods: {
toFixed1(index) {
this.$set(this.dataList[index], 'planCount', Number(this.dataList[index].planCount).toFixed(this.info.quantityAccuracy))
},
//获取基础信息
getInfo() {
this.$http.request({
url: '/apis/mes/dispatch/sendButton',
method: 'post',
params: {
planItemId: this.id
},
}).then(res => {
if (res) {
if (res.data.code == 0) {
this.info = res.data;
this.leftCount = res.data.planCount - res.data.alreadyCount;
this.device_type = res.data.deviceType ? res.data.deviceType : '';
this.planCount = res.data.planCount ? res.data.planCount : '';
this.planStartTime = res.data.planStartTime ? res.data.planStartTime : '';
this.planEndTime = res.data.planEndTime ? res.data.planEndTime : ''
}
}
});
},
getDate(type) {
const date = new Date();
let year = date.getFullYear();
let month = date.getMonth() + 1;
let day = date.getDate();
if (type === 'start') {
year = year - 60;
} else if (type === 'end') {
year = year + 2;
}
month = month > 9 ? month : '0' + month;;
day = day > 9 ? day : '0' + day;
return `${year}-${month}-${day}`;
},
//选择开始日期
bindStartDateChange: function(e, index) {
this.currentIndex = index;
this.$set(this.dataList[this.currentIndex], "startTime", e.target.value)
},
//选择完成日期
bindEndDateChange: function(e, index) {
this.currentIndex = index;
this.$set(this.dataList[this.currentIndex], "endTime", e.target.value)
},
//添加派工
addData() {
let j = {
startTime: this.planStartTime.substr(0, 10),
endTime: this.planEndTime.substr(0, 10),
planCount: this.leftCount
}
this.dataList.push(j)
},
//删除派工
deletData(index) {
let _this = this;
uni.showModal({
title: '',
content: '确定删除吗?',
success: function(res) {
if (res.confirm) {
_this.dataList.splice(index, 1)
} else if (res.cancel) {}
}
});
},
getUser(val) {
this.chooseUserVisible = false
if (val) {
let nameArr = []
let idArr = []
val.forEach(item => {
nameArr.push(item.NAME)
idArr.push(item.userId)
})
this.$set(this.dataList[this.currentIndex], "operator", idArr.toString())
this.$set(this.dataList[this.currentIndex], "operatorName", nameArr.toString())
}
},
getDevice(val) {
this.chooseDeviceVisible = false;
if (val) {
this.$set(this.dataList[this.currentIndex], "deviceId", val.id)
this.$set(this.dataList[this.currentIndex], "deviceName", val.name)
}
},
getSpplier(val) {
this.chooseSpplierVisible = false;
if (val) {
this.$set(this.dataList[this.currentIndex], "supplierId", val.id)
this.$set(this.dataList[this.currentIndex], "spplierName", val.unit_name)
}
},
//选择操作工
chooseUser(index) {
this.currentIndex = index,
this.chooseUserVisible = true;
},
//选择设备
chooseDevice(index) {
this.currentIndex = index,
this.chooseDeviceVisible = true;
},
//选择供应商
chooseSpplier(index) {
this.currentIndex = index,
this.chooseSpplierVisible = true;
},
//取消
toBack() {
uni.navigateBack()
},
//提交
submit() {
let flag = true;
if (this.dataList.length == 0) {
uni.showToast({
title: '请先添加派工再提交',
icon: "none",
duration: 2000
});
flag = false;
} else {
this.dataList.forEach(item => {
//验证操作工必填
if (item.operator == undefined) {
let text = this.info.isOutsource == 1 ? "请选择业务员" : "请选择操作工"
uni.showToast({
title: text,
icon: "none",
duration: 2000
});
flag = false;
return
}
//验证(供应商)必填
if (item.supplierId == undefined && this.info.isOutsource == 1) {
uni.showToast({
title: '请选择供应商',
icon: "none",
duration: 2000
});
flag = false;
return
}
//验证生产数量必填且大于0
if (item.planCount == undefined) {
uni.showToast({
title: '请填写生产数量',
icon: "none",
duration: 2000
});
flag = false;
return false
} else {
// let reg_positive_integer = /^[1-9]*[1-9][0-9]*$/;//验证正整数
// if(!reg_positive_integer.test(item.planCount)){
// uni.showToast({
// title: '生产数量为大于0的整数',
// icon:"none",
// duration: 2000
// });
// flag=false;
// return
// }
if (item.planCount <= 0) {
uni.showToast({
title: '生产数量要大于0',
icon: "none",
duration: 2000
});
flag = false;
return
}
}
//验证计划开工时间必填
if (item.startTime == undefined) {
uni.showToast({
title: '请选择计划开工日期',
icon: "none",
duration: 2000
});
flag = false;
return
}
//验证计划完工时间必填
if (item.endTime == undefined) {
uni.showToast({
title: '请选择计划完工日期',
icon: "none",
duration: 2000
});
flag = false;
return
}
})
//验证生产数量总数不能大于待派数量
if (!flag) {
return
}
let num = 0;
this.dataList.forEach(item => {
num = parseInt(num) + parseInt(item.planCount)
})
if (num > this.leftCount) {
uni.showToast({
title: '生产总数量不能大于待派数量',
icon: "none",
duration: 2000
});
return
}
if (this.isDisabled) {
return
}
this.isDisabled = true
this.$http.request({
url: '/apis/mes/dispatch/submitDispatchDetail',
method: 'post',
params: {
planItemId: this.id,
dispatchDetal: encodeURIComponent(JSON.stringify(this.dataList))
},
}).then(res => {
if (res) {
let _this = this;
if (res.data.code == 0) {
setTimeout(function() {
uni.navigateTo({
url: '/pages/dispatch/index'
});
// _this.$router.replace({ path: "/pages/dispatch/index" });
uni.showToast({
title: '提交成功',
icon: "none",
duration: 2000
});
}, 0)
this.isDisabled = false
} else {
this.isDisabled = false
uni.showToast({
title: res.data.msg ? res.data.msg : '提交失败',
icon: "none",
duration: 2000
});
}
}
});
}
}
}
}
</script>
<style scoped>
>>>.dialog_out .search_text uni-input {
position: relative;
float: left;
margin-right: 15px;
/* width: 150px; */
height: 30px;
line-height: 30px;
border: 1px solid #d4d4d4;
border-radius: 2px;
padding: 0 4px;
box-sizing: border-box;
}
>>>.select-tab .select-tab-item uni-text,
>>>.select-tab-fixed-top .select-tab-item uni-text {
font-size: 16px !important;
}
.container {
position: absolute;
width: 100%;
height: 100%;
background-color: #f3f3f3;
box-sizing: border-box;
}
.top_head {
position: fixed;
top: var(-window-top);
width: 100%;
height: 60px;
background-color: #007AFF;
color: #fff;
padding-left: 20px;
box-sizing: border-box;
padding-top: 10px;
z-index: 1;
}
.top_head1 {
font-size: 15px;
line-height: 19px;
}
.top_head2 {
font-size: 14px;
line-height: 20px;
}
.top_head2 span {
margin: 0 10px;
}
.top_head2 span:first-child {
margin-left: 0;
}
.content {
/* position: relative; */
height: 100%;
width: 100%;
padding: 20px;
padding-top: 80px;
padding-bottom: 90px;
/* max-height: 100%; */
overflow: auto;
box-sizing: border-box;
}
.item_list {
position: relative;
width: 100%;
height: calc((100% - 128px) / 8);
display: flex;
justify-content: space-around;
align-items: center;
margin-bottom: 16px;
}
.select_out {
position: relative;
width: calc((100% - 90px - 30px) / 6);
height: 100%;
line-height: calc((100% - 128px) / 8);
border: 1px solid #a0a0a0;
border-radius: 5px;
font-size: 14px;
/* padding-right: calc((100% -15px * 6 - 25px) / 5 / 7 ); */
padding-right: 10px;
box-sizing: border-box;
text-align: right;
color: #333;
white-space: nowrap;
overflow: hidden;
}
.input_out {
position: relative;
width: 15% !important;
/* width: calc((100% -15px * 6 - 25px) / 6); */
height: 100%;
line-height: 34px;
font-size: 14px;
border-radius: 5px;
padding: 0 10px;
background-color: #d3dfef;
box-sizing: border-box;
color: #333;
}
.uni-icon-arrowdown {
position: absolute;
right: 30px;
height: 26px;
top: 0;
bottom: 0;
margin: auto;
color: #8a8989;
}
.select_text {
position: absolute;
margin: auto;
top: 0;
bottom: 0px;
display: block;
align-items: center;
justify-content: center;
width: calc(100% - 50px);
height: 16px;
font-size: 16px;
line-height: 16px;
padding-left: 4px;
box-sizing: border-box;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
text-align: center;
}
.select_text[required]:before {
position: relative;
content: "*";
color: red;
left: 0;
top: 0;
}
.input_text {
position: absolute;
margin: auto;
top: 0;
bottom: 0px;
display: block;
height: 16px;
font-size: 16px;
line-height: 16px;
}
.input_text[required]:before {
position: relative;
content: "*";
color: red;
left: 0;
top: 0;
}
.input_view {
position: absolute;
width: 200rpx;
right: 10px;
height: 70%;
top: 15%;
left: 100px;
box-sizing: border-box;
font-size: 14px;
background-color: #f3f3f3;
}
.date_text {
height: 50%;
width: 100%;
text-align: center;
font-size: 13px;
line-height: 13px;
display: flex;
align-items: center;
justify-content: center;
}
.date_text[required]:before {
position: relative;
content: "*";
color: red;
left: 0;
top: 0;
}
.date_value {
position: relative;
width: 100%;
height: 50%;
font-size: 13px;
line-height: 13px;
display: flex;
align-items: center;
justify-content: center;
}
.date_arrowdown {
font-weight: bold;
margin-left: 10px;
right: 20px;
}
.picker_date {
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
}
.plus_icon {
margin: auto;
display: flex;
justify-content: center;
font-weight: bold;
width: 50px;
}
.bottom_btn_container {
position: fixed;
bottom: 0;
width: 100%;
left: 0;
height: 70px;
background-color: #dadada;
}
.bottom_btn_out {
position: relative;
display: flex;
justify-content: center;
align-items: center;
}
.bottom_btn {
position: relative;
margin: 0 10px;
/* width: 30%; */
width: 30%;
height: 60px;
line-height: 60px;
text-align: center;
font-size: 25px;
color: #333;
top: 5px;
letter-spacing: 4px;
border-radius: 4px;
}
.bottom_btn:nth-child(1) {
background-color: #fff;
border: 2px solid #007AFF;
color: #007AFF;
box-sizing: border-box;
/* box-shadow: 3px 3px 10px rgba(160, 160, 159,0.2) inset,-3px -3px 10px rgba(160, 160, 159,0.2) inset; */
}
.bottom_btn:nth-child(2) {
color: #fff;
background-color: #007AFF;
/* box-shadow: 3px 3px 10px rgba(16, 36, 177,0.2) inset,-3px -3px 10px rgba(16, 36, 177,0.2) inset; */
}
</style>