Commit 2c71f276 authored by jingnan's avatar jingnan 👀

实物构型管理功能开发代码暂存

parent 761f5ad8
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="28px" height="26px" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(1 0 0 1 -499 -486 )">
<path d="M 26.5714285714287 5.19661458333337 C 26.9971988795519 5.36588541666663 27.327731092437 5.60850694444446 27.5630252100841 5.92447916666663 C 28.0112044817927 6.56770833333337 28.1120448179272 7.29557291666663 27.8655462184875 8.10807291666663 L 23.2436974789916 23.4440104166666 C 23.0308123249299 24.1662326388889 22.6022408963586 24.7727864583334 21.9579831932774 25.263671875 C 21.313725490196 25.7545572916666 20.6274509803923 26 19.8991596638655 26 L 4.38655462184875 26 C 3.52380952380963 26 2.6918767507002 25.6981336805555 1.89075630252091 25.0944010416666 C 1.08963585434185 24.4906684027778 0.532212885153967 23.7486979166666 0.218487394957947 22.8684895833334 C -0.0504201680671486 22.1124131944445 -0.0616246498600503 21.3958333333334 0.184873949579924 20.71875 C 0.184873949579924 20.6736111111111 0.201680672268822 20.5212673611111 0.235294117647072 20.26171875 C 0.268907563025323 20.0021701388889 0.291316526610672 19.7934027777778 0.302521008403346 19.6354166666666 C 0.31372549019602 19.5451388888889 0.296918767506895 19.423828125 0.252100840336198 19.271484375 C 0.207282913165272 19.119140625 0.190476190476147 19.0091145833334 0.201680672268822 18.94140625 C 0.224089635854398 18.8172743055555 0.268907563025323 18.6987847222222 0.336134453781597 18.5859375 C 0.403361344537871 18.4730902777778 0.495798319327832 18.3404947916666 0.613445378151255 18.1881510416666 C 0.731092436974677 18.0358072916666 0.823529411764639 17.9032118055555 0.890756302520913 17.7903645833334 C 1.14845938375356 17.3615451388889 1.40056022408953 16.8452690972222 1.64705882352951 16.2415364583334 C 1.89355742296925 15.6378038194445 2.06162464986005 15.1215277777778 2.15126050420167 14.6927083333334 C 2.18487394957992 14.5798611111111 2.18767507002804 14.4105902777778 2.15966386554624 14.1848958333334 C 2.13165266106444 13.9592013888889 2.12885154061632 13.8012152777778 2.15126050420167 13.7109375 C 2.18487394957992 13.5868055555555 2.280112044818 13.4288194444445 2.43697478991589 13.2369791666666 C 2.59383753501402 13.0451388888889 2.68907563025209 12.9153645833334 2.72268907563034 12.84765625 C 2.95798319327741 12.44140625 3.19327731092426 11.9223090277778 3.42857142857133 11.2903645833334 C 3.6638655462184 10.6584201388889 3.8039215686274 10.1506076388889 3.84873949579833 9.76692708333337 C 3.859943977591 9.66536458333337 3.84593837535022 9.48480902777783 3.80672268907574 9.22526041666663 C 3.76750700280104 8.96571180555554 3.77030812324938 8.80772569444446 3.81512605042008 8.75130208333337 C 3.859943977591 8.60460069444446 3.98319327731087 8.43250868055554 4.18487394957992 8.23502604166663 C 4.38655462184875 8.03754340277783 4.50980392156862 7.91059027777783 4.55462184873954 7.85416666666663 C 4.76750700280104 7.56076388888892 5.00560224089645 7.083984375 5.26890756302532 6.423828125 C 5.53221288515397 5.763671875 5.68627450980398 5.21918402777783 5.73109243697468 4.79036458333337 C 5.74229691876758 4.70008680555554 5.72549019607845 4.55620659722217 5.68067226890753 4.35872395833337 C 5.6358543417366 4.16124131944446 5.62464985994393 4.01171875 5.64705882352951 3.91015625 C 5.66946778711485 3.81987847222217 5.719887955182 3.71831597222217 5.79831932773118 3.60546875 C 5.87675070028013 3.49262152777783 5.97759103641465 3.36284722222217 6.10084033613452 3.21614583333337 C 6.2240896358544 3.06944444444446 6.31932773109247 2.95095486111109 6.38655462184875 2.86067708333331 C 6.47619047619037 2.72526041666669 6.56862745098033 2.55316840277777 6.6638655462184 2.34440104166669 C 6.75910364145648 2.13563368055554 6.84313725490188 1.93815104166669 6.9159663865546 1.751953125 C 6.98879551820733 1.56575520833331 7.07843137254895 1.36263020833331 7.18487394957992 1.142578125 C 7.29131652661067 0.922526041666686 7.40056022408953 0.741970486111086 7.51260504201673 0.600911458333314 C 7.62464985994393 0.459852430555543 7.77310924369749 0.327256944444457 7.95798319327741 0.203125 C 8.14285714285711 0.0789930555555429 8.34453781512616 0.0141059027777715 8.56302521008411 0.00846354166668561 C 8.78151260504205 0.00282118055554292 9.04761904761904 0.0338541666666856 9.36134453781506 0.1015625 L 9.34453781512616 0.15234375 C 9.77030812324938 0.05078125 10.0560224089636 0 10.2016806722688 0 L 22.9915966386554 0 C 23.8207282913165 0 24.4593837535015 0.315972222222229 24.90756302521 0.947916666666686 C 25.3557422969188 1.57986111111109 25.4565826330531 2.31336805555554 25.2100840336134 3.1484375 L 20.6050420168067 18.484375 C 20.2016806722688 19.8272569444445 19.8011204481793 20.693359375 19.4033613445379 21.0826822916666 C 19.0056022408965 21.4720052083334 18.2857142857142 21.6666666666666 17.2436974789916 21.6666666666666 L 2.63865546218494 21.6666666666666 C 2.3361344537816 21.6666666666666 2.12324929971987 21.7513020833334 2 21.9205729166666 C 1.87675070028013 22.1011284722222 1.87114845938368 22.34375 1.98319327731087 22.6484375 C 2.2521008403362 23.4383680555555 3.05882352941171 23.8333333333334 4.40336134453787 23.8333333333334 L 19.9159663865546 23.8333333333334 C 20.2408963585435 23.8333333333334 20.5546218487395 23.7458767361111 20.8571428571429 23.5709635416666 C 21.1596638655462 23.3960503472222 21.3557422969188 23.1618923611111 21.4453781512605 22.8684895833334 L 26.4873949579833 6.16145833333337 C 26.5658263305322 5.91319444444446 26.593837535014 5.59157986111109 26.5714285714287 5.19661458333337 Z M 10.0336134453783 4.875 L 9.68067226890753 5.95833333333337 C 9.6358543417366 6.10503472222217 9.64705882352951 6.23198784722217 9.71428571428578 6.33919270833337 C 9.78151260504205 6.44639756944446 9.89355742296925 6.5 10.0504201680671 7 L 20.2689075630251 7 C 20.4145658263305 6.5 20.5574229691877 6.44639756944446 20.6974789915967 6.33919270833337 C 20.8375350140057 6.23198784722217 20.9299719887956 6.10503472222217 20.9747899159663 5.95833333333337 L 21.327731092437 4.875 C 21.372549019608 4.72829861111109 21.3613445378151 4.60134548611109 21.2941176470588 4.494140625 C 21.2268907563025 4.38693576388891 21.1148459383753 4.33333333333337 20.9579831932774 4.33333333333337 L 10.7394957983192 4.33333333333337 C 10.593837535014 4.33333333333337 10.4509803921569 4.38693576388891 10.3109243697479 4.494140625 C 10.1708683473389 4.60134548611109 10.0784313725489 4.72829861111109 10.0336134453783 4.875 Z M 8.63865546218494 9.20833333333337 L 8.28571428571422 10.2916666666666 C 8.24089635854352 10.4383680555555 8.2521008403362 10.5653211805555 8.31932773109247 10.6725260416666 C 8.38655462184875 10.7797309027778 8.49859943977594 10.8333333333334 8.65546218487384 11 L 18.873949579832 11 C 19.0196078431372 10.8333333333334 19.1624649859943 10.7797309027778 19.3025210084033 10.6725260416666 C 19.4425770308123 10.5653211805555 19.5350140056023 10.4383680555555 19.579831932773 10.2916666666666 L 19.9327731092437 9.20833333333337 C 19.9775910364147 9.06163194444446 19.9663865546217 8.93467881944446 19.8991596638655 8.82747395833337 C 19.8319327731092 8.72026909722217 19.719887955182 8.66666666666663 19.5630252100841 9 L 9.34453781512616 9 C 9.19887955182071 8.66666666666663 9.0560224089636 8.72026909722217 8.9159663865546 8.82747395833337 C 8.7759103641456 8.93467881944446 8.68347338935564 9.06163194444446 8.63865546218494 9.20833333333337 Z " fill-rule="nonzero" fill="#9dc3e6" stroke="none" transform="matrix(1 0 0 1 499 486 )" />
</g>
</svg>
\ No newline at end of file
/*
* @Author: gjn
* @Date: 2024-07-08 10:39:44
* @Description:
*/
import {
post, del, put, downloadPDF
} from '../utils/http.js'
/**
* 库存台账
*/
// 查询库存台账
export function getInventoryList(params) {
return post('/Inventory/find/recursion', params)
}
// 查询库存台账
export function getCustomInventoryList(params) {
return post('/Inventory/list/recursion', params)
}
/**
* 库存流水
*/
// 查询库存流水台账
export function getInventoryFlowList(params) {
return post('/InventoryFlow/find/recursion', params)
}
// 查询库存流水台账
export function getCustomInventoryFlowList(params) {
return post('/InventoryFlow/list/recursion', params)
}
/**
*不合格/试验报废数查询
*/
// 不合格数查询
export function getUnacceptedTable(params) {
return post('/DxWorkflowTask/listCustomQueryByNoPass/findTest', params)
}
// 试验报废查询
export function getScrappedTable(params) {
return post('/DxWorkflowTask/listCustomQueryIsDestroy/findExperment', params)
}
/**
* 入厂检验
*/
// 查询入厂检验的表单
export function getInStorageRequestList(params) {
return post('/DxWorkflowTask/inStorageTestTaskList', params)
}
export function getInStorageRequestListAmount(params) {
return post('/DxWorkflowTask/inStorageTestTaskList/amount', params)
}
// 验收单保存
export function saveCheckNo(params) {
return post('/JobResponseInTest/recursion', params)
}
// 验收单初始化
export function getCheckNoList(params) {
return post('/JobResponseInTest/find/recursion', params)
}
// 入厂试验附件保存
export function saveExpe(params) {
return post('/JobResponseInStorage/recursion', params)
}
// 入厂试验附件初始化
export function getExpeList(params) {
return post('/JobResponseInStorage/find/recursion', params)
}
// 驳回
export function reject(params, reason) {
return post(`/DxWorkflowTask/apply/reject?taskIds=${params.join(',')}&assignee=${localStorage.getItem('userId')}&backReason=${reason}`, {})
}
// 检验界面驳回
export function inspectReject(params) {
return post(`/DxWorkflowTask/apply/reject/all`, params)
}
// 入厂检验界面检验完成
export function inspectPass(params) {
return post(`/StorageRequestItem/purchaseApply/change/tranGm403BillItemInfoVo`, params)
}
// 检验完成
export function pass(params) {
return post(`/DxWorkflowTask/apply/pass?taskIds=${params.join(',')}&assignee=${localStorage.getItem('userId')}`, {})
}
// 检验申请
export function check(params, userIds) {
//
return post(`/StorageRequestItem/purchaseApply/check?taskIds=${params.join(',')}&assignee=${localStorage.getItem('userId')}&userIds=${userIds.join(',')}`, {})
}
// 试验申请
export function experiment(params, userIds) {
return post(`/StorageRequestItem/purchaseApply/experiment?taskIds=${params.join(',')}&assignee=${localStorage.getItem('userId')}&userIds=${userIds.join(',')}`, {})
}
// 例外放行
export function except(params) {
return post(`/StorageRequestItem/purchaseApply/except?taskIds=${params.join(',')}&assignee=${localStorage.getItem('userId')}`, {})
}
// 判断选中的数据是否已经走过例外放行申请
export function getExcept(params) {
return post(`/StorageRequestItem/getExceptIds?itemIds=${params.join(',')}`, {})
}
// 基准路径
export function downloadPdfHandle() {
return downloadPDF()
}
/**
* 供外出库
*/
// 出库
// export function searchOutStorage(params) {
// return post(`/OutStorageRequest/find/recursion`, params)
// }
// 我的待办,己办任务,办结任务 //领用出库and配套出库and供外出库
export function searchOutStorageTask(params) {
return post(`/OutStorageRequest/list/task`, params)
}
// 我的请求 ////领用出库and配套出库and供外出库
export function searchSelfRequest(params) {
return post(`/OutStorageRequest/selfRequest`, params)
}
export function searchOutStorage(params) {
return post(`/OutStorageRequest/userAndOutList/findRecursion`, params)
}
// 领用出库审核查询
export function searchOutStorageExamine(params) {
return post(`/DxWorkflowTask/outStorageTaskList`, params)
}
// 供外出库审核
export function externalDeliveryApproval(params) {
return post(`/OutStorageRequest/getAllByUrlName`, params)
}
// 新增
export function outStorageAdd(params) {
return post(`/OutStorageRequest/recursion`, params)
}
export function outStorageAddUpdate(id, params) {
return post(`/StorageRequestItem/saveUse?outId=${id}`, params)
}
// 编辑`
export function outStorageEdit(params) {
return put(`/OutStorageRequest`, params)
}
// 查询库房
export function DxProductUnitUsageLink(params) {
return post(`/DxProductUnitUsageLink/find/recursion`, params)
}
// 单个删除
export function outStorageDel(id) {
return post(`/OutStorageRequest/purchaseApply/delete?ids=${id}`)
}
// 申请明细
// 查询
export function searchStorageRequest(params) {
return post(`/StorageRequestItem/find/recursion`, params)
}
// 单个删除
export function storageRequestDel(id) {
return del(`/StorageRequestItem/${id}`)
}
// 机型代码接口
export function getAircraftType(params) {
return post('/DxProductDef/find/recursion', params)
}
// 物料查询
export function getDxProcessMaterial(params) {
return post('/DxProcessMaterial/find/recursion', params)
}
// 子表删除
export function removeMaterial(params) {
return post('/InventoryRequestUsageLink/recursion', params)
}
// 供外出库申请
// 提交申请
export function submitOutPass(params, userIds) {
return post(`/OutStorageRequest/outApply/submit?applyIds=${params.join(',')}&assignee=${localStorage.getItem('userId')}&userIdList=${userIds}`)
}
// 提交申请
export function submitPass(params) {
return post(`/OutStorageRequest/outApply/submit?applyIds=${params.join(',')}&assignee=${localStorage.getItem('userId')}`)
}
// 驳回
export function rejectOutStorage(params, reason) {
return post(`OutStorageRequest/apply/back?applyIds=${params.join(',')}&assignee=${localStorage.getItem('userId')}&backReason=${reason}`)
}
// 领用校验是否存在申请明细
export function OutStorageRequestCheck(params) {
return post(`/OutStorageRequest/reviewRequestApplicationBefore/check?outStorageRequestIds=${params.join(',')}`)
}
// 三期处理台账查询
export function InStorageExpireInventory(params) {
return post('/DxWorkflowTask/outStorageTaskList', params)
}
// 三期处理申请
export function InStorageExpireApply(params) {
return post('/InventoryRequestExpire/threeStageTreatment/dealWith', params)
}
// 通过当前明细的id获取流程任务的id
export function getProcessId(params) {
return post(`/DxProcessOperation/find/recursion`, params)
}
// 装配执行 编辑器 附件上传 获取
export function assemblyExecutionUpload(params) {
return post(`/DxProcessOperation/find/recursion`, params)
}
// 装配执行 编辑器 附件上传 保存
export function AttachmentPreservation(params) {
return post(`/DxProcessOperation/recursion`, params)
}
/**
* 召回处理数据获取
* @param {*} params
* @returns
*/
export function recallProcess(params) {
return post('/DxWorkflowTask/outStorageTaskLists', params)
}
<template>
<section>
<div class="physicalConfigurationManagement-from">
<div class="icon-wrapper">
<img src="/icons/r-access.png" class="icon">
<span>架次查询</span>
</div>
<el-form ref="ruleForm" :model="form" label-width="70px">
<el-form-item label="机型:" prop="model">
<el-select v-model="form.model" clearable @change="getAddRecursion">
<el-option
v-for="item in dataModel"
:key="item.id"
:label="item.resName"
:value="item.resCode"
/>
</el-select>
</el-form-item>
<el-form-item label="架次:" prop="sortie">
<el-select v-model="form.sortie" filterable clearable :loading="sortiesLoading" @change="getTreeData">
<el-option
v-for="item in dataSortie"
:key="item.id"
:label="item.serialNo"
:value="item.serialNo"
/>
</el-select>
</el-form-item>
</el-form>
</div>
</section>
</template>
<script>
export default {
data() {
return {
form: {
model: '',
sortie: ''
},
dataModel: [],
sortiesLoading: true,
dataSortie: [],
isCollapse: false
}
},
mounted() {
this.getModelData()
},
methods: {
/**
* 获取机型
*/
getModelData() {
this.modelData = []
const params = { 'searchItems': { 'items': [] }, 'sortItem': [{ 'fieldName': 'modifyTime', 'sortOrder': 'asc' }] }
this.$api.searchApi('AircraftType', params).then((res) => {
if (res.items && res.items.content && res.items.content.length) {
this.dataModel = res.items.content.map(p => {
return {
id: p.id,
resCode: p.defCode,
resName: p.defName
}
})
} else {
this.$message({
showClose: true,
message: res.message,
type: 'error'
})
}
})
.catch((err) => console.log(err))
.finally(() => {
this.$nextTick(() => {
this.form.model = this.dataModel[0].resCode
this.getAddRecursion()
})
})
},
/**
* 获取架次数据
*/
getAddRecursion() {
this.sortiesLoading = true
const params = {
'searchItems': {
'items': [{
'fieldName': 'aircraftTypeId',
'operator': 'EQ',
'value': this.dataModel.filter(p => p.resCode === this.form.model)[0].id
}]
},
sortItem: [{ fieldName: 'defCode', sortOrder: 'asc' }]
}
this.dataSortie = []
this.$api.searchApi('AircraftSorties', params)
.then((res) => {
if (res.items && res.items.content && res.items.content.length) {
this.dataSortie = res.items.content.map(p => {
return {
id: p.id,
serialNo: p.defCode
}
})
} else {
this.$message({
showClose: true,
message: res.message,
type: 'error'
})
}
})
.catch((err) => console.log(err))
.finally(() => {
this.$nextTick(() => {
if (this.dataSortie.length) this.form.sortie = this.dataSortie[0].serialNo
this.sortiesLoading = false
this.$parent.$parent.$refs.right.handleClick()
this.getTreeData()
})
})
},
getTreeData() {
this.$parent.$refs.tree.getTreeData()
}
}
}
</script>
<style lang="scss" >
.physicalConfigurationManagement-from {
border: 1px solid #ccc;
border-radius: 8px;
box-sizing: border-box;
padding: 20px;
.el-select {
width: 100%;
}
.el-form-item:last-child {
margin-bottom: 0px;
}
.form-btn {
text-align: center;
}
.icon-wrapper {
.icon,
span {
vertical-align: middle;
}
margin-bottom: 10px;
}
}
</style>
<template>
<section class="physicalConfigurationManagement-left-tree">
<el-input
v-model="nameOrNum"
clearable
placeholder="请输入内容"
/>
<el-tree
ref="tree"
class="tree"
:data="treeData"
node-key="id"
lazy
:load="loadNode"
accordion
:default-expanded-keys="defaultExpandedKeys"
:props="defaultProps"
:highlight-current="true"
:expand-on-click-node="false"
@node-click="handleNodeClick"
>
<span
slot-scope="{ data, node }"
class="custom-tree-node changeText"
:class="data.state"
>
<span class="tree-row">
<i :class="'tree' + node.level" />
<span class="label" :title="data.serialNumber">{{
data.serialNumber
}}</span>
<span v-show="node.level > 1">{{ "," + data.name }}</span>
<span v-show="node.level > 3">{{ "," + data.gaceVersion }}</span>
</span>
</span>
</el-tree>
</section>
</template>
<script>
// import { post } from '@/utils/http'
export default {
name: 'Tree',
props: {
searchForm: {
type: Object,
default: () => {}
}
},
data() {
return {
nameOrNum: '',
treeData: [],
defaultExpandedKeys: [],
rowData: {},
defaultProps: {
children: 'dxProcessPlanVos',
label: 'serialNumber',
isLeaf: 'isLeaf'
}
}
},
watch: {
nameOrNum: {
handler: function(keyword) {
// this.getExtPosition()
// const spans = document.getElementsByClassName('changeText')
// if (spans.length > 0) {
// for (let i = 0; i < spans.length; i++) {
// var labelText = spans[i].textContent
// const reg = keyword
// .replace(/\(/g, '\\(')
// .replace(/\)/g, '\\)')
// .replace(/\./g, '\\.')
// const allVal = labelText.match(new RegExp(reg, 'ig'))
// if (allVal) {
// const newAllVal = [...new Set(allVal)]
// for (let j = 0; j < newAllVal.length; j++) {
// if (newAllVal[j]) {
// const tp = newAllVal[j]
// .replace(/\(/g, '\\(')
// .replace(/\)/g, '\\)')
// .replace(/\./g, '\\.')
// labelText = labelText.replace(
// new RegExp(tp, 'g'),
// '*' + newAllVal[j] + '*'
// )
// }
// }
// for (let k = 0; k < allVal.length; k++) {
// if (allVal[k]) {
// labelText = labelText.replace(
// '*' + allVal[k] + '*',
// '<span style="color:blue">' +
// allVal[k] +
// '</span>'
// )
// }
// }
// }
// spans[i].innerHTML = labelText
// }
// }
}
},
rowData: {
immediate: true,
deep: true,
handler(val) {
this.$bus.$emit('treeCurrentRowData', val)
}
}
},
mounted() {},
methods: {
handleNodeClick(data, node, options) {
const cnode = this.$refs.tree.getNode(this.rowData.id)
const assembly = this.$parent.$parent.$parent.$parent.$refs.right
const table = assembly && assembly.$refs[assembly.activeName].$refs.table
if (
assembly.activeName === 'BRecord' ||
assembly.activeName === 'CRecord' ||
assembly.activeName === 'ERecord'
) {
if (node.level < 3) {
node.isCurrent = false
cnode.isCurrent = true
} else {
cnode.isCurrent = false
node.isCurrent = true
this.rowData = data
table.tablePagination.currentPage = 1
table.tablePagination.pageSize = 10
table.init()
}
} else {
if (node.level < 4) {
node.isCurrent = false
cnode.isCurrent = true
} else {
cnode.isCurrent = false
node.isCurrent = true
this.rowData = data
if (this.$parent.$parent.$parent.$parent.$refs.right.activeName === 'FPreview') {
assembly.$refs[assembly.activeName].init()
} else {
table.tablePagination.currentPage = 1
table.tablePagination.pageSize = 10
table.init()
}
}
}
},
getCurVal(data) {
if (data.length && data[0].dxProcessPlanVos) {
this.defaultExpandedKeys.push(data[0].id)
this.getCurVal(data[0].dxProcessPlanVos)
} else {
this.$nextTick(() => {
const node = this.$refs.tree.getNode(data[0].id)
node.isCurrent = true
this.rowData = data[0]
})
}
},
setBRecordOrCRecord() {
const node = this.$refs.tree.getNode(this.rowData.id)
if (node && node.level === 3) {
node.isCurrent = false
node.childNodes[0].isCurrent = true
this.rowData = node.childNodes[0].data
}
},
loadNode(node, resolve) {
this.requestUrl = ''
if (node.level === 0) {
this.getExtPosition(resolve)
// return resolve(this.treeData)
}
if (node.level === 1) {
return resolve(node.data.dxProcessPlanVos)
} else if (node.level === 2) {
if (node.data) {
this.getCASData(node, resolve)
}
} else if (node.level === 3) {
if (node.data) {
this.getJoExecutePlan(node, resolve)
}
}
},
/**
* 获取树结站位数据
*/
getExtPosition(resolve) {
const params = {
'searchItems': {
'children': [
{
'items': [
{
'fieldName': 'aircraftSortiesId',
'operator': 'EQ',
'value': this.searchForm.sorties || ''
}
],
'operator': 'AND'
},
{
'items': [
{
'fieldName': 'extPositionLinks.target.sourceExtProcessUsageLink.target.sourceExtProcessUsageLink.target.serialNumber',
'operator': 'LIKE',
'value': this.nameOrNum || ''
},
{
'fieldName': 'extPositionLinks.target.sourceExtProcessUsageLink.target.sourceExtProcessUsageLink.target.sourceExtProcessUsageLink.target.serialNumber',
'operator': 'LIKE',
'value': this.nameOrNum || ''
}
],
'operator': 'OR'
}
]
},
'openProps': [],
'sortItem': [
{
'fieldName': 'serialNumber',
'sortOrder': 'desc'
}
]
}
this.$api.searchApi('ExtPosition', params).then((res) => {
const data = res.items.content || []
data.map((item) => {
if (item.extPositionLinks) {
item.dxProcessPlanVos = item.extPositionLinks.map(es => {
return {
serialNumber: es.target.serialNumber,
name: es.target.name,
id: es.id,
gaceVersion: es.target.gaceVersion,
state: es.isOk ? 'Delivery' : 'Finish'
}
})
}
if (item.extPositionPlans && item.extPositionPlans.length) {
item.state = item.extPositionPlans[0].planState || null
}
})
this.treeData = [
{
serialNumber: `BBOM-${this.searchForm.modelName}-${this.searchForm.sortiesName}`,
name: '',
gaceVersion: '',
dxProcessPlanVos: data,
state: ''
}
]
this.defaultExpandedKeys = []
this.treeData.length && this.getCurVal(this.treeData)
return resolve(this.treeData)
})
.catch((err) => console.log(err))
.finally(() => {
this.$nextTick(() => {
const assembly = this.$parent.$parent.$parent.$parent.$refs.right
if (assembly.activeName === 'FPreview') {
assembly.$refs[assembly.activeName].init()
} else {
assembly.$refs[assembly.activeName].$refs.table.init()
}
})
})
},
/**
* 获取树结CAS数据
*/
getCASData(node, resolve) {
const params = {
'searchItems': {
'children': [
{
'items': [
{
'fieldName': 'sorties',
'operator': 'EQ',
'value': this.searchForm.sortiesName || ''
},
{
'fieldName': 'positionNumber',
'operator': 'EQ',
'value': node.data.serialNumber || ''
},
{
'fieldName': 'subTypeName',
'operator': 'EQ',
'value': 'ExtProcessPlanAssemblyUnit'
}
],
'operator': 'AND'
},
{
'items': [
{
'fieldName': 'sourceExtProcessUsageLink.target.sourceExtProcessUsageLink.target.serialNumber',
'operator': 'LIKE',
'value': this.nameOrNum || ''
},
{
'fieldName': 'sourceExtProcessUsageLink.target.sourceExtProcessUsageLink.target.sourceExtProcessUsageLink.target.serialNumber',
'operator': 'LIKE',
'value': this.nameOrNum || ''
}
],
'operator': 'OR'
}
]
},
'openProps': [
{
'name': 'wrProduction'
}
],
'sortItem': [
{
'fieldName': 'serialNumber',
'sortOrder': 'desc'
}
]
}
this.$api.searchApi('ExtProcessPlan', params)
.then((res) => {
res.items.content.forEach(element => {
if (element.wrProduction && element.wrProduction.length) {
element.state = element.wrProduction[0].planState || null
}
element.level = 3
element.dxProcessPlanVos = []
})
return resolve(res.items.content)
})
.catch((err) => {
console.log(err)
return resolve([])
})
.finally(() => {})
},
/**
* 获取树结CAS数据
*/
getJoExecutePlan(node, resolve) {
console.log('🚀 node:', node)
const params = {
'searchItems': {
'children': [
{
'items': [
{
'fieldName': 'sorties',
'operator': 'EQ',
'value': this.searchForm.sortiesName || ''
},
{
'fieldName': 'positionNumber',
'operator': 'EQ',
'value': node.parent.data.serialNumber || ''
},
{
'fieldName': 'serialNumber',
'operator': 'LIKE',
'value': node.data.serialNumber || ''
},
{
'fieldName': 'subTypeName',
'operator': 'IN',
'value': [
'ExtProcessPlanAssembly',
'ExtProcessPlanAOR'
]
}
],
'operator': 'AND'
},
{
'items': [
{
'fieldName': 'serialNumber',
'operator': 'LIKE',
'value': this.nameOrNum || ''
},
{
'fieldName': 'sourceExtProcessUsageLink.target.serialNumber',
'operator': 'LIKE',
'value': this.nameOrNum || ''
}
],
'operator': 'OR'
}
]
},
'openProps': [
{
'name': 'joExecutePlan'
}
],
'sortItem': [
{
'fieldName': 'serialNumber',
'sortOrder': 'desc'
}
]
}
this.$api.searchApi('ExtProcessPlan', params)
.then((res) => {
res.items.content.forEach(element => {
if (element.joExecutePlan && element.joExecutePlan.length) {
element.state = element.joExecutePlan[0].planState || null
}
element.level = 3
element.isLeaf = true
})
return resolve(res.items.content)
})
.catch((err) => {
console.log(err)
return resolve([])
})
.finally(() => {})
}
}
}
</script>
<style lang="scss" >
::-webkit-scrollbar {
width: 6px;
height: 6px;
}
::-webkit-scrollbar-thumb {
border-radius: 100px;
background: #dcdfe6;
}
.physicalConfigurationManagement-left-tree {
// margin-top: 20px;
// border: 1px solid #ccc;
border-radius: 7px;
box-sizing: border-box;
width: 100%;
height: calc(100% - 66px);
// height: 20px;
// flex-grow: 1;
// display: flex;
// flex-direction: column;
> .el-input {
padding: 10px;
width: -webkit-fill-available;
// border-bottom: 1px solid #ccc;
}
> .tree {
overflow: auto;
padding: 10px;
height: 100%;
//当前选中项
.el-tree-node {
width: max-content;
min-width: 100%;
}
.el-tree-node.is-current > .el-tree-node__content {
background-color: rgb(214, 214, 214) !important;
}
.el-tree-node:focus > .el-tree-node__content {
background-color: #fff;
}
&.el-tree--highlight-current .el-tree-node__content {
&.disabled {
color: #c0c4cc;
cursor: not-allowed;
background-color: #fff;
}
&.is-curr:not(.disabled),
&:hover:not(.disabled) {
font-weight: bold;
color: rgb(31, 30, 30);
background-color: rgb(214, 214, 214);
}
}
.el-tree-node {
// margin: 20px 0 !important;
.el-tree-node__content {
height: 40px !important;
// &:hover {
// font-weight: bold;
// color: #000;
// }
i {
display: inline-block;
vertical-align: middle;
margin: 10px;
}
.tree1 {
background: url("/icons/aircraft.png") no-repeat;
width: 32px;
height: 30px;
}
.tree2 {
width: 21px;
height: 21px;
background: url("/icons/u513.png") no-repeat;
background-size: contain;
}
.tree3 {
width: 21px;
height: 21px;
background: url("/icons/u517.png") no-repeat;
background-size: contain;
}
.tree4 {
width: 16px;
height: 16px;
background: url("/icons/u96.png") no-repeat;
background-size: contain;
}
.tree5 {
width: 16px;
height: 16px;
background: url("/icons/u96.png") no-repeat;
background-size: contain;
}
.label {
vertical-align: middle;
}
.Issued.custom-tree-node,
.Run.custom-tree-node,
.New.custom-tree-node,
.Yes.custom-tree-node,
.Delivery.custom-tree-node {
color: #0000ff;
}
.Finish.custom-tree-node {
color: #008000;
}
.Reserved.custom-tree-node {
color: #ff0000;
}
.Not.custom-tree-node {
color: #999999;
}
.Paused.custom-tree-node {
color: #ffff00;
}
}
}
}
}
</style>
<template>
<div class="physicalConfigurationManagement_left">
<div class="search-box box">
<div class="title"><i class="search-icon" /><span>架次搜索</span></div>
<div class="row">
<label>机型:</label>
<el-select v-model="form.model" size="mini" placeholder="请选择">
<el-option
v-for="item in modelData"
:key="item.id"
:label="item.defName"
:value="item.id"
/>
</el-select>
</div>
<div class="row">
<label>架次:</label>
<el-select v-model="form.sorties" filterable clearable size="mini" placeholder="请选择" :loading="sortiesLoading">
<el-option
v-for="item in sortiesData"
:key="item.id"
:label="item.defCode"
:value="item.id"
/>
</el-select>
</div>
<div class="row">
<el-button size="mini" type="primary" @click="getExtPosition">查询</el-button>
</div>
</div>
<div class="station-box box">
<Tree ref="tree" :search-form="form" />
</div>
</div>
</template>
<script>
// import { post } from '@/utils/http'
import Tree from './Tree.vue'
export default {
name: 'PhysicalConfigurationManagementLeft',
components: { Tree },
data() {
return {
form: {
model: '',
sorties: ''
},
modelData: [],
sortiesLoading: true,
sortiesData: [],
defaultProps: {
children: 'children',
isLeaf: 'leaf'
},
treeLoading: false,
treeData: [],
defaultExpandedKeys: []
}
},
watch: {
'form.model': {
immediate: true,
handler(val) {
if (!val) {
return
}
const model = this.modelData.find((r) => r.id === val)
this.$set(this.form, 'modelName', (model && model.defName) || '')
this.$set(this.form, 'sorties', '')
this.getSortiesData()
}
},
'form.sorties': {
immediate: true,
handler(val) {
if (!val) {
return
}
const sorties = this.sortiesData.find((r) => r.id === val)
this.$set(this.form, 'sortiesName', (sorties && sorties.defCode) || '')
this.getExtPosition()
}
}
},
mounted() {
this.getModelData()
},
methods: {
/**
* 获取机型
*/
getModelData() {
this.modelData = []
const params = { 'searchItems': { 'items': [] }, 'sortItem': [{ 'fieldName': 'modifyTime', 'sortOrder': 'asc' }] }
this.$api.searchApi('AircraftType', params).then((res) => {
if (res.items && res.items.content && res.items.content.length) {
this.modelData = res.items.content.map(p => {
return {
id: p.id,
defCode: p.defCode,
defName: p.defName
}
})
}
})
.catch((err) => console.log(err))
.finally(() => {
this.$nextTick(() => {
if (this.modelData && this.modelData.length) {
this.form.model = this.modelData[0].id
}
this.getSortiesData()
})
})
},
/**
* 获取架次数据
*/
getSortiesData() {
this.sortiesLoading = true
const params = {
'searchItems': {
'items': [{
'fieldName': 'aircraftTypeId',
'operator': 'EQ',
'value': this.form.model || ''
}]
},
sortItem: [{ fieldName: 'defCode', sortOrder: 'asc' }]
}
this.sortiesData = []
this.$api.searchApi('AircraftSorties', params)
.then((res) => {
if (res.items && res.items.content && res.items.content.length) {
this.sortiesData = res.items.content.map(p => {
return {
id: p.id,
defCode: p.defCode
}
})
}
})
.catch((err) => console.log(err))
.finally(() => {
this.$nextTick(() => {
if (this.sortiesData && this.sortiesData.length) {
this.form.sorties = this.sortiesData[0].id
this.$set(this.form, 'sortiesName', (this.sortiesData[0].defCode) || '')
}
this.sortiesLoading = false
// this.$parent.$parent.$refs.right.handleClick()
this.getExtPosition()
})
})
},
getExtPosition() {
this.$refs.tree.getExtPosition()
// this.reloadTreeData()
},
// 加载数据
// getExtPosition(level = -1) {
// this.treeLoading = true
// const params = {
// pageFrom: 1,
// pageSize: 9999,
// searchItems: {
// children: [
// {
// items: [
// {
// fieldName: 'aircraftSortiesId', // 架次ID
// operator: 'EQ',
// value: this.form.sorties || ''
// }
// ],
// operator: 'AND'
// }
// ],
// items: [],
// operator: 'AND'
// },
// openProps: [
// {
// name: 'extPositionPlans'
// },
// {
// name: 'extPositionLinks',
// openProps: [
// {
// name: 'target',
// openProps: [
// {
// name: 'wrProduction'
// }
// ]
// }
// ]
// }
// ],
// sortItem: [
// {
// 'fieldName': 'serialNumber',
// 'sortOrder': 'desc'
// }
// ]
// }
// this.$api.searchApi('ExtPosition', params)
// .then((res) => {
// res.items && res.items.content && res.items.content.forEach(element => {
// element.workingStatus = element.extPositionPlans && element.extPositionPlans.length > 0 ? element.extPositionPlans[0].planState : null
// })
// this.treeData = [
// {
// serialNumber: `BBOM-${this.form.modelName}-${this.form.sortiesName}`,
// materName: '',
// gaceVersio: '',
// state: '',
// id: 1,
// children: res.items.content || [],
// level: 0
// }
// ]
// this.defaultExpandedKeys = [1]
// })
// .catch((err) => console.log(err))
// .finally(() => {
// this.treeLoading = false
// })
// },
loadNode(node, resolve) {
if (node.level === 0) {
return resolve([{ name: 'region' }])
}
if (node.level > 1) return resolve([])
setTimeout(() => {
const data = [{
name: 'leaf',
leaf: true
}, {
name: 'zone'
}]
resolve(data)
}, 500)
}
}
}
</script>
<style lang="scss" >
.physicalConfigurationManagement_left {
// margin: 4px;
height: 100%;
overflow: hidden;
}
</style>
<!--
* @Author:ljm
* @Date: 2021-04-25
* @LastEditTime:
* @Description: 架次实物构型-记实
* @FilePath: /mes-web/applications/dee-mes/src/views/mes//physicalQualityAndConfiguratioCnontrol/physicalConfigurationManagement/physicalDocumentationOfSorties/index.vue'
-->
<template>
<section class="physical-documentation-of-sorties-material">
<div class="logo">
<img src="/icons/u188.png" alt=""><span>综合</span>
</div>
<div class="top">
<div class="item">
<div>
<div class="left">
<img src="/icons/u123.png" alt="">
<p>报废</p>
</div>
<div class="right">
<span>{{ comprehensive.scrapQuantity }}</span>
/<span>{{ comprehensive.scrapCount }}</span>
</div>
</div>
</div>
<div class="item">
<div>
<div class="left">
<img src="/icons/u126.png" alt="">
<p>代料</p>
</div>
<div class="right">
<span v-show="false">{{ comprehensive.materialsQuantity }} /</span>
<span>{{ comprehensive.materialsCount }}</span>
</div>
</div>
</div>
<div class="item">
<div>
<div class="left">
<img src="/icons/u118.png" alt="">
<p>串件</p>
</div>
<div class="right">
<span>{{ comprehensive.stringQuantity }}</span>
/<span>{{ comprehensive.stringCount }}</span>
</div>
</div>
</div>
</div>
<hr>
<div class="title">
<div class="left">
<div class="logo" style="margin: 20px 20px 10px 0px">
<img src="/icons/u212.svg" alt=""><span>装配记实</span>
</div>
<div class="dee-tools">
<div class="tools-block">
<div
class="tool-item"
:disabled="preserveDisabled"
style="display: flex; flex-direction: row; align-items: center"
@click="exportTable"
>
<img src="/icons/c-export.png" class="icon">
<span class="icon-font">MBOM差异导出</span>
<i v-show="preserveDisabled" class="el-icon-loading" />
</div>
</div>
</div>
</div>
<div class="right">
<div class="legnd">
<div>
<span />
<span>未开始</span>
</div>
<div>
<span />
<span>执行中</span>
</div>
<div>
<span />
<span>已完成</span>
</div>
<div>
<span />
<span>保留</span>
</div>
<div>
<span />
<span>暂停</span>
</div>
</div>
</div>
</div>
<div class="bottom">
<Table ref="table" />
</div>
</section>
</template>
<script>
import Table from './table'
import { downloadPdfHandle } from '@/api/inventory.js'
import axios from 'axios'
export default {
name: 'Material',
components: {
Table
},
data() {
return {
comprehensive: {
scrapQuantity: 0,
scrapCount: 0,
materialsQuantity: 0,
materialsCount: 0,
stringQuantity: 0,
stringCount: 0
},
preserveDisabled: false
}
},
mounted() {},
methods: {
getComprehensive() {
var { model, sortie } =
this.$parent.$parent.$parent.$parent.$refs.left.$refs.form.form
var activeName = this.$parent.$parent.$parent.activeName
this.comprehensive = []
this.HttpRequest(
`DxProcessPlan/comprehensive?sorties=${sortie}&planType=${model}&number=${activeName}`,
{},
'post'
)
.then((res) => {
if (res.items) {
this.comprehensive = {
scrapQuantity: res.items['报废单'].countCarry || 0,
scrapCount: res.items['报废单'].countAO || 0,
materialsQuantity: res.items['代料单'].countCarry || 0,
materialsCount: res.items['代料单'].countAO || 0,
stringQuantity: res.items['串件单'].countCarry || 0,
stringCount: res.items['串件单'].countAO || 0
}
}
})
.catch((err) => console.error(err))
.finally(() => {})
},
exportTable() {
this.preserveDisabled = true
const baseURl = downloadPdfHandle()
var { model, sortie } =
this.$parent.$parent.$parent.$parent.$refs.left.$refs.form.form
axios({
method: 'get',
url: `/DifferenceExcel/download/excel?planType=${model}&sorties=${sortie}`,
baseURL: baseURl,
params: {
},
headers: { token: `${localStorage.getItem('token')}`, 'equipment_id': `${localStorage.getItem('uid')}` },
responseType: 'arraybuffer'
})
.then((res) => {
const blob = new Blob([res.data], {
type:
'application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
})
if (window.navigator.msSaveOrOpenBlob) {
navigator.msSaveBlob(blob)
} else {
const elink = document.createElement('a')
elink.download = 'MBOM差异表' + '.xlsx'
elink.style.display = 'none'
elink.href = URL.createObjectURL(blob)
document.body.appendChild(elink)
elink.click()
document.body.removeChild(elink)
}
// } else {
// // IE10+下载
// navigator.msSaveBlob(blob)
// }
})
.catch((err) => {
console.error(err)
})
.finally(() => {
this.preserveDisabled = false
})
}
}
}
</script>
<style lang="scss">
.physical-documentation-of-sorties-material {
height: 100%;
display: flex;
flex-direction: column;
.logo {
img {
width: 35px;
height: 30px;
vertical-align: middle;
margin-right: 10px;
}
span {
vertical-align: middle;
}
}
.top {
display: flex;
justify-content: space-between;
.item {
width: 280px;
height: 100%;
text-align: center;
> div {
display: flex;
height: 120px;
margin-top: 20px;
margin-bottom: 20px;
border: 1px solid #ccc;
border-radius: 5px;
> div {
width: 50%;
}
.left {
padding: 20px;
box-sizing: border-box;
img {
width: 50px;
height: 58px;
margin-bottom: 5px;
// height: ;
}
}
.right {
display: flex;
align-items: center;
justify-content: center;
font-size: 26px;
font-weight: bold;
> span {
&:first-child {
color: #57ab57;
}
&:last-child {
color: #ff0000;
}
}
}
}
}
}
hr {
height: 1px;
background-color: #d2d2d2;
border: none;
}
> .title {
display: flex;
justify-content: space-between;
align-items: center;
> .left {
display: flex;
align-items: center;
.dee-tools .tool-item {
&[disabled] {
cursor: no-drop;
>span{
color: #c3c3c3;
}
}
}
}
> .right {
display: flex;
> .legnd {
display: flex;
position: relative;
> div {
align-items: center;
margin-left: 20px;
display: flex;
> span {
&:first-child {
display: inline-block;
width: 22px;
height: 16px;
margin-right: 6px;
}
&:last-child {
font-size: 10px;
}
}
&:nth-child(1) > span:first-child {
background: #999999;
}
&:nth-child(2) > span:first-child {
background: #0000ff;
}
&:nth-child(3) > span:first-child {
background: #008000;
}
&:nth-child(4) > span:first-child {
background: #ff0000;
}
&:nth-child(5) > span:first-child {
background: #ffff00;
}
}
}
}
}
.bottom {
height: 20px;
flex-grow: 1;
}
}
</style>
<template>
<section class="physical-documentation-of-sorties-material-table">
<!-- 表格 -->
<el-table
v-loading="loading"
:data="tableData"
height="calc(100% - 40px)"
border
size="mini"
>
<el-table-column type="index" align="center" label="序号" :width="80" />
<el-table-column label="数模及文件记实" align="center">
<el-table-column
v-for="item in colums1"
:key="item.key"
:prop="item.key"
align="center"
:label="item.title"
:width="item.width"
sortable
show-overflow-tooltip
/></el-table-column>
<el-table-column label="质量单据记实" align="center">
<el-table-column
v-for="item in colums2"
:key="item.key"
:prop="item.key"
align="center"
:label="item.title"
:width="item.width"
sortable
show-overflow-tooltip
/>
</el-table-column>
</el-table>
<el-pagination
:current-page="tablePagination.currentPage"
:page-sizes="tablePagination.pageSizes"
:page-size="tablePagination.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="tablePagination.total"
@size-change="setPage"
@current-change="setPage($event, true)"
/>
</section>
</template>
<script>
export default {
components: {},
data() {
return {
// 加载中
loading: false,
// 所有可动态配置的表格列
colums1: [
{
title: '记实编号',
show: true,
key: 'recordNumber',
sortable: true,
width: 120
},
{ title: '名称', show: true, key: 'recordName', sortable: true },
{ title: '类型', show: true, key: 'recordType', sortable: true },
{
title: '序列号记实',
show: true,
key: 'recordNo',
sortable: true,
width: 120
},
{
title: '数量记实',
show: true,
key: 'recordSum',
sortable: true,
width: 120
},
{
title: '数模及文件版次记实',
show: true,
key: 'recordBatchNumber',
sortable: true,
width: 180
},
{
title: '软件(编号/版本)记实',
show: true,
key: 'recordSoftware',
sortable: true,
width: 180
}
// {
// title: '软件版本记实',
// show: true,
// key: 'recordSoftware',
// sortable: true,
// width: 180
// },
],
colums2: [
{
title: '不合格品审理单',
show: true,
key: 'recordUnqualified',
sortable: true,
width: 150
},
{
title: '代料单',
show: true,
key: 'totalMinutes',
sortable: true,
width: 120
},
{
title: '质量问题预审单',
show: true,
key: 'recordQuality',
sortable: true,
width: 180
},
{
title: '报废申请单',
show: true,
key: 'recordScrapped',
sortable: true,
width: 120
},
{
title: '串件申请单',
show: true,
key: 'recordString',
sortable: true,
width: 120
}
],
tablePagination: {
currentPage: 1,
pageSize: 10,
total: 0,
pageSizes: [5, 10, 20, 50]
},
// 表格数据
tableData: []
}
},
created() {},
mounted() {},
methods: {
// 初始化数据
init() {
this.tableData = []
var id =
this.$parent.$parent.$parent.$parent.$parent.$refs.left.$refs.tree
.rowData.id
var number = this.$parent.$parent.$parent.$parent.activeName
if (!id || !number) {
return
}
this.loading = true
const params = {
id: id,
number: number,
pageFrom: this.tablePagination.currentPage,
pageSize: this.tablePagination.pageSize,
numberOrName: this.$parent.search
}
// 发送请求
this.HttpRequest('/DxProcessPlan/planDetails', params, 'post')
.then((res) => {
if (
res.items &&
res.items.physicalRecordDDxPage &&
res.items.physicalRecordDDxPage &&
res.items.physicalRecordDDxPage.content &&
res.items.physicalRecordDDxPage.content.length
) {
this.tableData = res.items.physicalRecordDDxPage.content
this.tablePagination.total = res.items.physicalRecordDDxPage.totalElements
}
})
.catch((err) => console.log(err))
.finally(() => {
this.loading = false
})
},
setPage($event, state) {
if (state) {
this.tablePagination.currentPage = $event
} else {
this.tablePagination.currentPage = 1
this.tablePagination.pageSize = $event
}
this.init()
}
}
}
</script>
<style lang="scss">
.physical-documentation-of-sorties-material-table {
height: 100%;
.el-table thead th {
color: #2e2e2e;
font-weight: 700;
font-size: 14px;
padding: 0;
background-color: #f3f6f7;
line-height: 46px !important;
}
.el-pagination {
text-align: right;
padding: 10px 0;
}
.el-loading-spinner {
width: 100%;
}
}
</style>
<!--
* @Author:ljm
* @Date: 2021-04-25
* @LastEditTime: 2024-07-09 16:18:32
* @Description: 架次实物构型-预览
* @FilePath: /mes-web/applications/dee-mes/src/views/mes//physicalQualityAndConfiguratioCnontrol/physicalConfigurationManagement/sortiesPhysicalConfigurationsSame/index.vue'
-->
<template>
<section
v-loading="loading"
class="physical-documentation-of-sorties-preview"
>
<label v-show="showTitle" :title="title">{{ title }}</label>
<iframe :src="openUrl" frameborder="0" />
</section>
</template>
<script>
// import { downloadPdfHandle } from '@/api/inventory.js'
// import axios from 'axios'
import { get } from '@/utils/http'
export default {
name: 'Preview',
data() {
return {
showTitle: false,
title: '',
openUrl: '',
loading: false
}
},
mounted() {},
methods: {
init() {
var id = this.$parent.$parent.$parent.$parent.$parent.$parent.$refs.left.$refs.tree
.rowData.id
var number = this.$parent.$parent.$parent.activeName
if (!id || !number) {
return
}
this.loading = true
this.showTitle = false
// const baseURl = VUE_APP_BASE_API || process.env.VUE_APP_BASE_API // eslint-disable-line
// axios({
// method: 'POST',
// url: 'ExtProcessPlan/createPDF',
// baseURL: baseURl,
// params: {
// id: id
// },
// headers: { token: `${localStorage.getItem('token')}`, 'equipment_id': `${localStorage.getItem('uid')}` },
// responseType: 'arraybuffer'
// })
get(`ExtProcessPlan/createPDF?id=${id}`).then((res) => {
const blob = new Blob([res.data], {
type: 'application/pdf'
})
if (window.navigator.msSaveOrOpenBlob) {
navigator.msSaveBlob(blob)
} else {
this.openUrl = URL.createObjectURL(blob)
this.$nextTick(() => {
this.loading = false
this.title = this.$parent.$parent.$parent.$parent.$refs.left.$refs.tree
.rowData.serialNumber
setTimeout(() => {
this.showTitle = true
}, 1000)
})
}
}).catch(() => {
this.loading = false
})
}
}
}
</script>
<style lang="scss">
.physical-documentation-of-sorties-preview {
position: relative;
height: 100%;
width: 100%;
> button {
position: absolute;
}
> label {
position: absolute;
width: calc(50% - 310px);
z-index: 9;
color: #fff;
line-height: 73px;
background-color: #323639;
margin-left: 90px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
iframe {
width: 100%;
height: 100%;
border: 0;
}
}
</style>
<!--
* @Author:ljm
* @Date: 2021-04-25
* @LastEditTime: 2024-07-09 15:12:05
* @Description: 架次实物构型-质量控制
* @FilePath: /mes-web/applications/dee-mes/src/views/mes//physicalQualityAndConfiguratioCnontrol/physicalConfigurationManagement/sortiesPhysicalConfigurationsSame/index.vue'
-->
<template>
<section class="physical-documentation-of-sorties-quality">
<div class="logo">
<img src="/icons/u188.png" alt=""><span>综合</span>
</div>
<div class="top">
<div id="main" style="width: 100%; height: 300px" />
</div>
<hr>
<div class="title">
<div class="left">
<div class="logo" style="margin: 20px 20px 10px 0px">
<img src="/icons/u212.svg" alt=""><span>明细</span>
</div>
</div>
<div class="right">
<div class="legnd">
<div>
<span />
<span>未开始</span>
</div>
<div>
<span />
<span>执行中</span>
</div>
<div>
<span />
<span>已完成</span>
</div>
<div>
<span />
<span>保留</span>
</div>
<div>
<span />
<span>暂停</span>
</div>
</div>
</div>
</div>
<Table ref="table" />
</section>
</template>
<script>
import * as echarts from 'echarts'
import Table from './table'
export default {
name: 'SortiesPhysicalConfigurationsSame',
components: {
Table
},
data() {
return {
option: {
tooltip: {
trigger: 'axis'
// axisPointer: { // 坐标轴指示器,坐标轴触发有效
// type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
// }
},
legend: {
data: ['已发起', '已完成', '审理中'],
right: 10
},
barWidth: '10%',
grid: {
left: '0%',
right: '0%',
bottom: '3%',
containLabel: true
},
xAxis: [
{
type: 'category',
data: [
'报废通知单',
'不合格品审理单(II III)',
'质量问题预审单',
'代料申请',
'串件申请单'
]
}
],
yAxis: [
{
type: 'value'
}
],
series: [
{
name: '已发起',
type: 'bar',
stack: '总量',
emphasis: {
focus: 'series'
},
itemStyle: {
color: '#3BA1FF'
},
data: []
},
{
name: '已完成',
type: 'bar',
emphasis: {
focus: 'series'
},
itemStyle: {
color: '#27D47D'
},
data: []
},
{
name: '审理中',
type: 'bar',
stack: '总量',
emphasis: {
focus: 'series'
},
itemStyle: {
color: '#F38B00'
},
data: []
}
]
}
}
},
mounted() {
this.initEcharts()
},
methods: {
initEcharts() {
var chartDom = document.getElementById('main')
var that = this
var elementResizeDetectorMaker = require('element-resize-detector') // 引入监听dom变化的组件
var erd = elementResizeDetectorMaker()
// 用于使chart自适应高度和宽度,通过窗体高宽计算容器高宽
// var resizeWorldMapContainer = function() {
// // eslint-disable-line
// chartDom.style.width = chartDom.scrollWidth + 'px'
// chartDom.style.height = chartDom.clientHeight + 'px'
// }
this.myChart = echarts.init(chartDom)
this.myChart.setOption(this.option)
erd.listenTo(chartDom, function(element) {
// 执行监听
that.$nextTick(function() {
this.myChart.resize()
})
})
},
getComprehensive() {
var { model, sortie } =
this.$parent.$parent.$parent.$parent.$parent.$parent.$refs.left.form
var activeName = this.$parent.$parent.$parent.activeName
this.myChart.setOption({
series: [
{
data: []
},
{
data: []
},
{
data: []
}
]
})
this.HttpRequest(
`DxProcessPlan/comprehensive?sorties=${sortie}&planType=${model}&number=${activeName}`,
{},
'post'
)
.then((res) => {
if (res.items) {
// 发起
var launch = [
res.items['报废'].countAO,
res.items['不合格'].countAO,
res.items['质量问题'].countAO,
res.items['器材代料'].countAO,
res.items['串件申请单'].countAO
]
// 完成
var Finish = [
res.items['报废'].countNotOk,
res.items['不合格'].countNotOk,
res.items['质量问题'].countNotOk,
res.items['器材代料'].countNotOk,
res.items['串件申请单'].countNotOk
]
// 审理
var hear = [
res.items['报废'].countCarry,
res.items['不合格'].countCarry,
res.items['质量问题'].countCarry,
res.items['器材代料'].countCarry,
res.items['串件申请单'].countCarry
]
this.myChart.setOption({
series: [
{
data: launch
},
{
data: Finish
},
{
data: hear
}
]
})
} else {
this.$message({
showClose: true,
message: res.message,
type: 'error'
})
}
})
.catch((err) => console.error(err))
.finally(() => {})
}
}
}
</script>
<style lang="scss">
.physical-documentation-of-sorties-quality {
height: 100%;
width: 100%;
display: flex;
flex-direction: column;
> .logo {
&:first-child {
position: absolute;
}
img {
width: 35px;
height: 30px;
vertical-align: middle;
margin-right: 10px;
}
span {
vertical-align: middle;
}
}
.top {
display: flex;
height: 300px;
width: 100%;
justify-content: space-between;
}
hr {
height: 1px;
background-color: #d2d2d2;
border: none;
}
> .title {
display: flex;
justify-content: space-between;
align-items: center;
> .left {
display: flex;
align-items: center;
> .logo {
white-space: nowrap;
span {
margin-left:20px;
vertical-align: super;
}
}
}
> .right {
display: flex;
> .legnd {
display: flex;
position: relative;
> div {
align-items: center;
margin-left: 20px;
display: flex;
> span {
&:first-child {
display: inline-block;
width: 22px;
height: 16px;
margin-right: 6px;
}
&:last-child {
font-size: 10px;
}
}
&:nth-child(1) > span:first-child {
background: #999999;
}
&:nth-child(2) > span:first-child {
background: #0000ff;
}
&:nth-child(3) > span:first-child {
background: #008000;
}
&:nth-child(4) > span:first-child {
background: #ff0000;
}
&:nth-child(5) > span:first-child {
background: #ffff00;
}
}
}
}
}
}
</style>
<template>
<section class="sorties-physical-configurations-same-table">
<!-- 表格 -->
<el-table
v-loading="loading"
:data="tableData"
height="calc(100% - 40px)"
border
size="mini"
>
<el-table-column type="index" align="center" label="序号" :width="80" />
<el-table-column
v-for="item in colums"
:key="item.key"
:prop="item.key"
align="center"
:label="item.title"
:width="item.width"
sortable
show-overflow-tooltip
/>
</el-table>
<el-pagination
:current-page="tablePagination.currentPage"
:page-sizes="tablePagination.pageSizes"
:page-size="tablePagination.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="tablePagination.total"
@size-change="setPage"
@current-change="setPage($event, true)"
/>
</section>
</template>
<script>
export default {
components: {},
data() {
return {
// 加载中
loading: false,
// 分页
tablePagination: {
currentPage: 1,
pageSize: 10,
total: 0,
pageSizes: [5, 10, 20, 50]
},
// 所有可动态配置的表格列
colums: [
{ title: 'AO号', show: true, key: 'aoNumber', sortable: true },
{ title: 'AO名称', show: true, key: 'aoName', sortable: true },
{ title: '类型', show: true, key: 'type', sortable: true },
{ title: '单据编号', show: true, key: 'docNumber', sortable: true },
{ title: '审理结论', show: true, key: 'conclusion', sortable: true },
{ title: '审理状态', show: true, key: 'status', sortable: true },
{ title: '是否闭关', show: true, key: 'isClose', sortable: true }
],
// 表格数据
tableData: []
}
},
created() {},
mounted() {},
methods: {
// 初始化数据
init() {
this.tableData = []
var id = this.$parent.$parent.$parent.$parent.$parent.$refs.left.$refs.tree.rowData.id
var number = this.$parent.$parent.$parent.$parent.activeName
if (!id || !number) {
return
}
this.loading = true
const params = {
id: id,
number: number,
pageFrom: this.tablePagination.currentPage,
pageSize: this.tablePagination.pageSize,
numberOrName: this.$parent.search
}
// 发送请求
this.HttpRequest('/DxProcessPlan/planDetails', params, 'post')
.then((res) => {
if (res.items && res.items.qualityRecordDxPage &&
res.items.qualityRecordDxPage.content &&
res.items.qualityRecordDxPage.content.length) {
this.tableData = res.items.qualityRecordDxPage.content
this.tablePagination.total = res.items.qualityRecordDxPage.totalElements
}
})
.catch((err) => console.log(err))
.finally(() => {
this.loading = false
})
},
setPage($event, state) {
if (state) {
this.tablePagination.currentPage = $event
} else {
this.tablePagination.currentPage = 1
this.tablePagination.pageSize = $event
}
this.init()
}
}
}
</script>
<style lang="scss">
.sorties-physical-configurations-same-table {
flex-grow: 1;
height: 20px;
.el-table thead th {
color: #2e2e2e;
font-weight: 700;
font-size: 14px;
padding: 0;
background-color: #f3f6f7;
line-height: 46px !important;
}
.el-pagination {
text-align: right;
padding: 10px 0;
}
.el-loading-spinner {
width: 100%;
}
}
</style>
<template>
<section
class="physical-configuration-management-right-content"
>
<el-tabs v-model="activeName" type="card" @tab-click="handleClick">
<el-tab-pane label="进度记实" name="BRecord">
<Schedule ref="BRecord" />
</el-tab-pane>
<el-tab-pane label="质量记实" name="CRecord">
<Quality ref="CRecord" />
</el-tab-pane>
<el-tab-pane label="实物记实" name="DRecord">
<Material ref="DRecord" />
</el-tab-pane>
<!-- <el-tab-pane label="供应商记实" name="ERecord">
<Supplier ref="ERecord" />
</el-tab-pane> -->
<el-tab-pane label="预览" name="FPreview">
<Preview ref="FPreview" />
</el-tab-pane>
</el-tabs>
</section>
</template>
<script>
// 预览
import Preview from './preview'
// 进度记实
import Schedule from './schedule'
// 实物记实
import Material from './material'
// 质量记实
import Quality from './quality'
// 供应商记实
// import Supplier from './supplier'
export default {
components: {
Preview,
Material,
Quality,
Schedule
// Supplier
},
props: {
collapse: {
type: Boolean,
default: () => true
}
},
data() {
return {
activeName: '',
tabPaneData: []
}
},
created() {
this.$bus.$on('treeCurrentRowData', (data) => {
this.treeRowData = JSON.parse(JSON.stringify(data))
})
this.getTabs()
},
methods: {
handleClick() {
if (this.activeName === 'FPreview') {
this.$parent.$parent.$parent.$refs.left.$refs.tree.setBRecordOrCRecord()
this.$refs[this.activeName].init()
} else if (this.activeName === 'ERecord') {
this.$refs[this.activeName].$refs.table.init()
} else {
if (this.activeName === 'DRecord') {
this.$parent.$refs.left.$refs.tree.setBRecordOrCRecord()
}
this.$refs[this.activeName].getComprehensive()
this.$refs[this.activeName].$refs.table.init()
}
},
getTabs() {
this.tabPaneData = []
this.HttpRequest('DxProcessPlan/rightMenu', {}, 'post')
.then((res) => {
if (res.items) {
for (var key in res.items) {
this.tabPaneData.push({
key: key,
value: res.items[key]
})
}
}
})
.catch((err) => console.log(err))
.finally(() => {
this.tabPaneData.length &&
this.$nextTick(() => {
this.activeName = this.tabPaneData[0].key
this.handleClick()
})
})
},
previewPDF() {
this.$refs.FPreview.getPdf()
}
}
}
</script>
<style lang="scss">
.physical-configuration-management-right-content {
// width: 20px;
height: 100%;
// flex-grow: 1;
padding: 20px;
border: 1px solid #ccc;
border-radius: 8px;
> button {
position: absolute;
right: 42px;
z-index: 9999;
}
.el-tabs {
height: 100%;
width: 100%;
overflow: hidden;
.el-tabs__content {
height: calc(100% - 56px);
width: 100%;
.el-tab-pane {
height: 100%;
width: 100%;
}
}
}
}
</style>
<!--
* @Author:ljm
* @Date: 2021-04-25
* @LastEditTime: 2024-07-09 14:51:34
* @Description: 架次实物构型-进度
* @FilePath: /mes-web/applications/dee-mes/src/views/mes//physicalQualityAndConfiguratioCnontrol/physicalConfigurationManagement/SortiesPhysicalConfigurationsSchedule/index.vue'
-->
<template>
<section class="physical-documentation-of-sorties-schedule">
<div class="logo">
<img src="/icons/u188.png" alt="">
<span>综合</span>
</div>
<div class="top">
<div v-for="item in comprehensive" :key="item.key">
<h3>{{ item.key }}</h3>
<el-progress
type="circle"
:width="100"
:stroke-width="15"
:color="colors"
stroke-linecap="square"
show-text
:percentage="item.proportion>100?100:item.proportion"
/>
<p>任务总数:{{ item.countAO }} 已完成数:{{ item.countCarry }}</p>
</div>
</div>
<hr>
<div class="title">
<div class="left">
<div class="logo" style="margin: 20px 20px 10px 0px">
<img src="/icons/u212.svg" alt=""><span>明细</span>
</div>
<el-input
v-model="search"
placeholder="请输入内容"
clearable
@change="getTable"
/>
</div>
<div class="right">
<div class="legnd">
<div>
<span />
<span>未开始</span>
</div>
<div>
<span />
<span>执行中</span>
</div>
<div>
<span />
<span>已完成</span>
</div>
<div>
<span />
<span>保留</span>
</div>
<div>
<span />
<span>暂停</span>
</div>
</div>
</div>
</div>
<Table ref="table" :tree-row-data="treeRowData" />
</section>
</template>
<script>
import { post } from '@/utils/http'
import Table from './table'
export default {
name: 'Schedule',
components: {
Table
},
props: {
treeRowData: {
type: Object,
default: () => {}
}
},
data() {
return {
comprehensive: [
{
key: 1,
countAO: 0,
countCarry: 0,
proportion: 0
},
{
key: 2,
countAO: 0,
countCarry: 0,
proportion: 0
},
{
key: 3,
countAO: 0,
countCarry: 0,
proportion: 0
}
],
search: '',
colors: [{ color: '#5cb87a', percentage: 100 }]
}
},
mounted() {},
methods: {
getComprehensive() {
const { modelName, sortiesName } =
this.$parent.$parent.$parent.$parent.$parent.$parent.$refs.left.form
const activeName = this.$parent.$parent.$parent.activeName
console.log('🚀 activeName:', activeName)
this.comprehensive = [
{
key: 1,
countAO: 0,
countCarry: 0,
proportion: 0
},
{
key: 2,
countAO: 0,
countCarry: 0,
proportion: 0
},
{
key: 3,
countAO: 0,
countCarry: 0,
proportion: 0
}
]
post(
`ExtProcessPlan/comprehensive?sorties=${sortiesName}&planType=${modelName}&number=${activeName}`,
{},
'post'
)
.then((res) => {
if (res.items) {
const comprehensive = []
for (const key in res.items) {
comprehensive.push({
key: key,
sort: key === 'AO' ? 1 : key === 'AOR' ? 2 : 3,
countAO: res.items[key].countAO,
countCarry: res.items[key].countCarry,
proportion:
res.items[key].countAO && res.items[key].countCarry
? Math.round(
(res.items[key].countCarry / res.items[key].countAO) *
1000
) / 10
: 0
})
}
this.comprehensive = comprehensive.sort((a, b) => a.sort - b.sort)
}
})
.catch((err) => console.error(err))
.finally(() => {})
},
getTable() {
this.$refs.table.init()
}
}
}
</script>
<style lang="scss">
.physical-documentation-of-sorties-schedule {
height: 100%;
display: flex;
flex-direction: column;
.logo {
img {
width: 35px;
height: 30px;
vertical-align: middle;
margin-right: 10px;
}
span {
vertical-align: middle;
}
}
.top {
display: flex;
justify-content: space-between;
margin-bottom: 20px;
height: 182px;
> div {
height: 100%;
text-align: center;
h3 {
margin-bottom: 20px;
}
p {
margin-top: 20px;
}
}
}
hr {
height: 1px;
background-color: #d2d2d2;
border: none;
}
> .title {
display: flex;
justify-content: space-between;
align-items: center;
> .left {
display: flex;
align-items: center;
> .logo {
white-space: nowrap;
}
}
> .right {
display: flex;
> .legnd {
display: flex;
position: relative;
> div {
align-items: center;
margin-left: 20px;
display: flex;
> span {
&:first-child {
display: inline-block;
width: 22px;
height: 16px;
margin-right: 6px;
}
&:last-child {
font-size: 10px;
}
}
&:nth-child(1) > span:first-child {
background: #999999;
}
&:nth-child(2) > span:first-child {
background: #0000ff;
}
&:nth-child(3) > span:first-child {
background: #008000;
}
&:nth-child(4) > span:first-child {
background: #ff0000;
}
&:nth-child(5) > span:first-child {
background: #ffff00;
}
}
}
}
}
}
</style>
<template>
<section class="sorties-physical-configurations-schedule-table dee-table">
<!-- 表格 -->
<el-table
:data="tableData"
height="calc(100% - 40px)"
border
size="mini"
highlight-current-row
:cell-class-name="cellClassName"
>
<el-table-column type="index" align="center" label="序号" :width="80" />
<el-table-column
v-for="item in colums"
:key="item.key"
:prop="item.key"
align="center"
:label="item.title"
:width="item.width"
sortable
show-overflow-tooltip
/>
</el-table>
<el-pagination
:current-page="tablePagination.currentPage"
:page-sizes="tablePagination.pageSizes"
:page-size="tablePagination.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="tablePagination.total"
@size-change="setPage"
@current-change="setPage($event, true)"
/>
</section>
</template>
<script>
import { post } from '@/utils/http'
export default {
components: {},
props: {
treeRowData: {
type: Object,
default: () => {}
}
},
data() {
return {
// 加载中
loading: false,
// 分页
tablePagination: {
currentPage: 1,
pageSize: 10,
total: 0,
pageSizes: [5, 10, 20, 50]
},
colums: [
{ title: 'AO号', show: true, key: 'aoName', sortable: true },
{ title: 'AO名称', show: true, key: 'name', sortable: true },
{
title: '版本',
width: '100',
show: true,
key: 'gaceVersion',
sortable: true
},
{
title: '状态',
width: '100',
show: true,
key: 'stateDisplayName',
sortable: true
},
{
title: '进度',
width: '100',
show: true,
key: 'progress',
sortable: true
}
],
// 表格数据
tableData: [],
dictOptions: []
}
},
created() {},
mounted() {
this.getDictData()
},
methods: {
// 加载字典数据
async getDictData() {
this.dictOptions = await this.$utils.getDicListByCode('PlanState')
},
// 初始化数据
init() {
this.tableData = []
var id =
this.$parent.$parent.$parent.$parent.$parent.$parent.$parent.$refs.left.$refs.tree
.rowData.id
var number = this.$parent.$parent.$parent.$parent.activeName
if (!id || !number) {
return
}
const params = {
id: id,
number: number,
pageFrom: this.tablePagination.currentPage,
pageSize: this.tablePagination.pageSize,
numberOrName: this.$parent.search
}
// 发送请求
post('/ExtProcessPlan/planDetails', params, 'post')
.then((res) => {
if (
res.items &&
res.items.processPlanVOS &&
res.items.processPlanVOS.content &&
res.items.processPlanVOS.content.length
) {
this.tableData = res.items.processPlanVOS.content.map((p) => {
return {
name: p.name,
aoName: p.serialNumber,
gaceVersion: p.gaceVersion,
stateDisplayName: p.joExecutePlan && this.$utils.getParamsFromLists(this.dictOptions, 'value', p.joExecutePlan[0].planState, 'label'),
planStateCode: p.joExecutePlan && p.joExecutePlan[0].planState,
progress:
p.isOkOpPlan +
'/' +
p.allOpPlan
}
})
this.tablePagination.total = res.items.processPlanVOS.totalElements
}
})
.catch((err) => console.log(err))
.finally(() => {
})
},
setPage($event, state) {
if (state) {
this.tablePagination.currentPage = $event
} else {
this.tablePagination.currentPage = 1
this.tablePagination.pageSize = $event
}
this.init()
},
cellClassName({ row, column, rowIndex, columnIndex }) {
if (column.property === 'stateDisplayName') { return 'cell ' + row.planStateCode }
}
}
}
</script>
<style lang="scss">
.sorties-physical-configurations-schedule-table {
flex-grow: 1;
height: 20px;
.el-table thead th {
color: #2e2e2e;
font-weight: 700;
font-size: 14px;
padding: 0;
background-color: #f3f6f7;
line-height: 46px !important;
}
.el-pagination {
text-align: right;
padding: 10px 0;
}
.el-loading-spinner {
width: 100%;
}
.Issued.cell,
.Run.cell,
.Yes.cell,
.Delivery.cell {
background-color: #0000ff;
color:#fff;
}
.Finish.cell {
background-color: #008000;
color:#fff;
}
.Reserved.cell {
background-color: #ff0000;
color:#fff;
}
.Not.cell {
background-color: #999999;
color:#fff;
}
.Paused.cell {
background-color: #ffff00;
color:#fff;
}
}
</style>
<template>
<dee-dialog
title="附件浏览"
:dialog-visible.sync="visible"
width="50%"
:before-close="handleClose"
class="sorties-physical-configurations-supplier-dialog"
>
<div>
<!-- <upload-files v-if="uploadVisble" v-model="form.objFileLinks" /> -->
</div>
</dee-dialog>
</template>
<script>
// import UploadFiles from '@/components/Lean/UploadFiles'
export default {
// components: { UploadFiles },
data() {
return {
visible: false,
disabled: false,
uploadVisble: true,
form: {
results: '',
objFileLinks: []
},
row: {},
loading: false
}
},
created() {},
methods: {
// 打开弹出框
open(row = {}) {
this.form = {
results: '',
objFileLinks: []
}
this.row = row
this.form.results = row.results
this.visible = true
this.getList(row.id)
},
getList(sourceId) {
this.loading = true
this.uploadVisble = false
const params = {
indices: ['ObjFileLink'],
searchItems: {
items: [
{
fieldName: 'sourceId',
operator: 'EQ',
value: sourceId
}
],
operator: 'AND'
},
openProps: [
{
pageFrom: 1,
pageSize: 1,
name: 'target'
}
]
}
this.HttpRequest('/FileUtil/checkFile', params, 'post')
.then((res) => {
this.form.objFileLinks = res.items.content[0].objFileLinks
})
.catch((err) => console.log(err))
.finally(() => {
this.loading = false
this.uploadVisble = true
})
},
/**
* 保存功能
* 根据是否有id处理创建和编辑逻辑
*/
save() {
this.updateFile()
this.removeFile()
},
removeFile() {
var result = []
var index = []
this.form.objFileLinks.forEach((item, i) => {
if (item.operator === 'REMOVE') {
result.push({ id: item.id })
index.push(i)
}
})
index.forEach((item) => {
this.$delete(this.form.objFileLinks, item)
})
// 发送请求
this.HttpRequest('/FileUtil/removeFile', result, 'post')
.then((res) => {
})
.catch((err) => console.log(err))
.finally(() => {})
},
// 上传附件
updateFile() {
var result = []
this.form.objFileLinks.forEach((item) => {
result.push({
targetId: item.target.id, // fileId
targetIdType: 'Papers',
sourceId: this.row.id, // 处理单id
sourceIdType: 'ExamineRecord'
})
})
this.disabled = true
this.HttpRequest('/FileUtil/upload', result, 'post')
.then((res) => {
this.reset('上传')
})
.catch((err) => console.log(err))
.finally(() => {
this.disabled = false
})
},
// 重置弹出框
reset(message) {
this.visible = false
this.$message({
message: `${message}成功`,
type: 'success'
})
this.$emit('reload')
this.form = {
results: '',
objFileLinks: []
}
},
handleClose() {
this.visible = false
}
}
}
</script>
<style lang="scss">
.view-dialog {
.el-form-item__label,
.dee-table-header {
display: none !important;
}
}
</style>
<template>
<div class="sorties-physical-configurations-supplier">
<Table ref="table" @open="(row) => $refs.dialog.open(row)" />
<!-- 弹出框 -->
<Dialog ref="dialog" />
</div>
</template>
<script>
import Table from './table'
import Dialog from './dialog.vue'
export default {
name: 'Supplier',
components: {
Table,
Dialog
},
data() {
return {}
},
created() {},
methods: {
getComprehensive() {}
}
}
</script>
<style lang="scss">
.sorties-physical-configurations-supplier {
height: 100%;
display: flex;
flex-direction: column;
> section {
height: 20px;
flex-grow: 1;
display: flex;
flex-direction: column;
> .el-table {
height: 20px;
flex-grow: 1;
}
.el-pagination {
text-align: right;
padding-top: 10px;
}
}
.el-table thead th {
color: #2e2e2e;
font-weight: 700;
font-size: 14px;
padding: 0;
background-color: #f3f6f7;
line-height: 46px !important;
}
.el-table .see-excel {
color: #3a8ee6;
cursor: pointer;
}
}
.sorties-physical-configurations-supplier-dialog .upload-files {
.dee-upload-page,
.el-form-item--small.el-form-item {
margin-bottom: 0 !important;
}
.dee-table-header,
.dee-form2 .el-form-item--small .el-form-item__label {
display: none;
}
.el-form-item__content {
padding-left: 0 !important;
}
}
</style>
<template>
<section>
<!-- 表格 -->
<!-- <dee-table
ref="table"
:loading="loading"
:index-row="indexRow"
:columns="tableColums"
:data="tableData"
:options="tableOptions"
:pagination="tablePagination"
:selection-row="selectionRow"
@cell-class-name="cellClassName"
@cell-click="cellClick"
@selection-change="selectionChange"
@pagination-size-change="paginationSizeChange"
@pagination-current-change="paginationCurrentChange"
> -->
<el-table
ref="table"
v-loading="loading"
:data="tableData"
height="100%"
border
size="mini"
highlight-current-row
:cell-class-name="cellClassName"
@cell-click="cellClick"
>
<el-table-column type="index" :width="80" label="序号" align="center" />
<el-table-column
v-for="item in tableColums"
:key="item.key"
:prop="item.key"
align="center"
:label="item.title"
:width="item.width"
:min-width="item.minWidth"
show-overflow-tooltip
:formatter="item.formatter"
sortable
/>
</el-table>
<el-pagination
:current-page="tablePagination.currentPage"
:page-sizes="tablePagination.pageSizes"
:page-size="tablePagination.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="tablePagination.total"
@size-change="setPage"
@current-change="setPage($event, true)"
/>
</section>
</template>
<script>
import { downloadPdfHandle } from '@/api/inventory.js'
import axios from 'axios'
export default {
name: 'IntegrationWithWaveTable',
props: {},
data() {
return {
// 加载中
loading: false,
// 工具栏
tools: [],
// 选中表格列
selectionRow: [],
// 分页
tablePagination: {
currentPage: 1,
pageSize: 10,
total: 0,
pageSizes: [10, 20, 50]
},
// 序号
indexRow: { title: '序号', align: 'center', width: '70' },
// 器材验收单动态配置的表格列
colums: [
{
title: '浏览',
show: true,
key: 'fname',
align: 'center',
width: 220
},
{
align: 'center',
minWidth: '120',
title: '验收单',
show: true,
key: 'testNo',
sortable: true
},
{
align: 'center',
minWidth: '110',
title: '是否合格',
show: true,
key: 'isPassCode',
sortable: true,
formatter: (row, column, cellValue, index) => {
if (cellValue === 'Y') {
return '是'
} else {
return '否'
}
}
},
{
align: 'center',
minWidth: '120',
title: '物料类型',
show: true,
key: 'jobOrder.dxProcessMaterial.resType2.typeCode',
sortable: true
},
{
align: 'center',
minWidth: '120',
title: '编码',
show: true,
key: 'jobOrder.dxProcessMaterial.resCode',
sortable: true
},
{
align: 'center',
minWidth: '120',
title: '名称',
show: true,
key: 'jobOrder.dxProcessMaterial.resName',
sortable: true
},
{
align: 'center',
minWidth: '150',
title: '型号/牌号/件号',
show: true,
key: 'jobOrder.dxProcessMaterial.modelNo',
sortable: true
},
{
align: 'center',
minWidth: '120',
title: '技术条件',
show: true,
key: 'jobOrder.dxProcessMaterial.techSpec',
sortable: true
},
{
align: 'center',
minWidth: '120',
title: '规格',
show: true,
key: 'jobOrder.dxProcessMaterial.spec',
sortable: true
},
{
align: 'center',
minWidth: '120',
title: '供应状态',
show: true,
key: 'jobOrder.dxProcessMaterial.supplyStatus',
sortable: true
},
{
align: 'center',
minWidth: '150',
title: '热处理/炉/批号',
show: true,
key: 'jobOrder.lotNo',
sortable: true
},
{
align: 'center',
minWidth: '170',
title: '系列号',
show: true,
key: 'jobOrder.serialNo',
sortable: true
},
{
align: 'center',
minWidth: '120',
title: '机型',
show: true,
key: 'jobOrder.airModel',
sortable: true
},
{
align: 'center',
minWidth: '120',
title: '架次',
show: true,
key: 'jobOrder.sorties',
sortable: true
},
{
align: 'center',
minWidth: '130',
title: '入库单位',
show: true,
key: 'jobOrder.reqUnit',
sortable: true
},
{
align: 'center',
minWidth: '120',
title: '库存数量',
show: true,
key: 'storageAmount',
sortable: true
},
{
align: 'center',
minWidth: '120',
title: '库房',
show: true,
key: 'jobOrder.storageName',
sortable: true
},
{
align: 'center',
minWidth: '120',
title: '库位',
show: true,
key: 'jobOrder.storageUnitName',
sortable: true
},
{
align: 'center',
minWidth: '120',
title: '供应商',
show: true,
key: 'jobOrder.supplier.supplierName',
sortable: true
},
{
align: 'center',
minWidth: '120',
title: '制造商',
show: true,
key: 'jobOrder.manufacturer',
sortable: true
},
{
align: 'center',
minWidth: '120',
title: '到货日期',
show: true,
key: 'jobOrder.arrivalDate',
sortable: true,
formatter: (row, column, cellValue, index) =>
cellValue && cellValue.split(' ').length > 1
? cellValue.split(' ')[0]
: '/'
},
{
align: 'center',
minWidth: '120',
title: '生产日期',
show: true,
key: 'jobOrder.producedTime',
sortable: true,
formatter: (row, column, cellValue, index) =>
cellValue && cellValue.split(' ').length > 1
? cellValue.split(' ')[0]
: '/'
},
{
align: 'center',
minWidth: '150',
title: '保质期/贮存期',
show: true,
key: 'jobOrder.qualityPeriod',
sortable: true,
formatter: (row, column, cellValue, index) =>
cellValue && cellValue.split(' ').length > 1
? cellValue.split(' ')[0]
: '/'
},
{
align: 'center',
minWidth: '120',
title: '最长期',
show: true,
key: 'jobOrder.longPeriod',
sortable: true,
formatter: (row, column, cellValue, index) =>
cellValue && cellValue.split(' ').length > 1
? cellValue.split(' ')[0]
: '/'
},
{
align: 'center',
minWidth: '120',
title: '抽查期',
show: true,
key: 'jobOrder.spotCheckPeriodMounch',
sortable: true
},
{
align: 'center',
minWidth: '150',
title: '到货标准/图号',
show: true,
key: 'jobOrder.arrivedDrawNo',
sortable: true
},
{
align: 'center',
minWidth: '150',
title: '到货版次',
show: true,
key: 'jobOrder.arrivalVer',
sortable: true
},
{
align: 'center',
title: '入库单价',
show: true,
key: 'jobOrder.stockUnitPrice',
sortable: true,
minWidth: 120
},
{
align: 'center',
minWidth: '120',
title: '入库金额',
show: true,
key: 'jobOrder.stockPrice',
sortable: true
}, // 固定 8
{
align: 'center',
minWidth: '120',
title: '含税单价',
show: true,
key: 'jobOrder.taxUnitPrice',
sortable: true
},
{
align: 'center',
minWidth: '120',
title: '含税金额',
show: true,
key: 'jobOrder.taxPrice',
sortable: true
},
{
align: 'center',
title: '报检人',
show: true,
key: 'jobOrder.itemUserName',
sortable: true,
minWidth: 100
},
{
align: 'center',
title: '合同号',
show: true,
key: 'jobOrder.contractNo',
sortable: true,
minWidth: 100
},
{
align: 'center',
title: '备注',
show: true,
key: '',
sortable: true,
minWidth: 100
}
],
// 默认展示的表格列
tableColums: [],
// 表格数据
tableData: [],
// 表格样式配置
tableOptions: {
stripe: true,
border: true,
height: '100%'
}
}
},
watch: {},
created() {
this.setDefaultColums()
},
mounted() {},
methods: {
// 设置默认展示列
setDefaultColums() {
this.tableColums = this.colums.filter((item) => item.show)
},
// 初始化数据
init() {
// 设置数据
this.loading = true
this.tableData = []
var id = this.$parent.$parent.$parent.$parent.$parent.$refs.left.$refs
.tree.rowData.id
var number = this.$parent.$parent.$parent.$parent.activeName
if (!id || !number) {
return
}
const params = {
id: id,
number: number,
pageFrom: this.tablePagination.currentPage,
pageSize: this.tablePagination.pageSize,
numberOrName: this.$parent.search
}
// 发送请求
this.HttpRequest(
'/DxProcessPlan/planDetails',
params,
'post'
)
.then((res) => {
this.tableData = res.items.jobResponseInStorageVoDxPage.content
this.tablePagination.total =
res.items.jobResponseInStorageVoDxPage.totalElements
})
.catch((err) => console.error(err))
.finally(() => {
this.loading = false
})
},
cellClick(row, column, cell, event) {
if (column.property === 'fname') {
this.handleExport(row)
}
},
/**
* 页码触发
*/
setPage($event, state) {
if (state) {
this.tablePagination.currentPage = $event
} else {
this.tablePagination.currentPage = 1
this.tablePagination.pageSize = $event
}
this.init()
},
// 选择项发生改变
selectionChange(val) {
this.selectionRow = val
this.$emit('selectionRow', val)
},
cellClassName({ row, column, rowIndex, columnIndex }) {
if (column.property === 'fname') {
return 'see-excel'
}
return 'asdasf'
},
handleExport(row) {
const baseURl = downloadPdfHandle()
axios({
method: 'get',
url: `/dfs/fileManager/downloadio?fileId=${row.fileId}`,
baseURL: baseURl,
params: {},
headers: { token: `${localStorage.getItem('token')}`, 'equipment_id': `${localStorage.getItem('uid')}` },
responseType: 'arraybuffer'
})
.then((res) => {
const blob = new Blob([res.data], {
type:
'application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
})
if (window.navigator.msSaveOrOpenBlob) {
navigator.msSaveBlob(blob)
} else {
const elink = document.createElement('a')
elink.download = row.fname
elink.style.display = 'none'
elink.href = URL.createObjectURL(blob)
document.body.appendChild(elink)
elink.click()
document.body.removeChild(elink)
}
// } else {
// // IE10+下载
// navigator.msSaveBlob(blob)
// }
})
.catch((err) => {
console.error(err)
})
.finally(() => {
this.disabled = false
this.loading = false
})
}
}
}
</script>
<!--
* @LastEditTime: 2024-07-09 10:09:20
* @Description: 实物构型管理
-->
<template>
<section class="physicalConfigurationManagement">
<dee-fold-pane
:min-percent="18"
:default-percent="18"
split="vertical"
class="detail-pane"
>
<template slot="paneL">
<div class="left-container">
<Left ref="left" />
</div>
</template>
<template slot="paneR">
<div class="right-container">
<!-- 223333 -->
<Right ref="right" :collapse="collapse" />
</div>
</template>
</dee-fold-pane>
</section>
</template>
<script>
import Left from './components/left'
import Right from './components/right'
export default {
name: 'PhysicalConfigurationManagement',
componentName: '实物构型管理',
components: {
Left,
Right
},
data() {
return {
collapse: true
}
},
methods: {
handleCollapse(val) {
// this.collapse = val
}
}
}
</script>
<style lang="scss">
.physicalConfigurationManagement{
width: 100%;
height: 100%;
padding: 4px;
box-sizing: border-box;
.left-container {
height: 100%;
overflow-x:hidden;
.search-box {
height: 150px;
font-size: 14px;
.title {
margin-left: 10px;
text-align: left;
margin-top: 10px;
}
.search-icon {
display: inline-block;
width: 21px;
height: 21px;
background: url(/icons/r-access.png) no-repeat;
background-size: contain;
vertical-align: middle;
}
label {
margin-right: 6px;
display: inline-block;
}
.el-select {
width: calc(100% - 60px);
}
.row {
line-height: 40px;
height: 40px;
text-align: center;
}
}
.station-box {
height: calc(100% - 190px);
.search-area {
display: flex;
align-items: center;
justify-content:flex-start;
padding: 6px 0px;
.search-input{
// width: calc(100% - 150px);
// flex:1;
margin-right:10px;
}
}
}
.box {
// width: 100%;
margin: 4px;
border: 1px solid #d8d8d8;
border-radius: 8px;
padding: 4px;
.plan-tree {
height: 100%;
overflow: scroll;
.highlight-text{
background: yellow;
}
.el-tree-node {
width: max-content;
min-width: 100%;
}
.el-tree-node.is-current > .el-tree-node__content {
background-color: rgb(214, 214, 214) !important;
}
.el-tree-node:focus > .el-tree-node__content {
background-color: #fff;
}
&.el-tree--highlight-current .el-tree-node__content {
&.disabled {
color: #c0c4cc;
cursor: not-allowed;
background-color: #fff;
}
&.is-curr:not(.disabled),
&:hover:not(.disabled) {
font-weight: bold;
color: rgb(31, 30, 30);
background-color: rgb(214, 214, 214);
}
}
.el-tree-node {
.el-tree-node__content {
height: 40px !important;
.el-tree-node__expand-icon.is-leaf{
color: transparent !important;
}
.el-tree-node__expand-icon {
color: #000;
font-size: 24px;
}
i {
display: inline-block;
vertical-align: middle;
margin: 10px;
}
.tree1 {
background: url('/icons/aircraft.png') no-repeat;
width: 32px;
height: 30px;
}
.tree2 {
width: 21px;
height: 21px;
background: url('/icons/u513.png') no-repeat;
background-size: contain;
}
.tree3 {
width: 21px;
height: 21px;
background: url('/icons/u517.png') no-repeat;
background-size: contain;
}
.label {
vertical-align: middle;
}
.Issued,
.Run,
.New,
.Yes,
.Delivery {
color: #0000ff;
}
.Finish {
color: #008000;
}
.Reserved {
color: #ff0000;
}
.Not {
color: #999999;
}
.Paused {
color: #ffff00;
}
}
}
}
}
}
.right-container {
position: relative;
height: 96%;
margin-left: 20px;
.areaUpdateTip{
position: absolute;
top: 20px;
right: 40px;
color: #ff0000;
}
}
}
</style>
......@@ -58,10 +58,6 @@ export default {
icon: '/icons/home/报表中心.png',
title: '报表中心'
},
// {
// icon: '/icons/home/实物构型管理.png',
// title: '实物构型管理'
// },
{
icon: '/icons/home/基础数据管理.png',
title: '基础数据管理'
......@@ -83,6 +79,10 @@ export default {
{
icon: '/icons/home/单架次MBOM.png',
title: '单架次MBOM配置'
},
{
icon: '/icons/home/实物构型管理.png',
title: '实物构型管理'
}
]
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment