Merge branch 'dev-sy-11-18'

This commit is contained in:
BianLzhaoMin 2024-11-20 17:41:18 +08:00
commit c0de54a197
8 changed files with 521 additions and 140 deletions

View File

@ -44,13 +44,20 @@
"navigationBarTitleText": "新购绑定" "navigationBarTitleText": "新购绑定"
} }
}, },
// // 1.
{ {
"path": "pages/new-purchase/bind/details", "path": "pages/new-purchase/bind/details",
"style": { "style": {
"navigationBarTitleText": "新购绑定详情" "navigationBarTitleText": "新购绑定详情"
} }
}, },
// 2.
{
"path": "pages/new-purchase/bind/coding-bind",
"style": {
"navigationBarTitleText": "编码绑定"
}
},
// //
{ {
"path": "pages/new-purchase/entry/index", "path": "pages/new-purchase/entry/index",
@ -132,7 +139,6 @@
"navigationBarTitleText": "退料数量" "navigationBarTitleText": "退料数量"
} }
} }
], ],
"tabBar": { "tabBar": {
"color": "#2c2c2c", "color": "#2c2c2c",

View File

@ -0,0 +1,351 @@
<template>
<!-- 编码绑定-->
<view class="page-container">
<view class="table-list-item">
<uni-row :gutter="24">
<uni-col :span="8">物资名称</uni-col>
<uni-col :span="16">
<view class="cont">{{ queryParams.maTypeName }}</view>
</uni-col>
</uni-row>
<uni-row :gutter="24">
<uni-col :span="8">物资规格</uni-col>
<uni-col :span="16">
<view class="cont">{{ queryParams.typeName }}</view>
</uni-col>
</uni-row>
<uni-row :gutter="24">
<uni-col :span="8">到货数量</uni-col>
<uni-col :span="16"
><view class="cont">{{ queryParams.purchaseNum }}</view>
</uni-col>
</uni-row>
<uni-row :gutter="24">
<uni-col :span="8">待绑定数量</uni-col>
<uni-col :span="16">
<view class="cont" style="color: #ee0a24">{{ waitBindNum }}</view>
</uni-col>
</uni-row>
</view>
<scroll-view scroll-y>
<view class="table-list-item">
<uni-row :gutter="24" style="display: flex; align-items: center">
<uni-col :span="4">
<view>
<text style="color: #ee0a24">*</text>
前缀
</view>
</uni-col>
<uni-col :span="10">
<view>
<uni-easyinput
v-model="queryBindForm.codePrefix"
placeholder="请输入编码前缀"
/>
</view>
</uni-col>
<uni-col :span="4">
<view
class="coding-btn"
@tap="onHandleBinding"
style="padding: 10rpx 0; color: #fff; background-color: #1989fa"
>绑定
</view>
</uni-col>
<uni-col :span="6">
<view
class="coding-btn"
style="padding: 10rpx 0; color: #fff; background-color: #2bc54f"
@tap="onCodeIdentify"
>OCR绑定
</view>
</uni-col>
</uni-row>
<uni-row :gutter="24" style="display: flex; align-items: center; margin-top: 10rpx">
<uni-col :span="4">
<view>
<text style="color: #ee0a24">*</text>
后缀
</view>
</uni-col>
<uni-col :span="8">
<view>
<uni-easyinput
v-model="queryBindForm.codeSuffixStart"
type="number"
placeholder="开始值"
/>
</view>
</uni-col>
<uni-col :span="8">
<view>
<uni-easyinput
v-model="queryBindForm.codeSuffixEnd"
type="number"
placeholder="结束值"
/>
</view>
</uni-col>
<uni-col :span="4">
<view
class="coding-btn"
@tap="onHandlerFill"
style="padding: 10rpx 0; color: #1989fa; background-color: #bfd4fa"
>填充
</view>
</uni-col>
</uni-row>
<uni-row
:gutter="24"
style="display: flex; align-items: center; margin-top: 10rpx; font-size: 20rpx"
v-for="(item, index) in codeBindingList"
:key="index"
>
<uni-col :span="1">
<view> {{ index + 1 }} </view>
</uni-col>
<uni-col :span="3">
<view> 编码</view>
</uni-col>
<uni-col :span="7">
<view>
<uni-easyinput v-model="item.maCode" placeholder="请输入" />
</view>
</uni-col>
<uni-col :span="4">
<view> 出厂编码 </view>
</uni-col>
<uni-col :span="7">
<view>
<uni-easyinput placeholder="请输入" />
</view>
</uni-col>
<!-- <uni-col :span="3">
<view> 出厂时间 </view>
</uni-col>
<uni-col :span="4">
<view>
<uni-datetime-picker
type="date"
:clear-icon="false"
@maskClick="maskClick"
/>
</view>
</uni-col> -->
<uni-col :span="2">
<view @tap="onHandelDelete(index)">
<uni-icons type="trash" size="22" style="color: #ee0a24"></uni-icons>
</view>
</uni-col>
</uni-row>
</view>
</scroll-view>
</view>
</template>
<script setup>
import { ref, computed } from 'vue'
import { setBindCodingAPI } from '@/services/new-purchase/bind.js'
import { debounce } from 'lodash-es'
const query = defineProps() //
const queryParams = JSON.parse(query.queryParams)
const codeBindingList = ref([])
const queryBindForm = ref({
typeId: '', // typeId
typeName: queryParams.typeName, //
codePrefix: '', //
maTypeName: queryParams.maTypeName, //
codeSuffixEnd: '', //
codeSuffixStart: '', //
})
//
const waitBindNum = computed(() => {
return queryParams.checkNum - queryParams.bindNum
})
//
const onHandleBinding = debounce(async () => {
if (codeBindingList.value.length < 1) {
uni.showToast({
title: '请填充编码',
icon: 'none',
})
return
}
//
const bindParams = {
typeId: queryParams.typeId,
taskId: queryParams.taskId,
dtoList: codeBindingList.value,
}
console.log('绑定参数', bindParams)
const res = await setBindCodingAPI(bindParams)
if (res.code === 200) {
uni.showToast({
title: '编码绑定成功!',
icon: 'none',
})
setTimeout(() => {
//
uni.navigateBack({
delta: 1,
success() {
uni.$emit('onUpdate')
},
})
}, 500)
}
}, 500)
//
const onHandlerFill = () => {
const { codeSuffixEnd, codeSuffixStart, codePrefix, typeName, maTypeName } = queryBindForm.value
if (!codePrefix) {
uni.showToast({
title: '请填写编码前缀',
icon: 'none',
})
return
}
if (!codeSuffixStart) {
uni.showToast({
title: '请填写后缀开始值',
icon: 'none',
})
return
}
if (!codeSuffixEnd) {
uni.showToast({
title: '请填写后缀结束值',
icon: 'none',
})
return
}
const regex = /^[1-9][0-9]*$/
if (!regex.test(codeSuffixStart)) {
uni.showToast({
title: '后缀开始值不符合要求请填写大于0且不能以0开头的正整数',
icon: 'none',
})
return
}
if (!regex.test(codeSuffixEnd)) {
uni.showToast({
title: '后缀结束值不符合要求请填写大于0且不能以0开头的正整数',
icon: 'none',
})
return
}
if (parseInt(codeSuffixEnd) < parseInt(codeSuffixStart)) {
uni.showToast({
title: '结束值不可小于开始值',
icon: 'none',
})
return
}
//
let passCodeNUm =
codeSuffixEnd - codeSuffixStart + 1 > waitBindNum.value
? waitBindNum.value
: codeSuffixEnd - codeSuffixStart + 1
codeBindingList.value = []
//
for (let i = 0; i < passCodeNUm; i++) {
const codeItem = {
typeName,
maTypeName,
outFacCode: '',
// productDate: "",
maCode: `${codePrefix}${parseInt(codeSuffixStart) + i}`,
}
codeBindingList.value.push(codeItem)
}
}
//
const onHandelDelete = (index) => {
codeBindingList.value.splice(index, 1)
}
//
const onCodeIdentify = () => {
console.log('编码识别--')
//
uni.scanCode({
onlyFromCamera: true,
scanType: ['qrCode', 'pdf417'],
success: function (res) {
console.log('条码类型:' + res.scanType)
console.log('条码内容:' + res.result)
},
})
}
const maskClick = () => {}
</script>
<style lang="scss" scoped>
.page-container {
display: flex;
height: 100%;
padding: 0 15rpx;
flex-direction: column;
background-color: #e8f5fb;
.table-list-item {
margin: 5rpx 0;
padding: 20rpx;
background-color: #fff;
border-radius: 10rpx;
.title {
display: flex;
justify-content: space-between;
align-items: center;
}
.coding-btn {
padding: 5rpx 0;
background-color: #409eff;
border-radius: 6rpx;
text-align: center;
color: #fff;
font-size: 14px;
}
}
}
//
.loading-text {
text-align: center;
font-size: 28rpx;
color: #666;
padding: 20rpx 0;
}
.outbound-btn {
position: fixed;
bottom: 15rpx;
left: 15%;
width: 70%;
height: 65rpx;
line-height: 65rpx;
text-align: center;
background-color: #19be6b;
border-radius: 12rpx;
color: #fff;
}
</style>

View File

@ -13,84 +13,83 @@
</uni-row> </uni-row>
<scroll-view scroll-y class="scroll-container"> <scroll-view scroll-y class="scroll-container">
<view <view v-for="(item, index) in detailsList" :key="index" class="table-list-item">
v-for="(item, index) in detailsList" <uni-swipe-action>
:key="index" <uni-swipe-action-item @click="onClick($event, item)" :right-options="options">
class="table-list-item" <view class="line"></view>
@tap="onCodingItem(item)" <uni-row :gutter="24">
> <uni-col :span="2">{{ index + 1 }}</uni-col>
<view class="line"></view> <uni-col :span="6">物资名称</uni-col>
<uni-row :gutter="24"> <uni-col :span="16">
<uni-col :span="2">{{ index + 1 }}</uni-col> <view class="cont">{{ item.maTypeName }}</view>
<uni-col :span="6">物资名称</uni-col> </uni-col>
<uni-col :span="16"> </uni-row>
<view class="cont">{{ item.maTypeName }}</view> <uni-row :gutter="24">
</uni-col> <uni-col :span="2" style="color: transparent">{{ index + 1 }}</uni-col>
</uni-row> <uni-col :span="6">规格型号</uni-col>
<uni-row :gutter="24"> <uni-col :span="16">
<uni-col :span="2" style="color: transparent">{{ index + 1 }}</uni-col> <view class="cont">{{ item.typeName }}</view>
<uni-col :span="6">规格型号</uni-col> </uni-col>
<uni-col :span="16"> </uni-row>
<view class="cont">{{ item.typeName }}</view> <uni-row :gutter="24">
</uni-col> <uni-col :span="2" style="color: transparent">{{ index + 1 }}</uni-col>
</uni-row> <uni-col :span="6">物资数量</uni-col>
<uni-row :gutter="24"> <uni-col :span="16">
<uni-col :span="2" style="color: transparent">{{ index + 1 }}</uni-col> <view class="cont">{{ item.purchaseNum }}</view>
<uni-col :span="6">物资数量</uni-col> </uni-col>
<uni-col :span="16"> </uni-row>
<view class="cont">{{ item.purchaseNum }}</view> <uni-row :gutter="24">
</uni-col> <uni-col :span="2" style="color: transparent">{{ index + 1 }}</uni-col>
</uni-row> <uni-col :span="6">已绑数量</uni-col>
<uni-row :gutter="24"> <uni-col :span="16">
<uni-col :span="2" style="color: transparent">{{ index + 1 }}</uni-col> <view class="cont">{{ item.bindNum }}</view>
<uni-col :span="6">已绑数量</uni-col> </uni-col>
<uni-col :span="16"> </uni-row>
<view class="cont">{{ item.bindNum }}</view> <uni-row :gutter="24">
</uni-col> <uni-col :span="2" style="color: transparent">{{ index + 1 }}</uni-col>
</uni-row> <uni-col :span="6">待绑数量</uni-col>
<uni-row :gutter="24"> <uni-col :span="16">
<uni-col :span="2" style="color: transparent">{{ index + 1 }}</uni-col> <view class="cont">{{ item.checkNum - item.bindNum }}</view>
<uni-col :span="6">待绑数量</uni-col> </uni-col>
<uni-col :span="16"> </uni-row>
<view class="cont">{{ item.checkNum - item.bindNum }}</view> <uni-row :gutter="24">
</uni-col> <uni-col :span="2" style="color: transparent">{{ index + 1 }}</uni-col>
</uni-row> <uni-col :span="6">管理模式</uni-col>
<uni-row :gutter="24"> <uni-col :span="16">
<uni-col :span="2" style="color: transparent">{{ index + 1 }}</uni-col> <uni-tag
<uni-col :span="6">管理模式</uni-col> text="编码"
<uni-col :span="16"> type="warning"
<uni-tag v-if="item.manageType === 0"
text="编码" size="small"
type="warning" />
v-if="item.manageType === 0" <uni-tag
size="small" text="数量"
/> type="success"
<uni-tag v-if="item.manageType === 1"
text="数量" size="small"
type="success" />
v-if="item.manageType === 1" </uni-col>
size="small" </uni-row>
/> <uni-row :gutter="24">
</uni-col> <uni-col :span="2" style="color: transparent">{{ index + 1 }}</uni-col>
</uni-row> <uni-col :span="6">状态</uni-col>
<uni-row :gutter="24"> <uni-col :span="16">
<uni-col :span="2" style="color: transparent">{{ index + 1 }}</uni-col> <uni-tag
<uni-col :span="6">状态</uni-col> text="未完成"
<uni-col :span="16"> type="warning"
<uni-tag size="small"
text="未完成" v-if="item.status == 3"
type="warning" />
size="small" <uni-tag
v-if="item.status == 3" text="已完成"
/> type="success"
<uni-tag size="small"
text="已完成" v-if="item.status == 2"
type="success" />
size="small" </uni-col>
v-if="item.status == 2" </uni-row>
/> </uni-swipe-action-item>
</uni-col> </uni-swipe-action>
</uni-row>
</view> </view>
</scroll-view> </scroll-view>
</view> </view>
@ -103,6 +102,34 @@ import { onLoad } from '@dcloudio/uni-app'
const detailsList = ref([]) const detailsList = ref([])
const query = defineProps() // const query = defineProps() //
//
const options = ref([
{
text: '编码绑定',
style: {
backgroundColor: '#84c649',
color: '#fff',
fontSize: '30rpx',
},
},
{
text: '二维码绑定',
style: {
backgroundColor: '#65a1ff',
color: '#fff',
fontSize: '30rpx',
},
},
{
text: '驳回',
style: {
backgroundColor: '#ed6042',
color: '#fff',
fontSize: '30rpx',
},
},
])
// //
const queryParams = ref({ const queryParams = ref({
pageNum: 1, pageNum: 1,
@ -114,70 +141,50 @@ const queryParams = ref({
// //
const leaseApplyInfo = ref({ const leaseApplyInfo = ref({
leaseUnit: '', // maTypeName: '', //
leaseProject: '', // typeName: '', //
maTypeName: '', // purchaseNum: '', //
typeName: '', // bindNum: '', //
unitName: '', // checkNum: '', //
storageNum: '', // typeId: '', // typeId
preNum: '', // taskId: query.taskId, // taskId
parentId: query.id, // id
id: '', // id
typeId: '', // typeId
manageType: '', // manageType
}) })
// //
const getOutboundDetailsData = async () => { const getOutboundDetailsData = async () => {
console.log('queryParams参数', queryParams.value) console.log('queryParams参数', queryParams.value)
const { data: res } = await getPurchaseBindDetailsAPI(queryParams.value) const { data: res } = await getPurchaseBindDetailsAPI(queryParams.value)
// console.log('res', res)
detailsList.value = res.purchaseCheckDetailsList detailsList.value = res.purchaseCheckDetailsList
// leaseApplyInfo.value.leaseUnit = res.leaseApplyInfo.leaseUnit
// leaseApplyInfo.value.leaseProject = res.leaseApplyInfo.leaseProject
// console.log('', res)
} }
// //
const onCodingItem = (item) => {
// const onClick = (e, item) => {
const { const { maTypeName, typeName, purchaseNum, bindNum, checkNum, typeId } = item
status,
manageType,
maTypeName,
typeName,
storageNum,
preNum,
alNum,
unitName,
id,
typeId,
} = item
leaseApplyInfo.value.maTypeName = maTypeName leaseApplyInfo.value.maTypeName = maTypeName
leaseApplyInfo.value.typeName = typeName leaseApplyInfo.value.typeName = typeName
leaseApplyInfo.value.unitName = unitName leaseApplyInfo.value.purchaseNum = purchaseNum
leaseApplyInfo.value.storageNum = storageNum leaseApplyInfo.value.bindNum = bindNum
leaseApplyInfo.value.preNum = preNum leaseApplyInfo.value.checkNum = checkNum
leaseApplyInfo.value.alNum = alNum
leaseApplyInfo.value.id = id
leaseApplyInfo.value.typeId = typeId leaseApplyInfo.value.typeId = typeId
leaseApplyInfo.value.manageType = manageType
if (status == 2) { const { index } = e
uni.showToast({ title: '该物资已完成出库!', icon: 'none' })
return
}
let codingUrl = ''
if (manageType === 0) {
codingUrl = '/pages/picking/outbound/code-outbound' //
}
if (manageType == 1) {
codingUrl = '/pages/picking/outbound/num-outbound' //
}
// leaseApplyInfo json // 1.
uni.navigateTo({ url: `${codingUrl}?queryParams=${JSON.stringify(leaseApplyInfo.value)}` }) if (index === 0) {
uni.navigateTo({
url: `/pages/new-purchase/bind/coding-bind?queryParams=${JSON.stringify(
leaseApplyInfo.value,
)}`,
})
}
// 2.
if (index === 1) {
}
// 3.
if (index === 2) {
}
} }
// //
@ -251,4 +258,9 @@ onUnmounted(() => {
color: #666; color: #666;
padding: 20rpx 0; padding: 20rpx 0;
} }
::v-deep .uni-swipe_button {
writing-mode: vertical-rl;
padding: 0 18rpx;
}
</style> </style>

View File

@ -1,7 +1,7 @@
<template> <template>
<!-- 新购绑定 --> <!-- 新购绑定 -->
<view class="page-container"> <view class="page-container">
<view class="complete-btn"> <!-- <view class="complete-btn">
<view class="btn" @click="changeTab(1)"> <view class="btn" @click="changeTab(1)">
<span>已完成</span> <span>已完成</span>
<div v-if="active == 1" class="bt-line"></div> <div v-if="active == 1" class="bt-line"></div>
@ -10,8 +10,8 @@
<span>未完成</span> <span>未完成</span>
<div v-if="active == 2" class="bt-line"></div> <div v-if="active == 2" class="bt-line"></div>
</view> </view>
</view> </view> -->
<uni-row :gutter="24" class="search-form"> <uni-row :gutter="24" class="search-form" style="margin-top: 10rpx">
<uni-col :span="12"> <uni-col :span="12">
<view> <view>
<uni-datetime-picker <uni-datetime-picker

View File

@ -20,3 +20,13 @@ export const getPurchaseBindDetailsAPI = (data) => {
data, data,
}) })
} }
/**
* 新购绑定 ---- 列表查询
*/
export const setBindCodingAPI = (data) => {
return http({
method: 'POST',
url: '/material/purchase/bind/bind',
data,
})
}

View File

@ -122,4 +122,5 @@ a:hover {
page { page {
/* height: 100%; */ /* height: 100%; */
font-size: 28rpx; font-size: 28rpx;
background-color: #e8f5fb;
} }

View File

@ -6,7 +6,8 @@ import { useMemberStore } from '@/stores'
* baseURL 设置请求ip地址和端口 * baseURL 设置请求ip地址和端口
*/ */
const ENV = process.env.NODE_ENV const ENV = process.env.NODE_ENV
export const baseURL = ENV === 'development' ? 'http://192.168.2.246:18080' : '***' // export const baseURL = ENV === 'development' ? 'http://192.168.2.246:18080' : '***'
export const baseURL = ENV === 'development' ? '/api' : '***'
/** /**
* httpInterceptor 分别拦截 request uploadFile 请求 * httpInterceptor 分别拦截 request uploadFile 请求
*/ */
@ -65,12 +66,12 @@ export const http = (options) => {
url: '/pages/login/index', url: '/pages/login/index',
}) })
reject(res) reject(res)
} else if (res.data.code === 500) { } else if (res.data.code === 500) {
uni.showToast({ uni.showToast({
icon: 'none', icon: 'none',
title: `${res.data.msg}`, title: `${res.data.msg}`,
}) })
} }
} else if (res.statusCode === 401) { } else if (res.statusCode === 401) {
// 2. 401 表示token过期 去往登录页重新登录 // 2. 401 表示token过期 去往登录页重新登录
const memberStore = useMemberStore() const memberStore = useMemberStore()

View File

@ -21,7 +21,7 @@ export default defineConfig({
// 在此处编写代理规则 // 在此处编写代理规则
'/api': { '/api': {
// target: 'http://192.168.2.76:18080', // target: 'http://192.168.2.76:18080',
target: 'http://localhost:18080', target: 'http://192.168.2.246:18080',
changeOrigin: true, changeOrigin: true,
rewrite: (path) => { rewrite: (path) => {
return path.replace(/\/api/, '') return path.replace(/\/api/, '')