ckgl/pages/documentary/ex-factory.vue
2025-01-14 17:26:18 +08:00

315 lines
9.0 KiB
Vue

<script setup lang="ts">
import { onLoad } from '@dcloudio/uni-app';
import { showToast } from 'vant';
import { ref } from 'vue';
import { getAction, postAction, uploadAction } from '../../common/http';
import { formatDate } from '../../utils/date';
// 定义 props
defineProps<{
item ?: string;
}>();
const itemList = ref()
const processes = ref({} as any)
const list = ref([] as any[])
const form = ref({ czrq: formatDate(new Date()), yjxybrq: formatDate(new Date()) } as any)
const history = ref([] as any[])
onLoad(async (option : any) => {
if (option) {
try {
itemList.value = JSON.parse(option.item)
if (itemList.value.sd === '门店' && !itemList.value.processes) {
let res : any = await getAction('/flowBind')
if (res.code === 200) {
let item = res.data.find((l : any) => l.craftName === itemList.value.craft)
let item2 = item.flows.find((l : any) => l.bind === "仅现货")
if (item2) {
let url = '/craftFlows/byName?name=' + item2.name
let res1 : any = await getAction(url)
if (res1.code === 200) {
processes.value = res1.data
} else {
showToast('暂无此工艺!')
}
} else {
showToast('暂无此工艺!')
}
}
} else {
processes.value = itemList.value.processes
}
getAction('/tracking/getLog?id=' + itemList.value.id).then((res : any) => {
if (res.code === 200) {
processes.value.processes.forEach((m : any) => {
if (!m.id) {
let a = res.data.find((l : any) => l.details.zt == m.name)
if (a) {
m.rq = a.details.form.czrq
res.data = res.data.concat(a.details.trackingLog)
}
}
})
processes.value.processes.forEach((m : any) => {
let a = res.data.find((l : any) => l.details.zt == m.name)
if (a) {
m.rq = a.details.form.czrq
history.value=history.value.concat(a.details.list)
}
})
let b = res.data.find((l : any) => l.trackingLogId == itemList.value.id && l.details.zt === '待出厂')
processes.value.processes[processes.value.processes.length - 1].rq = b.details.form.czrq
history.value=history.value.concat(b.details.list)
history.value.map((l:any)=>{
if(l.pic){
l.pic=[{url:l.pic}]
}
})
}
})
postAction('/craftComment/getByIds',itemList.value.craftCmt.value).then((res:any)=>{
if(res.code===200){
res.data.forEach((l:any)=>{
list.value=list.value.concat(l.content)
})
}
})
} catch (error) {
console.error('Failed to parse item JSON:', error);
// 可以选择在这里显示错误消息给用户
}
}
})
const onClickLeft = () => {
window.history.back();
}
//选择框事件
const show = ref(false)
const dataType = ref()
const chooseDate = (val : any) => {
dataType.value = val
show.value = true
}
//日期选择
const onConfirmDate = (val : any) => {
form.value[dataType.value] = formatDate(val)
show.value = false
}
const showPicker = ref(false)
const popuList = ref([] as any[])
const indexType = ref()
//选择框事件
const choosePic = (index : any) => {
indexType.value = index
showPicker.value = true
}
//选择框确认
const pickerConfirm = (val : any) => {
list.value[indexType.value].value = val.selectedValues[0]
showPickerCancel()
}
//取消
const showPickerCancel = () => {
showPicker.value = false
}
//弹窗开启事件
const handleOpen = () => {
popuList.value = list.value[indexType.value].chooses.map((l : any) => ({ text: l.value, value: l.value }))
}
//提交
const onSubmit = () => {
let data = {
subId: itemList.value.subId,
trackingLogId: itemList.value.id,
details: {
zt: '已出厂',
list: list.value,
},
}
postAction('/tracking', data).then((res : any) => {
if (res.code === 200) {
showToast('提交成功!')
window.history.back()
}
})
}
const fileList = ref([] as any[])
const afterRead = (file : any) => {
file.status = 'uploading';
file.message = '上传中...';
uploadAction('/upload', file.file).then((res : any) => {
if (res.code === 200) {
file.status = 'success';
file.message = '成功!';
list.value[indexType.value].pic = res.data
}
})
};
</script>
<template>
<view class="flex">
<van-nav-bar title="工序详情" left-text="返回" left-arrow @click-left="onClickLeft" />
<view class="content">
<van-cell-group inset>
<van-field v-model="itemList.craft" name="工艺名称" label="工艺名称" colon label-width="5em" readonly />
<van-field v-model="itemList.craftCmt.name" name="工艺要求" label="工艺要求" colon label-width="5em" readonly />
<van-field v-model="itemList.innerComment" name="内部备注" label="内部备注" colon label-width="5em" readonly />
<van-field name="工艺流程" label="工艺流程" colon label-width="5em" readonly />
<view class="grid-container">
<view class="grid-item" v-for="(item,index) in processes.processes" :key="index">
<view :class="item.id?'btn1':'btn2'">{{item.name}}</view>
<p>{{item.rq}}</p>
</view>
</view>
</van-cell-group>
<van-cell-group inset>
<view v-for="(item,index) in history" :key="index">
<template v-if="item.type==='Select'">
<van-field v-model="item.value" :name="item.name" :label="item.name" colon class="bor"
label-width="5em" readonly
:rules="item.necessary?[{ required: true, message: '请选择' }]:[]"
/>
</template>
<template v-if="item.type==='Input'">
<van-field v-model="item.value" v-if="item.contentType.find(l=>l=='Text')" :name="item.name"
:label="item.name" colon class="bor-n" label-width="5em" readonly
:rules="item.necessary?[{ required: true, message: '请填写' }]:[]" />
<van-field name="uploader" v-if="item.contentType.find(l=>l=='File')" :label="item.name"
label-width="5em" colon :rules="item.necessary?[{ required: true, message: '请上传' }]:[]">
<template #input>
<van-uploader v-model="item.pic" multiple :max-count="1" readonly :deletable="false"/>
</template>
</van-field>
</template>
</view>
</van-cell-group>
<van-form @submit="onSubmit">
<van-cell-group inset>
<view v-for="(item,index) in list" :key="index">
<template v-if="item.type==='Select'">
<van-field v-model="item.value" :name="item.name" :label="item.name" colon class="bor"
label-width="5em" readonly
:rules="item.necessary?[{ required: true, message: '请选择' }]:[]"
@click="choosePic(index)" />
</template>
<template v-if="item.type==='Input'">
<van-field v-model="item.value" v-if="item.blank.find(l=>l=='Text')" :name="item.name"
:label="item.name" colon class="bor-n" label-width="5em"
:rules="item.necessary?[{ required: true, message: '请填写' }]:[]" />
<van-field name="uploader" v-if="item.blank.find(l=>l=='File')" :label="item.name"
label-width="5em" colon :rules="item.necessary?[{ required: true, message: '请上传' }]:[]">
<template #input>
<van-uploader v-model="fileList" multiple :max-count="1" :after-read="afterRead"
@click="indexType=index" />
</template>
</van-field>
</template>
</view>
</van-cell-group>
<view style="margin: 32rpx;">
<van-button round block type="primary" native-type="submit">
出厂
</van-button>
</view>
</van-form>
</view>
</view>
<!--选择框-->
<van-popup v-model:show="showPicker" round position="bottom" @open="handleOpen">
<van-picker show-toolbar :columns="popuList" @confirm="pickerConfirm" @cancel="showPickerCancel"
ref="pickerRef" />
</van-popup>
<van-calendar v-model:show="show" @confirm="onConfirmDate" :min-date="new Date(2025, 0, 1)" />
</template>
<style lang="scss" scoped>
.flex {
display: flex;
flex-direction: column;
height: 100vh;
width: 100vw;
overflow-y: hidden;
.van-nav-bar {
width: 100%;
}
.grid-container {
display: grid;
align-items: top;
grid-template-columns: 1fr 1fr 1fr;
padding: 10rpx 15rpx;
.grid-item {
display: flex;
flex-direction: column;
text-align: center;
align-items: center;
margin-top: 10rpx;
}
}
.btn2 {
border: 1rpx solid red;
padding: 10rpx 30rpx;
border-radius: 10rpx;
background-color: red;
color: #fff;
}
.btn1 {
border: 1rpx solid #169bd5;
padding: 10rpx 30rpx;
border-radius: 10rpx;
background-color: #169bd5;
color: #fff;
}
.content {
flex: 1;
overflow-y: scroll;
font-size: 16px;
}
}
.bor {
::v-deep .van-field__control {
border: 1px solid #d7d7d7;
text-align: center;
}
}
.bor-n {
::v-deep .van-field__control {
border-bottom: 1px solid #d7d7d7;
text-align: center;
}
}
::v-deep .van-cell {
padding: 5px !important;
}
::v-deep .van-field {
font-size: 16px;
}
::v-deep .van-field__control {
font-size: 16px;
}
.footer-button {
margin: 20px;
display: flex;
justify-content: space-around;
}
</style>