Compare commits

..

4 Commits

Author SHA1 Message Date
andy
d80a5983d4 Merge branch 'master' of https://git.evo-techina.com/sgc/mes-vue 2026-08-03 13:34:16 +08:00
andy
0c9721f4c9 提交 2026-08-03 13:34:02 +08:00
andy
44e98d2d8b 提交 2026-08-03 13:26:35 +08:00
andy
32036b1160 修改 2026-07-29 16:22:42 +08:00
7 changed files with 1377 additions and 232 deletions

View File

@ -9,10 +9,10 @@ VITE_APP_ENV = 'development'
#VITE_APP_BASE_API = 'http://192.168.12.4:8888/api' #VITE_APP_BASE_API = 'http://192.168.12.4:8888/api'
#VITE_APP_BASE_API = 'http://192.168.5.14:9100/gateway' #VITE_APP_BASE_API = 'http://192.168.5.14:9100/gateway'
VITE_APP_BASE_API = 'http://localhost/api' #VITE_APP_BASE_API = 'http://localhost/api'
#VITE_APP_BASE_API = 'http://localhost:9100/gateway' #VITE_APP_BASE_API = 'http://localhost:9100/gateway'
#VITE_APP_BASE_API = '/dev-api' VITE_APP_BASE_API = '/api'

View File

@ -23,7 +23,7 @@ export function editDrawing(data:any) {
//列表 //列表
export function drawinglist(params:any) { export function drawinglist(params:any) {
return request({ return request({
url: `/biz/ncCode/page`, url: `/biz/drawingFile/page`,
method: 'get', method: 'get',
params params
}) })
@ -45,3 +45,45 @@ export function deleteDrawing(ids:any) {
method: 'delete' method: 'delete'
}) })
} }
//生成图纸编号
export function generateDFCode() {
return request({
url: `/biz/drawingFile/generateDFCode`,
method: 'get'
})
}
//导出
export function exportdraFile(params:any) {
return request({
url: `biz/drawingFile/export`,
method: 'get',
responseType: 'blob',
params
})
}
//任务树
export function opertree() {
return request({
url: `biz/ncCode/operationTree`,
method: 'get'
})
}
//查询已上传文件 单文件
export function filelist(fileId:any) {
return request({
url: `sys/file/${fileId}`,
method: 'get'
})
}
//查询已上传文件 多文件
export function multifilelist(fileId:any) {
return request({
url: `sys/file/getFile/${fileId}`,
method: 'get'
})
}

View File

@ -97,7 +97,7 @@ export function exportNccode(params:any) {
return request({ return request({
url: `biz/ncCode/export`, url: `biz/ncCode/export`,
method: 'get', method: 'get',
params, responseType: 'blob',
responseType: 'blob' params
}) })
} }

View File

@ -1,7 +1,7 @@
import axios, { type AxiosInstance, type AxiosRequestConfig, type AxiosResponse } from 'axios' import axios, { type AxiosInstance, type AxiosRequestConfig, type AxiosResponse } from 'axios'
import { useUserStore } from '@/stores/user' import { useUserStore } from '@/stores/user'
// const BASE_API = import.meta.env.VITE_APP_BASE_API const BASE_API = import.meta.env.VITE_APP_BASE_API
// API响应结构 // API响应结构
interface ApiResponse<T = any> { interface ApiResponse<T = any> {
@ -116,7 +116,8 @@ async function decryptResponseData(data: string): Promise<any> {
// 创建axios实例 // 创建axios实例
// 后端 API 统一使用 /api 前缀 // 后端 API 统一使用 /api 前缀
const service: AxiosInstance = axios.create({ const service: AxiosInstance = axios.create({
baseURL:'/api', //baseURL:'/api',
baseURL:BASE_API,
timeout: 30000 timeout: 30000
}) })
@ -158,7 +159,6 @@ service.interceptors.response.use(
return response.data return response.data
} }
const res = response.data const res = response.data
if (res.code !== 200) { if (res.code !== 200) {

846
src/views/NCcode/index.vue Normal file
View File

@ -0,0 +1,846 @@
<template>
<div class="page-container">
<!-- 用户列表 -->
<n-card class="user-list-card" size="small">
<!-- 搜索表单 -->
<div class="search-form">
<n-form
inline
:model="searchForm"
label-placement="left"
>
<n-form-item label="NC代码编号">
<n-input v-model:value="searchForm.ncCode" placeholder="请输入NC代码编号" />
</n-form-item>
<n-form-item label="NC代码名称">
<n-input v-model:value="searchForm.ncName" placeholder="请输入NC代码名称" />
</n-form-item>
<n-space>
<n-button type="primary" @click="search">
<template #icon><n-icon><SearchOutline /></n-icon></template>
搜索
</n-button>
<n-button @click="reset">
<template #icon><n-icon><RefreshOutline /></n-icon></template>
重置
</n-button>
</n-space>
</n-form>
</div>
<n-space style="margin-bottom: 15px;">
<n-button v-if="hasPermission('biz:ncCode:add')" type="primary" @click="addhand(1)" size="small">
<template #icon>
<n-icon>
<AddOutline />
</n-icon>
</template>
新增
</n-button>
<!-- <n-button type="error" @click="delhand" size="small">
<template #icon>
<n-icon>
<ArrowDownCircleOutline />
</n-icon>
</template>
删除
</n-button> -->
<n-button v-if="hasPermission('biz:ncCode:export')" type="success" @click="handleExport" size="small">
<template #icon>
<n-icon>
<ArrowDownCircleOutline />
</n-icon>
</template>
导出
</n-button>
</n-space>
<!-- 表格 -->
<n-data-table
:columns="columns"
size="small"
striped
:data="datalist"
:bordere="false"
:single-line="false"
:loading="loading"
remote
:row-key="rowKey"
@update:checked-row-keys="handleCheck"
/>
<div class="pagination-container" style="display: flex; justify-content: flex-end; margin-top: 12px">
<n-pagination
v-model:page="pagination.page"
v-model:page-size="pagination.pageSize"
:item-count="pagination.itemCount"
:page-sizes="[10, 20, 50, 100]"
show-size-picker
show-quick-jumper
@update:page="handlePageChange"
@update:page-size="handlePageSizeChange"
>
<template #prefix>
{{ pagination.itemCount }}
</template>
</n-pagination>
</div>
</n-card>
<n-modal
v-model:show="addModel"
:title="cztype[isstype]"
preset="card"
style="width: 600px"
:mask-closable="false"
>
<n-form
ref="addformRef"
:model="formData"
:rules="addrules"
label-placement="left"
label-width="100"
>
<n-grid :cols="1" :x-gap="24">
<n-gi>
<n-form-item path="ncCode" label="NC代码编号">
<n-input v-model:value="formData.ncCode" placeholder="自动生成" disabled />
</n-form-item>
</n-gi>
<n-gi>
<n-form-item path="ncName" label="NC代码名称">
<n-input v-model:value="formData.ncName" placeholder="请输入NC代码名称" />
</n-form-item>
</n-gi>
<n-gi>
<n-form-item label="状态">
<n-radio-group v-model:value="formData.status" :default-value="1" name="radiogroup">
<n-space>
<n-radio :value="1">
启用
</n-radio>
<n-radio :value="0">
禁用
</n-radio>
</n-space>
</n-radio-group>
</n-form-item>
</n-gi>
<n-gi>
<!--type="textarea"-->
<n-form-item path="ncContent" label="NC代码内容">
<n-input type="textarea" v-model:value="formData.ncContent" placeholder="请输入NC代码内容" />
</n-form-item>
</n-gi>
<n-gi>
<n-form-item label="备注">
<n-input type="textarea" v-model:value="formData.remark" placeholder="请输入备注" />
</n-form-item>
</n-gi>
<!-- <n-gi>
<n-form-item label="工作中心">
<n-input v-model:value="formData.workCenter" placeholder="请输入工作中心" />
</n-form-item>
</n-gi>
<n-gi>
<n-form-item label="设备ID">
<n-input v-model:value="formData.deviceId" placeholder="请输入设备ID" />
</n-form-item>
</n-gi>
<n-gi>
<n-form-item label="设备名称">
<n-input v-model:value="formData.deviceName" placeholder="请输入设备名称" />
</n-form-item>
</n-gi> -->
<!-- <n-gi>
<n-form-item label="下发状态">
<n-radio-group v-model:value="formData.isIssued" name="radiogroup">
<n-space>
<n-radio :value="1">
已下发
</n-radio>
<n-radio :value="0">
未下发
</n-radio>
</n-space>
</n-radio-group>
</n-form-item>
</n-gi> -->
<!-- <template v-if="formData.isIssued == 1">
<n-gi>
<n-form-item label="下发时间">
<n-date-picker
v-model:formatted-value="formData.issueTime"
type="datetime"
style="width: 100%;"
clearable
value-format="yyyy-MM-dd HH:mm:ss"
/>
</n-form-item>
</n-gi>
<n-gi>
<n-form-item label="下发人">
<n-input v-model:value="formData.issueBy" placeholder="请选择下发人" />
</n-form-item>
</n-gi>
</template> -->
</n-grid>
</n-form>
<template #footer>
<n-space justify="end">
<n-button @click="addModel = false">取消</n-button>
<n-button
type="primary"
@click="savehand"
>确认</n-button>
</n-space>
</template>
</n-modal>
<!--下发-->
<n-modal
v-model:show="issueModel"
title="下发"
preset="card"
style="width: 600px"
:mask-closable="false"
>
<div style="display: flex;padding-bottom: 15px;font-size: 16px;">
<div style="padding: 2px 5px;background: #50a5b7;color: #fff;border-radius: 6px 0 0 6px;">NC代码编号</div>
<div style="padding: 2px 5px;border: 1px solid #50a5b7;border-radius: 0 6px 6px 0;">{{ ncCode }}</div>
</div>
<n-transfer
v-model:value="xfsbvalue"
style="height:500px;"
:options="options"
:render-source-list="renderSourceList"
source-filterable
@update:value="tranupdate"
/>
<template #footer>
<n-space justify="end">
<n-button @click="issueModel = false">取消</n-button>
<n-button
type="primary"
@click="isssavehand"
>确认</n-button>
</n-space>
</template>
</n-modal>
</div>
</template>
<script setup lang="ts">
import {
ref,
reactive,
h,
onMounted,
} from 'vue'
import {
NTree,
NButton,
NIcon,
NSpace,
NPagination,
NGrid,
useMessage,
useDialog,
NDropdown,
} from 'naive-ui'
import {
SearchOutline,
RefreshOutline,
AddOutline,
ArrowDownCircleOutline,
EllipsisHorizontalOutline
} from '@vicons/ionicons5'
import { useUserStore } from '@/stores/user'
import {
addnccode,
nccodelist,
batchIssue,
editccode,
issuecopy,
generateNccode,
opertree,
exportNccode,
deleteIssue
} from '@/api/nccode'
const dialog = useDialog()
const message = useMessage()
const userStore = useUserStore()
//
const hasPermission = (permission: string) => userStore.hasPermission(permission)
//const ncDispatchRecords = ref<ncCode[]>([])
//
//const qcAssingStatusOptions = ref<{ label: string; value: any;class:any }[]>([])
// ==================== ====================
const searchForm = reactive({
page: 1,
pageSize: 20,
ncCode:'',
ncName:''
//status:1
})
// ==================== ====================
const datalist = ref<any>([])
const loading = ref(false)
//
const pagination = reactive({
page: 1,
pageSize: 20,
itemCount: 0
})
const columns = [
// {
// type: 'selection',
// minWidth:60
// },
{
align:"center",
title:"NC代码编号",
key:"ncCode",
minWidth:150
},
{
align:"center",
title:"NC代码名称",
key:"ncName",
minWidth:150
},
{
align:"center",
title:"NC代码内容",
key:"ncContent",
minWidth:150
},
// {
// align:"center",
// title:"",
// key:"workCenter",
// minWidth:150
// },
// {
// align:"center",
// title:"ID",
// key:"deviceId",
// minWidth:150
// },
// {
// align:"center",
// title:"",
// key:"deviceName",
// minWidth:150
// },
{
align:"center",
title:"状态",
key:"status",
minWidth:150,
render(row:any) {
if(row.status == 1){
return '启用'
}
return '禁用'
}
},
{
align:"center",
title:"是否下发",
key:"isIssued",
minWidth:150,
render(row:any) {
if(row.isSued== 1){
return '已下发'
}
return '未下发'
}
},
{
align:"center",
title:"下发时间",
key:"issueTime",
minWidth:150
},
{
align:"center",
title:"下发人",
key:"issueName",
minWidth:150
},
{
align:"center",
title:"备注",
key:"remark",
minWidth:150
},
{
align:'center',
title: '操作',
key: 'actions',
width: 260,
fixed: 'right',
render(row:any) {
const buttons:any = []
if(hasPermission('biz:ncCode:issue')){
buttons.push(h(NButton, {
size: 'small',
type:'info',
ghost:true,
onClick: () => {
issuehand(row)
} },
{ default: () => '下发'}
))
}
if(hasPermission('biz:nccode:add')){
buttons.push(h(NButton, {
size: 'small',
type:'warning',
ghost:true,
onClick: () => {
addhand(3,row)
}},
{ default: () => '复制'}
))
}
if(hasPermission('biz:ncCode:edit')){
buttons.push(h(NButton, {
size: 'small',
type:'primary',
ghost:true,
onClick: () => {
addhand(2,row)
} },
{ default: () => '编辑'}
))
}
if(hasPermission('biz:ncCode:remove')){
buttons.push(h(NButton, {
size: 'small',
type:'error',
ghost:true,
onClick: () => {
dialog.warning({
title: '警告',
content: `你确定删除NC代码编号为:${row.ncCode}的数据`,
positiveText: '确定',
negativeText: '取消',
//draggable: true,
onPositiveClick: () => {
deleteIssue(row.id).then(() => {
message.success('操作成功')
setTimeout(() => {
search()
},1000)
})
},
onNegativeClick: () => {
}
})
} },
{ default: () => '删除'}
))
}
return buttons.length > 0 ? h(NSpace, {justify:'center'}, { default: () => buttons }) : '-'
}
}
]
//
function search() {
pagination.page = 1
searchForm.page = 1
searchForm.pageSize = 20
getlist()
}
//
function reset() {
searchForm.ncCode = ''
searchForm.ncName = ''
}
//
function getlist() {
nccodelist(searchForm).then((rps:any) => {
datalist.value = rps.list
pagination.itemCount = rps.total
})
}
function handlePageChange(page: number) {
pagination.page = page
searchForm.page = page
getlist()
}
function handlePageSizeChange(pageSize: number) {
pagination.pageSize = pageSize
pagination.page = 1
searchForm.page = 1
searchForm.pageSize = pageSize
getlist()
}
// //
// async function loadDictOptions() {
// //qcCancelLoading = true
// try {
// const data = await dictDataApi.listByType('assing_status')
// qcAssingStatusOptions.value = data.map(d => ({ label: d.dictLabel, value: (Number(d.dictValue) || d.dictValue),class:d.listClass }))
// }catch {}
// }
//
let addModel = ref(false)
const addformRef = ref()
let formData = reactive<any>({
id:'',
ncCode:'', //NC
ncName:'', //NC
ncContent:'', //NC
workCenter:'', //
deviceId:'', //ID
deviceName:'', //
status:1, //1- 0-
// isIssued:1, //1- 0-
// issueTime:null, //
// issueBy:'', //
remark:'' //
})
const addrules = {
ncCode: [
{ required: true, message: '请输入NC代码编号', trigger: 'blur' },
// {
// validator(rule:any,value: any) {
// if(value > pauseform.qcNum){
// return new Error(`${pauseform.qcNum}`)
// }
// return true
// },
// trigger: ['blur']
// }
],
ncName:[
{ required: true, message: '请输入NC代码名称', trigger: 'blur' }
],
ncContent:[
{ required: true, message: '请输入NC代码内容', trigger: 'blur' }
]
}
let isstype = ref<any>(1)
const cztype = reactive<any>({
1:'新增',
2:'编辑',
3:'复制'
})
function addhand(type:any,row?:any) {
addModel.value = true
formData.value?.restoreValidation()
isstype.value = type
if(row){
formData.id = row.id
formData.ncName = row.ncName
formData.ncContent = row.ncContent
formData.workCenter = row.workCenter
formData.deviceId = row.deviceId
formData.deviceName = row.deviceName
formData.status = row.status
// formData.isIssued = row.isIssued
// formData.issueTime = row.issueTime
// formData.issueBy = row.issueBy
formData.remark = row.remark
if(type == 2){
formData.ncCode = row.ncCode
}else{
formData.ncCode = ''
}
}else{
formData.id = ''
formData.ncCode = ''
formData.ncName = ''
formData.ncContent = ''
formData.workCenter = ''
formData.deviceId = ''
formData.deviceName = ''
formData.status = 1
// formData.isIssued = ''
// formData.issueTime = ''
// formData.issueBy = ''
formData.remark = ''
}
if(type == 1 || type == 3){
generateNccode().then(rps => {
formData.ncCode = rps
})
}
}
function addEdi(){
if(isstype.value == 1){
return addnccode(formData)
}
if(isstype.value == 2){
return editccode(formData)
}
formData.id = ''
return issuecopy(formData)
}
function savehand() {
addformRef.value?.validate((e:any) => {
if (!e) {
addEdi().then(() => {
message.success(`${cztype[isstype.value]}成功`)
setTimeout(() => {
getlist()
addModel.value = false
},1500)
})
}
})
}
//
function rowKey(row:any) {
return row.id
}
let chearr = ref<any>([])
function handleCheck(v:any) {
chearr.value = v
console.log(v)
}
//
function delhand() {
if(chearr.value.length > 0){
batchIssue(chearr.value).then(() => {
message.success('操作成功')
})
}else{
message.error('请勾选设备')
}
}
//
//let isstasklist = ref<any>([])
//
//let issequiplist = ref<any>([])
let treeData:any = []
let xfsbvalue = ref<Array<string | number>>([])
let renderSourceList:any = ''
let options = ref<any>([]) //flattenTree(createData())
function flattenTree(list: undefined | any[]) {
const result: any[] = []
function flatten(_list: any[] = []) {
_list.forEach((item) => {
//result.push(item)
if(item.childList){
flatten(item.childList)
}else{
result.push(item)
}
})
}
flatten(list)
return result
}
//
let issueModel = ref(false)
// let issformData = reactive<any>({
// taskid:'',
// equis:''
// })
// const issaddrules = {
// taskid:[
// { required: true, message: '', trigger: 'blur' }
// ],
// equis:[
// { required: true, message: '', trigger: 'blur' }
// ]
// }
let issarr:any[] = []
let ncCode = ref<any>('')
function tranupdate(v:any) {
issarr = []
if(v.length > 0){
v.forEach((n:any) => {
if(n.split('-').length == 3){
issarr.push(n)
}
})
}
}
let ncid = ''
function issuehand(row:any) {
issueModel.value = true
issarr = []
ncid = row.id
ncCode.value = row.code
}
function isssavehand() {
if(issarr.length > 0){
batchIssue({
ncCode:ncid,
ncCodeList:issarr
}).then(() => {
message.success('操作成功')
setTimeout(() => {
getlist()
issueModel.value = false
},1500)
})
}else{
message.warning('请选择设备')
}
}
//
//let selectedIds = ref<any>([])
function handleExport() {
exportNccode({}).then(rps => {
const url = window.URL.createObjectURL(rps)
const link = document.createElement('a')
link.href = url
link.download = 'NC代码数据.xlsx'
link.click()
window.URL.revokeObjectURL(url)
})
}
getlist()
//
// async function handleDispatchRecord(row:ncCode){
// const ncId = row.id
// // ncDispatchRecords.value = await
// }
onMounted(() => {
//
opertree().then(rps => {
treeData = rps
options.value = flattenTree(treeData)
renderSourceList = function (obj:any) {
return h(NTree, {
style: 'margin: 0 4px;',
keyField: 'value',
checkable: true,
selectable: false,
blockLine: true,
checkOnClick: true,
childrenField:'childList',
data: treeData,
cascade:true,
defaultExpandAll:true,
pattern:obj.pattern,
checkedKeys: xfsbvalue.value,
onUpdateCheckedKeys: (checkedKeys:any) => {
obj.onCheck(checkedKeys)
}
})
}
})
//loadDictOptions()
})
</script>
<style scoped>
</style>

View File

@ -10,15 +10,15 @@
label-placement="left" label-placement="left"
> >
<n-form-item label="图编号"> <n-form-item label="图编号">
<n-input v-model:value="searchForm.ncCode" placeholder="请输入图纸编号" /> <n-input v-model:value="searchForm.drawingCode" placeholder="请输入图文编号" />
</n-form-item> </n-form-item>
<n-form-item label="图纸名称"> <!-- <n-form-item label="图文名称">
<n-input v-model:value="searchForm.ncName" placeholder="请输入图纸名称" /> <n-input v-model:value="searchForm.drawingName" placeholder="请输入图文名称" />
</n-form-item>
<n-form-item label="工序编码">
<n-input v-model:value="searchForm.ncName" placeholder="请输入工序编码" />
</n-form-item> </n-form-item>
<n-form-item label="图文版本">
<n-input v-model:value="searchForm.drawingVersion" placeholder="请输入图文版本" />
</n-form-item> -->
<n-space> <n-space>
@ -35,7 +35,7 @@
</div> </div>
<n-space style="margin-bottom: 15px;"> <n-space style="margin-bottom: 15px;">
<n-button type="primary" @click="addhand(1)" size="small"> <n-button v-if="hasPermission('biz:drawingFile:add')" type="primary" @click="addhand(1)" size="small">
<template #icon> <template #icon>
<n-icon> <n-icon>
<AddOutline /> <AddOutline />
@ -51,7 +51,7 @@
</template> </template>
删除 删除
</n-button> --> </n-button> -->
<n-button type="success" @click="issuehand" size="small"> <n-button type="success" v-if="hasPermission('biz:drawingFile:export')" @click="handleExport" size="small">
<template #icon> <template #icon>
<n-icon> <n-icon>
<ArrowDownCircleOutline /> <ArrowDownCircleOutline />
@ -75,7 +75,7 @@
@update:checked-row-keys="handleCheck" @update:checked-row-keys="handleCheck"
/> />
<div class="pagination-container" style="display: flex; justify-content: flex-end; margin-top: 12px"> <div v-if="pagination.itemCount > pagination.pageSize" class="pagination-container" style="display: flex; justify-content: flex-end; margin-top: 12px">
<n-pagination <n-pagination
v-model:page="pagination.page" v-model:page="pagination.page"
v-model:page-size="pagination.pageSize" v-model:page-size="pagination.pageSize"
@ -110,29 +110,8 @@
> >
<n-grid :cols="1" :x-gap="24"> <n-grid :cols="1" :x-gap="24">
<n-gi> <n-gi>
<n-form-item path="drawingCode" label="图文编号">
<n-form-item path="drawingCode" label="图纸编号"> <n-input v-model:value="formData.drawingCode" disabled placeholder="自动生成" />
<n-input v-model:value="formData.drawingCode" placeholder="请输入图纸编号" />
</n-form-item>
</n-gi>
<n-gi>
<n-form-item path="drawingName" label="图纸名称">
<n-input v-model:value="formData.drawingName" placeholder="请输入图纸名称" />
</n-form-item>
</n-gi>
<n-gi>
<n-form-item label="图纸版本">
<n-input v-model:value="formData.drawingVersion" placeholder="请输入图纸版本" />
</n-form-item>
</n-gi>
<n-gi>
<n-form-item label="工序名称">
<n-input v-model:value="formData.processName" placeholder="请选择工序" />
</n-form-item>
</n-gi>
<n-gi>
<n-form-item label="PLM文档">
<n-input v-model:value="formData.plmDocId" placeholder="请选择PLM文档" />
</n-form-item> </n-form-item>
</n-gi> </n-gi>
<n-gi> <n-gi>
@ -149,23 +128,100 @@
</n-radio-group> </n-radio-group>
</n-form-item> </n-form-item>
</n-gi> </n-gi>
<!-- <n-gi>
<n-form-item path="drawingName" label="图文名称">
<n-input v-model:value="formData.drawingName" placeholder="请输入图文名称" />
</n-form-item>
</n-gi>
<n-gi> <n-gi>
<n-form-item path="gxname" label="上传图纸"> <n-form-item label="图文版本">
<!--:default-file-list="fileList"--> <n-input v-model:value="formData.drawingVersion" placeholder="请输入图文版本" />
<n-upload </n-form-item>
action="https://www.mocky.io/v2/5e4bafc63100007100d8b70f" </n-gi> -->
list-type="image-card" <!-- <n-gi>
> <n-form-item path="processId" label="工序名称">
点击上传 <n-select
</n-upload> v-model:value="selval"
filterable
placeholder="请输入工序名称搜索"
:options="yglist"
:loading="loadingRef"
clearable
remote
:clear-filter-after-select="false"
@search="slehand"
@update:value="updatesle"
/>
</n-form-item>
</n-gi> -->
<!-- <n-gi>
<n-form-item label="PLM文档">
<n-input v-model:value="formData.plmDocId" placeholder="请选择PLM文档" />
</n-form-item>
</n-gi> -->
<n-gi>
<n-form-item label="类型">
<n-radio-group v-model:value="formData.drawingType" :default-value="1" name="radiogroup">
<n-space>
<n-radio :value="0">
图纸
</n-radio>
<n-radio :value="1">
文件
</n-radio>
</n-space>
</n-radio-group>
</n-form-item> </n-form-item>
</n-gi> </n-gi>
<n-gi> <n-gi>
<n-form-item path="fileId" label="上传文件">
<!--:default-file-list="fileList"-->
<!-- <n-upload
:action="URL"
:headers="{
Authorization:TOKEN
}"
list-type="image-card"
>
点击上传
</n-upload> -->
<!-- @before-upload ="flchang"
@change="flchang"
@remove="flchang"-->
<n-upload
directory-dnd
auto-upload="false"
:action="URL"
:headers="{
Authorization:TOKEN
}"
:max="20"
v-model:file-list="flist"
@finish="flchang"
>
<n-upload-dragger>
<div>
<n-icon size="40" :depth="3">
<CloudUploadOutline />
</n-icon>
</div>
<n-text style="font-size: 14px">
点击或者拖动文件到该区域来上传
</n-text>
</n-upload-dragger>
</n-upload>
</n-form-item>
</n-gi>
<!-- <n-gi>
<n-form-item path="gxname" label="备注"> <n-form-item path="gxname" label="备注">
<n-input type="textarea" v-model:value="formData.remark" placeholder="请输入备注" /> <n-input type="textarea" v-model:value="formData.remark" placeholder="请输入备注" />
</n-form-item> </n-form-item>
</n-gi> </n-gi> -->
</n-grid> </n-grid>
</n-form> </n-form>
<template #footer> <template #footer>
@ -182,61 +238,41 @@
</n-modal> </n-modal>
<!--下发--> <!--下发-->
<n-modal <n-modal
v-model:show="issueModel" v-model:show="issueModel"
title="下发" title="下发"
preset="card" preset="card"
style="width: 500px" style="width: 600px"
:mask-closable="false" :mask-closable="false"
> >
<div style="display: flex;padding-bottom: 15px;font-size: 16px;">
<div style="padding: 2px 5px;background: #50a5b7;color: #fff;border-radius: 6px 0 0 6px;">图文编号</div>
<div style="padding: 2px 5px;border: 1px solid #50a5b7;border-radius: 0 6px 6px 0;">{{ imgCode }}</div>
</div>
<n-transfer
v-model:value="xfsbvalue"
style="height:500px;"
:options="options"
:render-source-list="renderSourceList"
source-filterable
@update:value="tranupdate"
/>
<n-form
ref="issformRef"
:model="issformData"
:rules="issaddrules"
label-placement="top"
label-width="100"
>
<n-grid :cols="1" :x-gap="24">
<n-gi>
<n-form-item path="taskid" label="下发任务">
<n-select
:disabled="false"
:render-label="renderlabe"
v-model:value="issformData.taskid"
placeholder="请选择下发任务"
:options="isstasklist"
/>
</n-form-item>
<n-form-item path="equis" label="下发设备">
<n-select
:disabled="false"
:render-label="renderlabe"
v-model:value="issformData.equis"
placeholder="请选择下发设备"
:options="issequiplist"
/>
</n-form-item>
</n-gi>
<!-- <n-gi>
<n-form-item path="ncName" label="下发代码">
<n-input v-model:value="formData.ncName" placeholder="请输入NC代码名称" />
</n-form-item>
</n-gi> -->
</n-grid>
</n-form>
<template #footer> <template #footer>
<n-space justify="end"> <n-space justify="end">
<n-button @click="issueModel = false">取消</n-button> <n-button @click="issueModel = false">取消</n-button>
<n-button <n-button
type="primary" type="primary"
@click="isssavehand" @click="isssavehand"
>确认</n-button> >确认</n-button>
</n-space> </n-space>
</template> </template>
</n-modal> </n-modal>
</div> </div>
@ -258,6 +294,9 @@ import {
NImage, NImage,
NPagination, NPagination,
NGrid, NGrid,
NTree,
// NGi,
NTag,
useMessage, useMessage,
useDialog, useDialog,
} from 'naive-ui' } from 'naive-ui'
@ -266,7 +305,8 @@ import {
SearchOutline, SearchOutline,
RefreshOutline, RefreshOutline,
AddOutline, AddOutline,
ArrowDownCircleOutline ArrowDownCircleOutline,
CloudUploadOutline
} from '@vicons/ionicons5' } from '@vicons/ionicons5'
import { useUserStore } from '@/stores/user' import { useUserStore } from '@/stores/user'
@ -275,11 +315,20 @@ import {
addDrawing, addDrawing,
editDrawing, editDrawing,
drawinglist, drawinglist,
deleteDrawing drawingIssue,
deleteDrawing,
generateDFCode,
exportdraFile,
opertree,
//filelist,
multifilelist
} from '@/api/illustrated' } from '@/api/illustrated'
import {
basicProcessPlanApi
} from '@/api/basicProcessPlan'
const URL = `${import.meta.env.VITE_APP_BASE_API}/sys/file/upload`
const dialog = useDialog() const dialog = useDialog()
@ -287,6 +336,8 @@ const message = useMessage()
const userStore = useUserStore() const userStore = useUserStore()
const TOKEN = userStore.token
// //
const hasPermission = (permission: string) => userStore.hasPermission(permission) const hasPermission = (permission: string) => userStore.hasPermission(permission)
@ -298,9 +349,9 @@ const hasPermission = (permission: string) => userStore.hasPermission(permission
const searchForm = reactive({ const searchForm = reactive({
page: 1, page: 1,
pageSize: 20, pageSize: 20,
ncCode:'', drawingCode:'',
ncName:'', drawingName:'',
status:1 drawingVersion:''
}) })
@ -317,52 +368,60 @@ const pagination = reactive({
}) })
const columns = [ const columns = [
{ {
align:"center", align:"center",
title:"图纸编号", title:"图文编号",
key:"materialName", key:"drawingCode",
minWidth:150
},
{
align:"center",
title:"图纸名称",
key:"materialCode",
minWidth:150
},
{
align:"center",
title:"图纸版本",
key:"assingCode",
minWidth:150
},
{
align:"center",
title:"工序名称",
key:"materialCode",
minWidth:150
},
{
align:"center",
title:"工序编码",
key:"assingCode",
minWidth:150
},
{
align:"center",
title:"图纸缩略图",
key:"materialCode",
minWidth:150,
render(row:any) {
return h(NImage, {width:'50',height:'50',src:'https://07akioni.oss-cn-beijing.aliyuncs.com/07akioni.jpeg'})
}
},
{
align:"center",
title:"PLM文档",
key:"assingCode",
minWidth:150 minWidth:150
}, },
// {
// align:"center",
// title:"",
// key:"drawingName",
// minWidth:150
// },
// {
// align:"center",
// title:"",
// key:"drawingVersion",
// minWidth:150
// },
// {
// align:"center",
// title:"",
// key:"processName",
// minWidth:150
// },
// {
// align:"center",
// title:"",
// key:"processCode",
// minWidth:150
// },
// {
// align:"center",
// title:"",
// key:"materialCode",
// minWidth:150,
// render(row:any) {
// //filePath
// return h(NImage, {width:'50',height:'50',src:'https://07akioni.oss-cn-beijing.aliyuncs.com/07akioni.jpeg'})
// }
// },
// {
// align:"center",
// title:"PLM",
// key:"plmDocId",
// minWidth:150
// },
// {
// align:"center",
// title:"PLM",
// key:"plmVersion",
// minWidth:150
// },
{ {
align:"center", align:"center",
title:"状态", title:"状态",
@ -381,7 +440,7 @@ const columns = [
key:"isIssued", key:"isIssued",
minWidth:150, minWidth:150,
render(row:any) { render(row:any) {
if(row.status == 1){ if(row.isIssued == 1){
return '已下发' return '已下发'
} }
return '未下发' return '未下发'
@ -416,13 +475,13 @@ const columns = [
render(row:any) { render(row:any) {
const buttons:any = [] const buttons:any = []
if(hasPermission('biz:ncCode:issue')){ if(hasPermission('biz:drawingFile:issue')){
buttons.push(h(NButton, { buttons.push(h(NButton, {
size: 'small', size: 'small',
type:'info', type:'info',
ghost:true, ghost:true,
onClick: () => { onClick: () => {
issuehand() issuehand(row)
} }, } },
{ default: () => '下发'} { default: () => '下发'}
)) ))
@ -439,7 +498,7 @@ const columns = [
// )) // ))
// } // }
if(hasPermission('biz:ncCode:edit')){ if(hasPermission('biz:drawingFile:edit')){
buttons.push(h(NButton, { buttons.push(h(NButton, {
size: 'small', size: 'small',
type:'primary', type:'primary',
@ -450,7 +509,7 @@ const columns = [
{ default: () => '编辑'} { default: () => '编辑'}
)) ))
} }
if(hasPermission('biz:ncCode:remove')){ if(hasPermission('biz:drawingFile:remove')){
buttons.push(h(NButton, { buttons.push(h(NButton, {
size: 'small', size: 'small',
type:'error', type:'error',
@ -458,13 +517,16 @@ const columns = [
onClick: () => { onClick: () => {
dialog.warning({ dialog.warning({
title: '警告', title: '警告',
content: `你确定删除NC代码编号为:${row.ncCode}的数据`, content: `你确定删除图文编号为:${row.drawingCode}的数据`,
positiveText: '确定', positiveText: '确定',
negativeText: '取消', negativeText: '取消',
//draggable: true, //draggable: true,
onPositiveClick: () => { onPositiveClick: () => {
deleteDrawing(row.id).then(() => { deleteDrawing(row.id).then(() => {
message.success('操作成功') message.success('操作成功')
setTimeout(() => {
search()
},1000)
}) })
}, },
@ -498,7 +560,9 @@ function search() {
// //
function reset() { function reset() {
searchForm.drawingCode = ''
searchForm.drawingName = ''
searchForm.drawingVersion = ''
} }
// //
@ -526,7 +590,6 @@ function handlePageSizeChange(pageSize: number) {
} }
// // // //
// async function loadDictOptions() { // async function loadDictOptions() {
// //qcCancelLoading = true // //qcCancelLoading = true
@ -536,6 +599,49 @@ function handlePageSizeChange(pageSize: number) {
// }catch {} // }catch {}
// } // }
//
//
//
let loadingRef = ref(false)
let yglist = ref<any>([])
function slehand(v?:any) {
loadingRef.value = true
basicProcessPlanApi.page({
page: 1,
pageSize: 200,
name: v,
}).then((rps:any) =>{
if(rps.list && rps.list.length > 0){
yglist.value = rps.list.map((n:any) => {
return {
label:n.name,
value:n.id //`${n.id}-${n.code}-${n.name}`
}
})
}
loadingRef.value = false
}).catch(() => {
loadingRef.value = false
})
}
function updatesle(v:any) {
if(v){
//let varr = v.split('-')
formData.processId = v+''
// formData.processRouteStepId = varr[0]
// formData.processCode = varr[1]
// formData.processName = varr[2]
}else{
formData.processId = ''
// formData.processRouteStepId = ''
// formData.processCode = ''
// formData.processName = ''
}
//formData.processRouteStepId = v
}
// //
let addModel = ref(false) let addModel = ref(false)
@ -544,25 +650,31 @@ const addformRef = ref()
let formData = reactive<any>({ let formData = reactive<any>({
id:'', id:'',
drawingCode:'', // drawingCode:'', //
drawingName:'', // processId:'', //ID
drawingVersion:'', // drawingType:0, //0 1
processRouteStepId:'', //ID fileId:'', //id
processCode:'', //
processName:'', //
filePath:'', //
fileName:'', //
fileSize:'', //
fileType:'', //
plmDocId:'', //PLMID
plmVersion:'', //PLM
plmStatus:'', //PLM
status:1, //1- 0- status:1, //1- 0-
remark:'' // // drawingName:'', //
// drawingVersion:'', //
// processCode:'', //
// processName:'', //
// filePath:'', //
// fileName:'', //
// fileSize:'', //
// fileType:'', //
// plmDocId:'', //PLMID
// plmVersion:'', //PLM
// plmStatus:'', //PLM
// isIssued:1, //1- 0-
// issueTime:'', //
// issueBy:'', //
// remark:'' //
}) })
const addrules = { const addrules = {
drawingCode: [ drawingCode: [
{ required: true, message: '请输入图纸编号', trigger: 'blur' }, { required: true, message: '请输入图编号', trigger: 'blur' },
// { // {
// validator(rule:any,value: any) { // validator(rule:any,value: any) {
// if(value > pauseform.qcNum){ // if(value > pauseform.qcNum){
@ -573,60 +685,105 @@ const addrules = {
// trigger: ['blur'] // trigger: ['blur']
// } // }
], ],
drawingName:[ processId:[
{ required: true, message: '请输入图纸名称', trigger: 'blur' } { required: true, message: '请选择工序', trigger: 'blur' }
], ],
ncContent:[ fileId:[
{ required: true, message: '请输入NC代码内容', trigger: 'blur' } { required: true, message: '请上传文件', trigger: 'blur' }
] ]
} }
//
let flist = ref<any>([])
function flchang(n:any) {
let v = JSON.parse(n.event.target.responseText)
if(v.data && v.data.id){
formData.fileId = formData.fileId + v.data.id+','
}
console.log(formData.fileId)
}
let isstype = ref<any>(1) let isstype = ref<any>(1)
let selval = ref<any>('')
const cztype = reactive<any>({
1:'新增',
2:'编辑'
})
function addhand(type:any,row?:any) { function addhand(type:any,row?:any) {
addModel.value = true addModel.value = true
formData.value?.restoreValidation() formData.value?.restoreValidation()
isstype.value = type isstype.value = type
if(row){ if(row){
//slehand('')
formData.id = row.id formData.id = row.id
formData.drawingCode = row.drawingCode formData.drawingCode = row.drawingCode
formData.drawingName = row.drawingName formData.processId = row.processId
formData.drawingVersion = row.drawingVersion formData.drawingType = row.drawingType
formData.processRouteStepId = row.processRouteStepId formData.fileId = row.fileId+','
formData.processCode = row.processCode
formData.processName = row.processName
formData.filePath = row.filePath selval.value = row.processId
formData.fileName = row.fileName flist.value.splice(0)
formData.fileSize = row.fileSize multifilelist(row.fileId).then(rps => {
formData.fileType = row.fileType if(rps && rps.length > 0){
formData.plmDocId = row.plmDocId
formData.plmVersion = row.plmVersion // flist.value.push({
formData.plmStatus = row.plmStatus // id: rps.id,
formData.status = row.status // name: rps.originalName,
formData.remark = row.remark // status: 'finished', // 'finished'
// url: rps.url, //
// })
flist.value = rps.map((n:any) => {
return {
id: n.id,
name: n.originalName,
status: 'finished', // 'finished'
url: n.url,
}
})
}
})
// formData.drawingName = row.drawingName
// formData.drawingVersion = row.drawingVersion
// formData.processRouteStepId = row.processRouteStepId
// formData.processCode = row.processCode
// formData.processName = row.processName
// formData.filePath = row.filePath
// formData.fileName = row.fileName
// formData.fileSize = row.fileSize
// formData.fileType = row.fileType
// formData.plmDocId = row.plmDocId
// formData.plmVersion = row.plmVersion
// formData.plmStatus = row.plmStatus
// formData.status = row.status
// formData.remark = row.remark
}else{ }else{
formData.id = '' formData.id = ''
formData.drawingCode = '' formData.drawingCode = ''
formData.drawingName = '' formData.processId = ''
formData.drawingVersion = '' formData.drawingType = 0
formData.processRouteStepId = '' formData.status = 1
formData.processCode = '' formData.fileId = ''
formData.processName = '' flist.value.splice(0)
formData.filePath = '' // formData.drawingCode = ''
formData.fileName = '' // formData.drawingName = ''
formData.fileSize = '' // formData.drawingVersion = ''
formData.fileType = '' // formData.processRouteStepId = ''
formData.plmDocId = '' // formData.processCode = ''
formData.plmVersion = '' // formData.processName = ''
formData.plmStatus = '' // formData.filePath = ''
formData.status = '' // formData.fileName = ''
formData.remark = '' // formData.fileSize = ''
// formData.fileType = ''
// formData.plmDocId = ''
// formData.plmVersion = ''
// formData.plmStatus = ''
// formData.status = 1
// formData.remark = ''
generateDFCode().then(rps => {
formData.drawingCode = rps
})
} }
} }
function addEdi(){ function addEdi(){
@ -639,8 +796,9 @@ function addEdi(){
function savehand() { function savehand() {
addformRef.value?.validate((e:any) => { addformRef.value?.validate((e:any) => {
if (!e) { if (!e) {
formData.fileId = formData.fileId.replace(/,$/,'')
addEdi().then(() => { addEdi().then(() => {
message.success(isstype.value == 1?'新增':'修改') message.success(isstype.value == 1?'新增成功':'修改成功')
setTimeout(() => { setTimeout(() => {
getlist() getlist()
addModel.value = false addModel.value = false
@ -697,37 +855,136 @@ const issaddrules = {
} }
function renderlabe() {} // function renderlabe() {}
function issuehand() { // function issuehand() {
issueModel.value = true // issueModel.value = true
// if(chearr.value.length > 0){ // // if(chearr.value.length > 0){
// batchIssue(chearr.value).then(() => { // // batchIssue(chearr.value).then(() => {
// message.success('') // // message.success('')
// }) // // })
// }else{ // // }else{
// message.error('') // // message.error('')
// } // // }
// }
let treeData:any = []
let xfsbvalue = ref<Array<string | number>>([])
let renderSourceList:any = ''
let options = ref<any>([]) //flattenTree(createData())
function flattenTree(list: undefined | any[]) {
const result: any[] = []
function flatten(_list: any[] = []) {
_list.forEach((item) => {
//result.push(item)
if(item.childList){
flatten(item.childList)
}else{
result.push(item)
}
})
}
flatten(list)
return result
}
let issarr:any[] = []
let imgCode = ref<any>('')
function tranupdate(v:any) {
issarr = []
if(v.length > 0){
v.forEach((n:any) => {
if(n.split('-').length == 3){
issarr.push(n)
}
})
}
}
let imgid = ''
function issuehand(row:any) {
issueModel.value = true
issarr = []
imgid = row.id
imgCode.value = row.drawingCode
} }
const issformRef = ref()
function isssavehand() { function isssavehand() {
issformRef.value?.validate((e:any) => { if(issarr.length > 0){
if (!e) { drawingIssue({
id:imgid,
twCode:issarr
}).then(() => {
message.success('操作成功') message.success('操作成功')
setTimeout(() => { setTimeout(() => {
getlist() getlist()
issueModel.value = false issueModel.value = false
},1500) },1500)
})
}else{
message.warning('请选择设备')
} }
}
const issformRef = ref()
// function isssavehand() {
// issformRef.value?.validate((e:any) => {
// if (!e) {
// message.success('')
// setTimeout(() => {
// getlist()
// issueModel.value = false
// },1500)
// }
// })
// }
function handleExport() {
exportdraFile({}).then(rps => {
const url = window.URL.createObjectURL(rps)
const link = document.createElement('a')
link.href = url
link.download = '图文数据.xlsx'
link.click()
window.URL.revokeObjectURL(url)
}) })
} }
getlist() getlist()
onMounted(() => { onMounted(() => {
//
opertree().then(rps => {
treeData = rps
options.value = flattenTree(treeData)
renderSourceList = function (obj:any) {
return h(NTree, {
style: 'margin: 0 4px;',
keyField: 'value',
checkable: true,
selectable: false,
blockLine: true,
checkOnClick: true,
childrenField:'childList',
data: treeData,
cascade:true,
defaultExpandAll:true,
pattern:obj.pattern,
checkedKeys: xfsbvalue.value,
onUpdateCheckedKeys: (checkedKeys:any) => {
obj.onCheck(checkedKeys)
}
})
}
})
//loadDictOptions() //loadDictOptions()
}) })

View File

@ -16,7 +16,7 @@ export default defineConfig({
emptyOutDir: true emptyOutDir: true
}, },
server: { server: {
host: true, // host:'192.168.12.11', //true,
port: 3000, port: 3000,
proxy: { proxy: {
'/api': { '/api': {