This commit is contained in:
ljx120 2025-01-11 17:24:54 +08:00
parent 63a6f9cbde
commit cb6f898542
23 changed files with 461 additions and 29 deletions

View File

@ -327,6 +327,18 @@
"bounce": "none"
}
}
},
{
"path" : "pages/documentary/detail",
"style" :
{
"navigationStyle": "custom",
"enablePullDownRefresh": false,
"disableScroll": true,
"app-plus": {
"bounce": "none"
}
}
}
],
"globalStyle": {

View File

@ -565,6 +565,7 @@
::v-deep .van-field__control {
border-bottom: 1px solid #d7d7d7;
text-align: center;
font-size: 16px;
}
::v-deep .van-field__label {

View File

@ -709,6 +709,7 @@
::v-deep .van-field__control {
border-bottom: 1px solid #d7d7d7;
text-align: center;
font-size: 16px;
}
::v-deep .van-field__label {

View File

@ -252,6 +252,7 @@
::v-deep .van-field__control {
text-align: center;
font-size: 16px;
}
/*面料选择搜索框*/

View File

@ -79,6 +79,8 @@
belongTo: form.value.belongTo,
zt: typeData.value,
sd: form.value.sd,
innerComment:form.value.interComment,
customerComment:form.value.customerComment,
mls: []
}
}
@ -245,7 +247,7 @@
<van-icon name="cross" color="red" @click="bhms.splice(indexSecond,1)" />
</view>
</view>
<view class="a-c" v-if="zt!='已配全'">
<view class="a-c">
<van-button type="primary" @click="upScanCode(index)">
扫一扫
</van-button>
@ -256,7 +258,7 @@
@close="handleClose">
</cshaptx4869-scancode>
<view v-if="zt!='已配全'">
<view>
<van-field v-model="formItem.phrq" name="配货日期" label="配货日期" colon class="bor" label-width="5em"
readonly :rules="[{ required: true, message: '请填写' }]" @click="chooseDate()" />
<van-field v-model="formItem.rc" name="染厂选择" label="染厂选择" colon class="bor" label-width="5em"
@ -267,7 +269,7 @@
label-width="5em" />
</view>
</van-cell-group>
<view style="margin: 16px;display: flex;" v-if="zt!='已配全'">
<view style="margin: 16px;display: flex;">
<van-button round block type="primary" native-type="submit" @click="beforeSubmit('部分配货')">
部分配货
</van-button>
@ -387,6 +389,7 @@
::v-deep .van-field__control {
border-bottom: 1px solid #d7d7d7;
text-align: center;
font-size: 16px;
}
::v-deep .van-field__label {

View File

@ -73,6 +73,7 @@
belongTo: '',
zt: typeData.value,
sd: form.value.sd,
customerComment:form.value.comment,
mls: []
}
}
@ -382,6 +383,8 @@
::v-deep .van-field__control {
border-bottom: 1px solid #d7d7d7;
text-align: center;
font-size: 16px;
}
::v-deep .van-field__label {

View File

@ -0,0 +1,377 @@
<script setup lang="ts">
import { onLoad } from '@dcloudio/uni-app';
import { showToast } from 'vant';
import { ref, watch } 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 status = ref('' as any)
const indexData = ref()
const specialPro = ref([] as any[])
const list = ref([] as any[])
const special = ref('' as any)
const content = ref([] as any[])
const form = ref({czrq:formatDate(new Date())} as any)
onLoad(async (option : any) => {
if (option) {
try {
itemList.value = JSON.parse(option.item)
if (itemList.value.sd === '门店') {
processes.value = {}
} else {
processes.value = JSON.parse(itemList.value.processes)
}
console.log(itemList.value);
indexData.value = processes.value.processes.findIndex((l : any) => l.name == itemList.value.zt)
let name=processes.value.processes.find((l:any)=>l.name!=itemList.value.zt&&(l.necessary))
postAction('/process/getNext',[itemList.value.zt,name.name]).then((res:any)=>{
if(res.code===200){
specialPro.value=res.data
}
})
} catch (error) {
console.error('Failed to parse item JSON:', error);
//
}
}
})
watch(status, () => {
if (status.value === '出厂') {
postAction('/craftComment/getByIds', itemList.value.craftCmt.value).then((res : any) => {
if (res.code === 200) {
res.data.forEach((l : any) => {
content.value = content.value.concat(l.content)
})
}
})
}
})
const onClickLeft = () => {
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 chooseStatus = (item : any, index : any) => {
try {
special.value = ''
processes.value.processes.forEach((l : any, j : any) => {
if (j > indexData.value && index > j) {
if (l.necessary) {
throw l.name + '不可跳过!'
}
} else {
status.value = item.name
}
})
getAction('/process/byName?name='+status.value).then((res:any)=>{
if(res.code===200){
list.value=res.data.evidence
}
})
} catch (err) {
showToast(err)
}
}
const showDialog = ref(false)
const contentType = ref([])
const bhList = ref([] as any[])
//
const chooseSpecial = (item:any) =>{
special.value = item.name
status.value=''
let a=specialPro.value.find((l:any)=>l.name===item.name)
list.value=a.evidence
showDialog.value=true
}
const addBh = (item:any) =>{
let index=bhList.value.findIndex((l:any)=>l===item.bh)
if(index>=0){
bhList.value.splice(index,1)
}else{
bhList.value.push(item.bh)
}
}
const confirmSecond = () =>{
}
//
const onSubmit = () =>{
console.log(list.value);
if(!status.value&&!special.value) return showToast('请选择工序!')
let data={
trackingLogId:itemList.value.id,
details:{
zt:status.value,
list:list.value,
form:form.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="(indexData>=index)||(status==item.name)?'btn1':'btn'"
@click="chooseStatus(item,index)">{{item.name}}</view>
</view>
</view>
<van-field name="特殊工序" label="特殊工序" colon label-width="5em" readonly/>
<view class="grid-container">
<view class="grid-item" v-for="(item,index) in specialPro" :key="index">
<view :class="special==item.name?'btn1':'btn'"
@click="chooseSpecial(item)">{{item.name}}</view>
</view>
</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.contentType.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.contentType.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-field v-model="form.czrq" name="操作日期" label="操作日期" colon label-width="5em"
:rules="[{ required: true, message: '请填写' }]" readonly class="bor"
@click="chooseDate('czrq')" />
<van-field v-model="form.yjxybrq" name="预计下一步日期" label="预计下一步日期" colon label-width="8em"
:rules="[{ required: true, message: '请填写' }]" readonly class="bor"
@click="chooseDate('yjxybrq')" />
</van-cell-group>
<view style="margin: 32rpx;">
<van-button round block type="primary" native-type="submit">
更新状态
</van-button>
</view>
</van-form>
</view>
</view>
<van-dialog v-model:show="showDialog">
<view style="padding: 10rpx 15rpx;">
<van-field name="请选择面料" label="请选择面料" label-width="6em">
<template #input>
<van-checkbox-group v-model="contentType" direction="horizontal">
<van-checkbox name="All">全部</van-checkbox>
</van-checkbox-group>
</template>
</van-field>
<p style="color: #7f7f7f;">如果无法辨认请选择米数相近的面料</p>
<view class="grid-container1">
<view class="grid-item" v-for="(item,index) in itemList.mls" :key="index">
<view v-for="(itemSecond,indexSecond) in item.xxs" :key="indexSecond">
<view :class="contentType[0]||bhList.find(l=>l===itemSecond.bh)?'btn1':'btn'" @click="addBh(itemSecond)">{{item.mz}}<br>{{itemSecond.ms}}/{{itemSecond.bh}}</view>
</view>
</view>
</view>
</view>
<template #footer>
<view class="footer-button">
<van-button plain size="small" native-type="button" style="width: 25vw;" @click="showDialog=false">
取消
</van-button>
<van-button size="small" type="success" native-type="submit" style="width: 25vw;"
@click="confirmSecond">
确认
</van-button>
</view>
</template>
</van-dialog>
<!--选择框-->
<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;
grid-template-columns: 1fr 1fr 1fr;
padding: 10rpx 15rpx;
.grid-item {
display: flex;
flex-direction: column;
text-align: center;
align-items: center;
justify-content: center;
.btn {
border: 1rpx solid #d7d7d7;
padding: 10rpx 30rpx;
border-radius: 10rpx;
}
.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;
}
}
.grid-container1 {
display: grid;
grid-template-columns: 1fr 1fr;
padding: 10rpx 15rpx;
.grid-item {
display: flex;
flex-direction: column;
text-align: center;
align-items: center;
justify-content: center;
.btn {
border: 1rpx solid #d7d7d7;
padding: 10rpx 30rpx;
border-radius: 10rpx;
}
.btn1 {
border: 1rpx solid #169bd5;
padding: 10rpx 30rpx;
border-radius: 10rpx;
background-color: #169bd5;
color: #fff;
}
}
}
.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>

View File

@ -93,11 +93,11 @@
if (isValidJSON(l.craftComment)) {
l.craftComment = JSON.parse(l.craftComment)
}
if (l.status === '待进厂') {
if (l.zt === '待进厂') {
l.butonColor = butonColor.value[0]
} else if (l.status === '待出厂') {
} else if (l.zt === '待出厂') {
l.butonColor = butonColor.value[1]
} else if (l.status === '已出厂') {
} else if (l.zt === '已出厂') {
l.butonColor = butonColor.value[2]
} else {
l.butonColor = butonColor.value[getRandomIntInclusive(3, 14)]
@ -259,13 +259,6 @@
const showDialog = ref(false)
const itemList = ref({} as any)
const toDetile = (item : any) => {
if (item.status === '待进厂') {
showDialog.value = true
itemList.value = item
}
}
const submit = () => {
if (!dataItem.value.yjccts) return showToast('请填写预计出厂天数!')
dataItem.value.zt = itemList.value.status
@ -276,6 +269,20 @@
}
})
}
//
const computing = (list:any) =>{
let total=list.reduce((accumulator:any, currentValue:any) => {
return accumulator + currentValue.ms*1;
}, 0);
return total
}
//
const toDetile = (item:any) =>{
uni.navigateTo({
url:'./detail?item='+JSON.stringify(item)
})
}
</script>
<template>
@ -322,19 +329,24 @@
<view class="grid-container1">
<view :class="indexSecond===(item.mls.length-1)?'grid-item2':'grid-item1'"
v-for="(itemSecond,indexSecond) in item.mls" :key="indexSecond">
{{itemSecond.mz}}<br>{{itemSecond.craft}}&nbsp;&nbsp;&nbsp;{{itemSecond.sd}}
{{itemSecond.mz}}<br>{{itemSecond.sh}}
</view>
</view>
</view>
<view class="grid-item">
{{item.sd}}/{{item.makeUser}}/{{item.belongTo}}<br>{{item.qty}}/{{item.len}}
<view class="grid-container1">
<view :class="indexSecond===(item.mls.length-1)?'grid-item2':'grid-item1'"
v-for="(itemSecond,indexSecond) in item.mls" :key="indexSecond">
{{item.sd}}/{{item.makeUser}}/{{item.belongTo}}<br>{{itemSecond.xxs.length}}/{{computing(itemSecond.xxs)}}
</view>
</view>
</view>
<view class="grid-item">
{{item.craft}}<br>{{item.craftComment.name?item.craftComment.name:item.craftComment}}
{{item.craft}}<br>{{item.craftCmt.name?item.craftCmt.name:''}}
</view>
<view class="grid-item">
<van-button :style="{backgroundColor: item.butonColor,color:'#fff'}"
@click="toDetile(item)">{{item.status}}</van-button>
@click="toDetile(item)">{{item.zt}}</van-button>
</view>
</view>
</van-list>
@ -416,20 +428,21 @@
display: grid;
grid-template-columns: 1.5fr 2fr 1.5fr 1fr;
padding: 0 15rpx;
.grid-item {
border: 1px solid #f2f2f2;
display: flex;
align-items: center;
flex-direction: column;
text-align: center;
align-items: center;
justify-content: center;
.grid-container1 {
display: grid;
grid-template-columns: 1fr;
width: 100%;
height: 100%;
.grid-item2 {
display: flex;
align-items: center;
@ -437,7 +450,7 @@
justify-content: center;
padding: 5rpx;
}
.grid-item1 {
border-bottom: 1px solid #f2f2f2;
display: flex;
@ -495,6 +508,7 @@
::v-deep .van-field__control {
text-align: center;
font-size: 16px;
}
.footer-button {

View File

@ -112,6 +112,7 @@ const submit =()=>{
}
::v-deep .van-field__control {
border-bottom: 1px solid #d7d7d7;
font-size: 16px;
}
::v-deep .van-field__label {
text-align: end;

View File

@ -233,6 +233,7 @@
::v-deep .van-field__control {
border-bottom: 1rpx solid #d7d7d7;
text-align: center;
font-size: 16px;
}
::v-deep .van-field__label {

View File

@ -213,6 +213,7 @@
::v-deep .van-field__control {
border-bottom: 1rpx solid #d7d7d7;
text-align: center;
font-size: 16px;
}
::v-deep .van-field__label {

View File

@ -1,12 +1,13 @@
<script lang="ts" setup>
import { onMounted, ref } from 'vue'
import { ref } from 'vue'
import { onShow } from '@dcloudio/uni-app';
import { deleteAction, getAction } from '../../common/http';
import { showConfirmDialog, showToast } from 'vant';
const list= ref([] as any[])
onMounted(()=>{
onShow(()=>{
init()
})

View File

@ -89,7 +89,7 @@
}
})
}
const del = (item : any) => {
showConfirmDialog({
title: '提示',
@ -100,7 +100,7 @@
if (res.code === 200) {
init()
showToast('删除成功!')
}else{
} else {
showToast(res.msg)
}
})
@ -109,7 +109,7 @@
// on cancel
});
}
const delSecond = (item : any,index:any) =>{
const delSecond = (item : any, index : any) => {
showConfirmDialog({
title: '提示',
message: '是否确认删除?',
@ -118,7 +118,7 @@
deleteAction(url).then((res : any) => {
if (res.code === 200) {
init()
listItem.value.subCategory.splice(index,1)
listItem.value.subCategory.splice(index, 1)
showToast('删除成功!')
}
})
@ -304,6 +304,11 @@
border-bottom: 1rpx solid #d7d7d7;
}
::v-deep .van-field__control {
text-align: center;
font-size: 16px;
}
.bor-n {
::v-deep .van-field__body {
border: none;

View File

@ -112,7 +112,7 @@
</van-field>
<van-field name="是否必填" label="是否必填" colon label-width="6em">
<template #input>
<van-radio-group v-model="itemSecond.necessary" direction="horizontal">
<van-radio-group v-model="item.necessary" direction="horizontal">
<van-radio :name="true"></van-radio>
<van-radio :name="false"></van-radio>
</van-radio-group>
@ -205,6 +205,7 @@
::v-deep .van-field__control {
text-align: center;
font-size: 16px;
}
.bor {

View File

@ -383,6 +383,7 @@
::v-deep .van-field__control {
text-align: center;
border: 1rpx solid #d7d7d7;
font-size: 16px;
}
}

View File

@ -151,6 +151,7 @@ import { showToast } from 'vant';
::v-deep .van-field__control {
border-bottom: 1px solid #d7d7d7;
text-align: center;
font-size: 16px;
}
::v-deep .van-field__label {

View File

@ -443,6 +443,7 @@
::v-deep .van-field__control {
text-align: center;
font-size: 16px;
}
/*面料选择搜索框*/

View File

@ -122,6 +122,7 @@
::v-deep .van-field__control {
border-bottom: 1px solid #d7d7d7;
text-align: center;
font-size: 16px;
}
::v-deep .van-field__label {

View File

@ -390,6 +390,7 @@
::v-deep .van-field__control {
border-bottom: 1px solid #d7d7d7;
text-align: center;
font-size: 16px;
}
::v-deep .van-field__label {

View File

@ -153,6 +153,7 @@ const delItem = (item:any) =>{
}
::v-deep .van-field__control{
border-bottom: 1px solid #d7d7d7;
font-size: 16px;
}
::v-deep .van-field__label{
text-align: end;

View File

@ -178,6 +178,7 @@ const del=(item:any)=>{
.bot{
::v-deep .van-field__control {
border-bottom: 1px solid #d7d7d7;
font-size: 16px;
}
}
::v-deep .van-field__label{

View File

@ -233,6 +233,7 @@ const cancel = () =>{
}
::v-deep .van-field__control {
border-bottom: 1px solid #d7d7d7;
font-size: 16px;
}
.nonBom{
::v-deep .van-field__control {

View File

@ -470,6 +470,7 @@ const totalMeter = computed(()=>{
::v-deep .van-field__control {
border: 1px solid #d7d7d7;
text-align: center;
font-size: 16px;
}
}
::v-deep .van-button--normal{
@ -485,6 +486,7 @@ const totalMeter = computed(()=>{
::v-deep .van-field__control {
border-bottom: 1px solid #d7d7d7;
text-align: center;
font-size: 16px;
}
}
/*面料选择搜索框*/