bonus-material-app/src/pages/materialsStation/toolsBack/toolsAddBack.vue

565 lines
16 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<uni-nav-bar dark :fixed="true" shadow background-color="#4AA4EA" status-bar :title="title"
><template v-slot:left>
<view style="font-size: 18px; display: flex; align-items: center" @click="back">
<!-- 图标 -->
<uni-icons type="left" size="20" color="#fff"></uni-icons>
<!-- 文本 -->
<text>返回</text>
</view>
</template>
<template v-slot:right>
<view style="font-size: 18px; display: flex; align-items: center" @click="submit(0)">
<!-- 文本 -->
<text>暂存</text>
</view>
</template>
</uni-nav-bar>
<div class="content">
<uni-section title="任务信息" type="line"></uni-section>
<uni-forms ref="form" :rules="rules" :model="formData" label-width="80px">
<uni-forms-item label="工程名称" required name="projectId">
<uni-data-select
v-if="!opts.isEdit"
v-model="formData.projectId"
:localdata="prodRange"
:clear="false"
filterable
:disabled="opts.isEdit"
@change="changeProd"
></uni-data-select>
<uni-easyinput v-else v-model="formData.proName" disabled></uni-easyinput>
</uni-forms-item>
<uni-forms-item label="退料班组" required name="teamId">
<uni-data-select
v-if="!opts.isEdit"
v-model="formData.teamId"
:localdata="teamRange"
:clear="false"
filterable
:disabled="opts.isEdit"
@change="changeTeamd"
></uni-data-select>
<uni-easyinput v-else v-model="formData.teamName" disabled></uni-easyinput>
</uni-forms-item>
<uni-forms-item label="退料人员" required name="backPerson">
<uni-easyinput
v-model="formData.backPerson"
placeholder="请输入内容"
disabled
></uni-easyinput>
</uni-forms-item>
<uni-forms-item label="联系电话" name="phone">
<uni-easyinput
v-model="formData.phone"
placeholder="请输入内容"
maxlength="11"
@blur="checkPhone"
></uni-easyinput>
</uni-forms-item>
<uni-forms-item label="备注" name="remark">
<uni-easyinput
v-model="formData.remark"
placeholder="请输入内容"
maxlength="200"
></uni-easyinput>
</uni-forms-item>
<uni-section title="工器具退料" type="line"></uni-section>
<eselect
v-model="equipmentId"
style="width: 100%; height: 90rpx; margin: 10px 0"
ref="treeSelect"
:options="equipmentList"
:disabled="!formData.teamId || !formData.projectId"
@change="changeEquipment"
></eselect>
</uni-forms>
<uni-table ref="table" border stripe emptyText="暂无更多数据">
<uni-tr>
<uni-th width="60" align="center">序号</uni-th>
<uni-th width="140" align="center">类型名称</uni-th>
<uni-th width="140" align="center">规格型号</uni-th>
<uni-th width="80" align="center">在用数</uni-th>
<uni-th width="120" align="center">退料数</uni-th>
<uni-th width="120" align="center">损坏价值判定</uni-th>
<uni-th width="90" align="center">操作</uni-th>
</uni-tr>
<uni-tr v-for="(item, index) in tableData" :key="index">
<uni-td align="center">{{ index + 1 }}</uni-td>
<uni-td align="center">{{ item.maTypeName }}</uni-td>
<uni-td align="center">
<view class="name">{{ item.typeName }}</view>
</uni-td>
<uni-td align="center">{{ item.num }}</uni-td>
<uni-td align="center">
<uni-easyinput
v-if="item.manageType == 1"
v-model="item.preNum"
placeholder="请输入数量"
type="number"
@change="checkPerNum(item)"
></uni-easyinput>
<!-- 编码 -->
<span v-else style="color: #409eff" @click="getCode(item)">{{
item.maCodeList.length == 0 ? '选择编码' : item.maCodeList.length
}}</span>
</uni-td>
<uni-td align="center"
><uni-easyinput v-model="item.apDetection" placeholder="请输入内容"></uni-easyinput
></uni-td>
<uni-td align="center">
<button
class="uni-button"
size="mini"
type="warn"
@click="
() => {
tableData.splice(index, 1)
}
"
>
删除
</button>
</uni-td>
</uni-tr>
</uni-table>
<button style="width: 100%; margin: 50px 0" type="primary" @click="submit(1)"> </button>
</div>
</template>
<script setup>
import { onLoad, onShow, onBackPress } from '@dcloudio/uni-app'
import { ref, reactive } from 'vue'
import eselect from '@/pages/materialsStation/toolsLease/components/eselect.vue'
import {
getTeamListApi,
getProjectList,
backTask,
editBackTask,
getAgreementInfoByIdBackApi,
detailsBackTask,
getUseTypeTree,
} from '@/services/materialsStation'
const title = ref('工器具退料申请')
const opts = ref({})
const form = ref()
const formData = reactive({
teamId: undefined,
projectId: '',
backPerson: '',
phone: '',
agreementIds:[],
remark: undefined,
isBack: 1,
remark: '',
})
const agreementIds = ref('')
const equipmentId = ref()
const teamRange = ref([]) // 班组
const prodRange = ref([]) // 工程
const equipmentList = ref([]) // 工器具
const rules = {
teamId: {
rules: [{ required: true, errorMessage: '请选择班组' }],
},
projectId: {
rules: [{ required: true, errorMessage: '请选择工程' }],
},
backPerson: {
rules: [{ required: true, errorMessage: '请填写退料人' }],
},
}
const tableData = ref([])
// 编辑获取详情
const getDetailsById = async () => {
try {
const res = await detailsBackTask(opts.value.id)
console.log('🚀 ~ getDetailsById ~ res:', res)
res.data.backApplyInfo.projectId = res.data.backApplyInfo.proId
if (res.data && res.data.backApplyDetailsList && res.data.backApplyDetailsList.length > 0) {
tableData.value = res.data.backApplyDetailsList.map((item) => {
return {
...item,
maTypeName: item.materialName, // 显示类型名称
}
})
}
Object.assign(formData, res.data.backApplyInfo)
console.log('🚀 ~ getDetailsById ~ formData:', formData)
getAgreement()
} catch (error) {
console.log('🚀 ~ getDetailsById ~ error:', error)
}
}
// 获取班组
const getTeamList = async () => {
try {
const res = await getTeamListApi({ isAll: 0, proId: formData.projectId })
// teamRange.value = res.data
if (res.data.length > 0) {
teamRange.value = res.data.map((item) => {
return {
...item,
value: item.id,
text: item.teamName,
}
})
// getProjectListApi()
}
} catch (error) {
console.log('🚀 ~ getTeamList ~ error:', error)
}
}
// 获取工程
const getProjectListApi = async () => {
console.log('🚀 ~ 工程')
try {
const res = await getProjectList({ unitId: null, isApp: true, teamId: formData.teamId })
if (!res.data || !res.data.length) return
console.log('🚀 ~ getProjectListApi ~ res:', res)
prodRange.value = res.data.map((item) => {
return {
...item,
value: item.proId,
text: item.proName,
}
})
} catch (error) {
console.log('🚀 ~ getProjectListApi ~ error:', error)
}
}
//协议
const getAgreement = () => {
console.log(formData.teamId, formData.projectId)
let obj = {
teamId: formData.teamId,
projectId: formData.projectId,
}
getAgreementInfoByIdBackApi(obj)
.then((res) => {
console.log(res)
if (res.code == 200 && res.data && res.data.length>0) {
agreementIds.value = res.data.map(item => item.agreementId)
formData.agreementIds = res.data.map(item => item.agreementId)
getEquipmentList()
} else {
agreementIds.value = ''
formData.agreementIds = ''
}
})
.catch((error) => {
formData.agreementIds = ''
console.log(error)
})
}
// 获取工具器
const getEquipmentList = async () => {
try {
let obj = {
agreementIds: agreementIds.value,
}
const res = await getUseTypeTree(obj)
// machineList.value = res.data
if (res.data.length > 0) {
equipmentList.value = formatEquipmentTree(res.data)
console.log('🚀 ~ getEquipmentList ~ machineList.value:', equipmentList.value)
}
} catch (error) {
console.log('🚀 ~ getMachineListApi ~ error:', error)
}
}
function formatEquipmentTree(list) {
return list.map((item) => {
const newItem = {
...item,
id: item.typeId,
name: item.typeName,
}
if (item.children && item.children.length > 0) {
newItem.children = formatEquipmentTree(item.children)
}
return newItem
})
}
// 校验电话
const checkPhone = (rule, value, callback) => {
// if (!formData.phone) {
// uni.showToast({
// icon: 'none',
// title: '请输入电话号码',
// })
// return false
// }
if (!/^1[3-9][0-9]{9}$/.test(formData.phone)) {
uni.showToast({
icon: 'none',
title: '请输入正确的电话号码',
})
// 清空
formData.phone = ''
return false
}
return true
}
// 检查数量
const checkPerNum = (item) => {
if (item.unitValue == 1) {
item.preNum = Number(String(item.preNum).replace(/[^\d.]/g, ''))
} else {
item.preNum = Number(String(item.preNum).replace(/[^\d]/g, ''))
}
// 大于1的正整数 正则校验
// if (!/^[1-9]\d*$/.test(item.preNum)) {
// uni.showToast({
// icon: 'none',
// title: '请输入正确的数量',
// })
// // 重置为1
// item.preNum = 1
// return false
// }
}
// 选择班组
const changeTeamd = (e) => {
console.log('🚀 ~ changeTeamd ~ e:', e)
const team = teamRange.value.find((item) => item.id === e)
console.log('🚀 ~ changeTeamd ~ team:', team)
// formData.projectId = null
formData.teamName = team ? team.teamName : ''
formData.backPerson = team ? team.relName : ''
formData.phone = team ? team.relPhone : ''
formData.relName = team ? team.relName : ''
formData.teamId = e
// getProjectListApi()
getAgreement()
}
// 选择工程
const changeProd = (e) => {
console.log('🚀 ~ changeProd ~ e:', e)
formData.projectId = e
getTeamList()
}
// 选择工器具
const changeEquipment = (e) => {
console.log('🚀 ~ changeEquipment ~ e:', e)
if (tableData.value.some((item) => item.typeId === e.typeId)) {
uni.showToast({
icon: 'none',
title: '该型号已添加',
})
return
}
// 从 equipmentList.value 中获取点击id的上一级的 typeName
const equipment = findEquipmentById(equipmentList.value, e.parentId)
tableData.value.unshift({
...JSON.parse(JSON.stringify(e)),
maTypeName: equipment.typeName,
preNum: e.manageType == '1' ? 1 : 0, // 如果是数量设备默认退料数为1
maCodeList: [],
})
setTimeout(() => {
equipmentId.value = ''
}, 300)
console.log('xxxxxxxxxxxxxxxxx:', tableData.value)
}
// 递归查找指定 id 的节点
function findEquipmentById(list, id) {
for (const item of list) {
if (item.id === id) {
return item
}
if (item.children && item.children.length > 0) {
const found = findEquipmentById(item.children, id)
if (found) return found
}
}
return null
}
// 获取编码
const getCode = (item) => {
console.log('🚀 ~ getCode ~ item:', item)
if (item.maCodeList.length > 0) {
item.maCodeList.forEach((code) => {
code.checked = true
})
}
item.isEdit = opts.value.isEdit
item.isBack = true
item.teamId = formData.teamId
item.projectId = formData.projectId
uni.navigateTo({
url: '/pages/materialsStation/toolsLease/codeOut?params=' + JSON.stringify(item),
})
}
const submit = (isBack) => {
console.log('🚀 ~ submit ~ submit:', formData)
// 校验表单
form.value
.validate()
.then(async (valid) => {
formData.isBack = isBack
formData.createBy = uni.getStorageSync('username') || ''
console.log('🚀 ~ form.value.validate.then ~ valid:', valid)
if (tableData.value.length === 0) {
await uni.showToast({
title: '请添加退料数据',
icon: 'none',
duration: 1000,
})
return
}
// tableData.value 循环 preNum 不能小于 0, 小于0的提示到具体行
for (let i = 0; i < tableData.value.length; i++) {
console.log('🚀yyyyyyyyyyyyyyyyyyy:', tableData.value[i].unitValue)
if (tableData.value[i].preNum < 1 && tableData.value[i].unitValue == 0 ) {
await uni.showToast({
title: `${i + 1}行退料数量不能为0`,
icon: 'none',
duration: 1000,
})
return
}else if(tableData.value[i].preNum <= 0 && tableData.value[i].unitValue == 1){
await uni.showToast({
title: `${i + 1}行退料数量不能为0`,
icon: 'none',
duration: 1000,
})
}else if (tableData.value[i].preNum > tableData.value[i].num) {
await uni.showToast({
title: `${i + 1}行退料数量不能大于在用数量`,
icon: 'none',
duration: 1000,
})
return
}
}
const res = await uni.showModal({
title: '提示',
content: '是否确认提交?',
confirmText: '确定',
cancelText: '取消',
})
console.log('🚀 ~ .then ~ res:', res)
if (!res.confirm) return
tableData.value.forEach((item) => {
item.outNum = item.preNum
})
const params = {
backApplyDetailsList: tableData.value,
backApplyInfo: formData,
}
console.log('🚀 yyyyyyyyyyy:', params)
uni.showLoading({
title: '提交中...',
})
try {
let res = null
if (!opts.value.isEdit) {
console.log('🚀 ~ .then ~ 新增:')
res = await backTask(params)
} else {
console.log('🚀 ~ .then ~ 编辑:')
res = await editBackTask(params)
}
console.log('🚀 ~ .then ~ res:', res)
tableData.value = []
uni.hideLoading()
back()
} catch (error) {
console.log('🚀 ~ .then ~ error:', error)
uni.hideLoading()
}
})
.catch((err) => {
console.log('🚀 ~ form.value.validate.catch ~ err:', err)
})
}
const back = () => {
if (tableData.value.length > 0) {
uni
.showModal({
title: '提示',
content: '当前有未提交的数据,是否暂存?',
confirmText: '确定',
cancelText: '取消',
})
.then((res) => {
if (res.confirm) {
submit(0)
} else {
uni.navigateBack({
delta: 1,
})
}
})
} else {
uni.navigateBack({
delta: 1,
})
}
}
onLoad((opt) => {
console.log('onLoad', opt)
opts.value = opt.params ? JSON.parse(opt.params) : {}
title.value = opts.value.isEdit ? '编辑工器具退料' : '新增工器具退料'
if (opts.value.isEdit) {
getDetailsById()
} else {
// getTeamList()
getProjectListApi()
}
})
onShow(() => {
console.log('onShow')
// 监听添加编码
uni.$on('maCodeList', (data) => {
console.log('🚀 ~ onShow ~ data:', data)
const item = tableData.value.find((item) => item.typeId == data[0].typeId)
console.log('🚀 ~ onShow ~ item:', item)
if (item) {
item.maCodeList = data
item.preNum = data.length
}
})
console.log('🚀 ~ onShow ~ tableData.value:', tableData.value)
})
onBackPress((opt) => {
console.log('🚀 ~ onBackPress ~ opt:', opt)
if (opt.from == 'backbutton') {
if (tableData.value.length > 0) {
// 仅提示数据未提交
uni.showToast({
title: '当前有未提交数据, 请暂存或提交',
icon: 'none',
duration: 1000,
})
return true
}
} else {
return false
}
})
</script>
<style lang="scss" scoped>
.content {
padding: 10px;
background-color: #fafafa;
}
.col {
display: flex;
align-items: center;
margin-bottom: 15px;
}
</style>