123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701 |
- <template>
- <el-row>
- <el-col :span="8" style="height:100%;">
- <el-row class="halfHeight pbstb">
- <tf-title>PBS编码规则模板
- <template #append>
- <el-button type="primary" size="mini" icon="el-icon-circle-plus-outline">添加</el-button>
- <el-button type="danger" size="mini" icon="el-icon-delete">删除</el-button>
- </template>
- </tf-title>
- <tf-table highlight-current-row @selection-change="selectChange" :pagination="pagination" @page-change="onPageChange" :data="pbsmodels" @row-click="(row)=>{rowClick(row.id)}">
- <el-table-column type="selection" width="50px"></el-table-column>
- <el-table-column label="序号" type="index" width="50px"></el-table-column>
- <el-table-column label="名称" prop="name"></el-table-column>
- <el-table-column label="状态" prop="isUse" :formatter="(row,column,cellValue)=>{
- return cellValue==='0'?'未使用':'使用中'
- }"></el-table-column>
- </tf-table>
- </el-row>
- <el-row class="halfHeight">
- <tf-title>PBS结构网预览</tf-title>
- <el-tree :expand-on-click-node='false' :default-expand-all="true" node-key="id" :data="pbsTreeData" :props="treeProps"></el-tree>
- </el-row>
- </el-col>
- <el-col :span="16" class="pbsDefine">
- <tf-title>PBS编码规则定义</tf-title>
- <el-row class="preview">
- <el-row><span>编码预览:{{codePreview}}</span></el-row>
- <el-row class="previewBtn">
- <div class="btngroup" v-for="(item,index) in selectedPbs.pbsLevelList" :key="item.alevel">
- <el-button type="primary" @click="selectPBSNode(item.alevel)" plain size="medium">{{item.codeView}}</el-button>
- <el-select size="mini" placeholder="" v-model="item.connector" v-if="index!==selectedPbs.pbsLevelList.length-1">
- <el-option value="" label=""></el-option>
- <el-option value="." label="."></el-option>
- </el-select>
- </div>
- </el-row>
- <el-divider></el-divider>
- </el-row>
- <el-row class="nodeDefine">
- <el-form label-width="80px" :model="currentLevel">
- <el-form-item label="节点级别">
- <el-select class="col16" v-model="currentLevel.alevel">
- <el-option v-for="level in selectedPbs.alevel" :key="level" :value="level" :label="level+'级'"></el-option>
- </el-select>
- </el-form-item>
- <el-form-item label="节点类型">
- <el-input class="col16" type="text" v-model="currentLevel.levelName"></el-input>
- </el-form-item>
- <el-form-item label="编码说明">
- <el-input class="col16" type="text" v-model="currentLevel.contents"></el-input>
- </el-form-item>
- <el-form-item label="编码定义">
- <el-button size="mini" icon="el-icon-plus" type="primary" @click="addNodeCodeWidget(null,true)" plain></el-button>
- </el-form-item>
- <el-form-item>
- <el-row style="marginBottom:20px;" :gutter="20" v-for="(item,index) in currentLevel.pbsCodelist" :key='index'>
- <el-col :span="5">
- <el-select size="small" v-model="item.codeType" style="width:100%">
- <el-option value="1" label="业务对象类型"></el-option>
- <el-option value="2" label="输入框"></el-option>
- <el-option value="3" label="流水号"></el-option>
- </el-select>
- </el-col>
- <el-col :span="5" v-if="item.codeType==='1'">
- <el-input size="small" v-model="item.boName" placeholder="点击选择业务对象"></el-input>
- </el-col>
- <el-col :span="10" v-else-if="item.codeType==='2'">
- <el-col :span="12" style="paddingLeft:0">
- <el-input size="small" v-model="item.codeLength" placeholder="编码长度"></el-input>
- </el-col>
- <el-col :span="12">
- <el-input size="small" v-model="item.contents" placeholder="编码说明"></el-input>
- </el-col>
- </el-col>
- <el-col :span="5" v-else-if="item.codeType==='3'">
- <el-input size="small" v-model="item.codeLength" placeholder="编码长度"></el-input>
- </el-col>
- <el-col :span="3">
- <el-button size="small" icon="el-icon-delete" type="danger" @click="removeNodeCodeWidget(index)"></el-button>
- </el-col>
- </el-row>
- </el-form-item>
- </el-form>
- </el-row>
- <el-row v-if="selectedPbs.isUse==='0'" class="footerBtns">
- <el-divider></el-divider>
- <el-button type="primary">提交</el-button>
- <el-button type="primary" style="margin-right:100px;">清空</el-button>
- </el-row>
- </el-col>
- <tf-dialog title="添加PBS模板" :visible.sync='isAddModelShow' width='600px'>
- <el-form v-model="addModelForm" label-width="100px">
- <el-form-item label="名称">
- <el-input v-model="addModelForm.name"></el-input>
- </el-form-item>
- <el-form-item label="层级">
- <el-select v-model="addModelForm.alevel">
- <el-option value="3" label="3"></el-option>
- <el-option value="4" label="4"></el-option>
- <el-option value="5" label="5"></el-option>
- <el-option value="6" label="6"></el-option>
- <el-option value="7" label="7"></el-option>
- <el-option value="8" label="8"></el-option>
- <el-option value="9" label="9"></el-option>
- <el-option value="10" label="10"></el-option>
- </el-select>
- </el-form-item>
- <el-form-item label="备注">
- <el-input :rows="2" type="textarea" v-model="addModelForm.remark"></el-input>
- </el-form-item>
- </el-form>
- <div slot="footer" style="text-align:right">
- <el-button size="small" @click="isAddModelShow=false">取消</el-button>
- <el-button size="small" type="primary" @click="submitAddModel">提交</el-button>
- </div>
- </tf-dialog>
- </el-row>
- </template>
- <script lang="ts">
- interface pbsDefine {
- name: string
- isUse: string
- id: number
- pbsLevelList: Array<pbsStruct>
- alevel?: number
- create_user?: string
- create_time?: string
- code_view?: string
- }
- interface pbsStruct {
- id?: number
- levelName: string
- contents: string
- codeView: string
- connector: string
- alevel: number
- pbsCodelist?: Array<pbsNodeCode>
- pbsId: number
- }
- interface pbsNodeCode {
- codeType: string
- codeLength?: number
- id?: string
- contents?: string
- boId?: number
- }
- import { Vue, Prop, Watch, Component } from 'vue-property-decorator'
- import { getDefaultPagination } from '@/utils/constant'
- import {
- getPBScodeRuleList_api,
- deletePbsModelByIds,
- addPBScodeRule_api,
- getPBScodeRuleInfo_api,
- PutPBScodeRule_api
- } from '@/api/APIs'
- @Component({
- name: 'PbsManagement'
- })
- export default class PbsManagement extends Vue {
-
- pagination = getDefaultPagination()
-
- selectModels = []
-
- treeProps = {
- children: 'children',
- label: 'name'
- }
-
- addModelForm = {
- alevel: '3',
- name: '',
- remark: ''
- }
-
- pbsTreeData = []
-
- selectedPbs: pbsDefine = {
- name: '',
- isUse: '0',
- id: undefined,
- pbsLevelList: [],
- alevel: undefined,
- create_user: '',
- create_time: '',
- code_view: ''
- }
-
- currentLevel: pbsStruct = {
- id: undefined,
- levelName: '',
- contents: '',
- codeView: '',
- connector: '',
- alevel: undefined,
- pbsCodelist: [],
- pbsId: undefined
- }
-
- pbsmodels = []
-
- codePreview = ''
-
- isAddModelShow = false
- mounted() {
- this.getModelList()
- }
-
- onPageChange(pagination) {
- this.pagination = { ...this.pagination, ...pagination }
- this.getModelList()
- }
-
- getModelList() {
- getPBScodeRuleList_api(this.pagination).then((result) => {
- if (result.code === 1) {
- this.pbsmodels = result.result.records
-
- if (this.pbsmodels.length > 0) {
- this.rowClick(this.pbsmodels[0].id)
- }
- const { current, size, total } = result.result
- this.pagination = { current, size, total }
- }
- })
- }
-
- rowClick(pbsID: number, selectNode: boolean = false, level: number = 0) {
- getPBScodeRuleInfo_api({ id: pbsID })
- .then((e) => {
- let nodeTree = undefined
- if (e.code !== 1) {
- this.$message.error('获取PBS模板信息失败')
- return
- }
- const pbs = e.result as pbsDefine
- this.selectedPbs = pbs
- if (pbs.alevel !== pbs.pbsLevelList.length) {
- this.initPbsLevelList(pbs)
- }
- this.initRuleLevelSelect(pbs.alevel)
- const pbsLevel = pbs.pbsLevelList.sort(function (a, b) {
- return a.alevel - b.alevel
- })
-
- const psbLevelClone = pbsLevel.map((item) => {
- return item
- })
- psbLevelClone.reverse().forEach((item: pbsStruct, index: number) => {
- if (index === 0) {
- nodeTree = {
- id: item.alevel,
- name: item.levelName,
- alevel: item.alevel
- }
- } else {
- const node = {
- id: item.alevel,
- name: item.levelName,
- alevel: item.alevel,
- children: [nodeTree]
- }
- nodeTree = node
- }
- })
- this.pbsTreeData = [nodeTree]
- this.initPbsRuleDefine(pbsLevel, selectNode, level)
- })
- .catch((err) => {
- console.error(err)
- })
- }
-
- initPbsLevelList(pbs: pbsDefine) {
- const list = pbs.pbsLevelList
- const len = pbs.alevel
- const levels: pbsStruct[] = []
- if (list.length === 0) {
- for (let i = 0; i < len; i++) {
- levels.push({
- alevel: i + 1,
- connector: i === len - 1 ? '' : '.',
- pbsId: pbs.id,
- levelName: '未定义级别',
- contents: '',
- codeView: 'N*',
- pbsCodelist: []
- })
- }
- } else {
- for (let i = 0; i < len; i++) {
- const target = list.find((node) => node.alevel === i + 1)
- if (target) {
- levels.push(target)
- } else {
- levels.push({
- alevel: i + 1,
- connector: i === len - 1 ? '' : '.',
- pbsId: pbs.id,
- levelName: '未定义级别',
- contents: '',
- codeView: 'N*',
- pbsCodelist: []
- })
- }
- }
- }
- pbs.pbsLevelList = levels
- }
-
- initRuleLevelSelect(level: number) {
-
-
-
-
-
-
-
-
-
-
- }
-
- initPbsRuleDefine(pbsDefine: pbsStruct[], selectNode: boolean = false, level: number) {
- if (!pbsDefine || pbsDefine.length < 3) {
- console.error('error')
- return
- }
-
- const codeView = []
- pbsDefine.forEach((item) => {
- codeView.push(item.codeView)
- codeView.push(item.connector)
- })
- this.codePreview = codeView.join('')
- if (selectNode) {
- const node = pbsDefine.find(item=>{ return item.alevel === level; });
- this.currentLevel = node;
- this.selectPBSNode(node.alevel);
- } else {
- this.selectPBSNode(pbsDefine[0].alevel);
- }
- }
-
- deletePbsModel() {
- const ids = this.selectModels.map((item) => item.id).join(',')
- this.$confirm('是否删除PBS编码模板?', '提示', {
- type: 'warning'
- }).then(() => {
- deletePbsModelByIds({ ids: ids })
- .then((result) => {
- if (result.code === 1) {
- this.$message.success('删除成功')
- this.getModelList()
- }
- })
- .catch((err) => {
- console.error(err)
- })
- })
- }
-
- addModel() {
- this.isAddModelShow = true
- this.addModelForm.alevel = '3'
- this.addModelForm.name = ''
- this.addModelForm.remark = ''
- }
-
- submitAddModel() {
- if (this.addModelForm.name.trim() === '') {
- this.$message.warning('请输入模板名称')
- return
- }
- const params = {
- alevel: this.addModelForm.alevel,
- name: this.addModelForm.name,
- remark: this.addModelForm.remark
- }
- addPBScodeRule_api(params).then((result) => {
- if (result.code === 1) {
- this.$message.success('添加模板成功')
- this.getModelList()
- } else {
- this.$message.error('添加模板失败')
- }
- })
- }
-
- savePbsLevel() {
- if (!this.currentLevel && parseInt(this.selectedPbs.isUse) === 1) {
- return
- }
- const that = this
- const selectNode = this.currentLevel
- let isCorrect = true
- const level: pbsStruct = {
- levelName: selectNode.levelName,
- contents: selectNode.contents,
- connector: selectNode.connector,
- codeView: selectNode.codeView,
- alevel: selectNode.alevel,
- pbsId: selectNode.pbsId,
- pbsCodelist: selectNode.pbsCodelist,
- id: selectNode.id
- }
- const name = selectNode.levelName
- const contents = selectNode.contents
-
- const codeLen = selectNode.pbsCodelist.length
- if (contents === '' || name === '' || codeLen === 0) {
- this.$message.warning('请完善层级信息')
- return
- }
-
- const codeDe: pbsNodeCode[] = []
- selectNode.pbsCodelist.forEach((el) => {
- const codeType = el.codeType
- if (codeType === '1') {
- const boId = el.boId
- if (!boId) {
- this.$message.warning('请选择业务对象')
- isCorrect = false
- return
- }
- } else if (codeType === '2') {
- const codeLen = el.codeLength.toString().trim()
- const codeRemark = el.contents
- if (codeLen === '' || codeRemark === '') {
- this.$message.warning('请填写编码长度或说明')
- isCorrect = false
- return
- }
- if (isNaN(parseInt(codeLen)) || parseInt(codeLen) > 10) {
- this.$message.warning('请填写编码长度,不超过10位')
- isCorrect = false
- return
- }
- } else if (codeType === '3') {
- const codeLen = el.codeLength.toString().trim()
- if (isNaN(parseInt(codeLen)) || parseInt(codeLen) > 10) {
- this.$message.warning('请填写编码长度,不超过10位')
- isCorrect = false
- return
- }
- }
- })
- if (isCorrect && codeDe.length === 0) {
- this.$message.warning('请添加编码定义')
- return
- }
- if (!isCorrect) {
- return
- }
- level.codeView = this.computeCodeView(level)
- PutPBScodeRule_api(level).then((e) => {
- if (e.code === 1) {
- this.$message.success('保存成功')
-
- this.rowClick(that.selectedPbs.id, true, level.alevel)
- } else {
- this.$message.error('保存失败')
- }
- })
- }
-
- computeCodeView(level: pbsStruct) {
- const hasBOCode = level.pbsCodelist.find((item, index) => {
- return !item.codeLength || item.codeLength <= 0
- })
- if (hasBOCode) {
- return level.codeView
- } else {
- const codeView = []
- let str: string = 'N'
- level.pbsCodelist.forEach((item) => {
- codeView.push(str.repeat(item.codeLength))
- })
- return codeView.join('')
- }
- }
-
- removeNodeCodeWidget(index) {
- this.currentLevel.pbsCodelist.splice(index, 1)
- }
-
- addNodeCodeWidget(code: pbsNodeCode, isEditable: boolean = true) {
- if (!code) {
- code = {
- codeType: '1',
- boId: undefined,
- codeLength: undefined,
- contents: ''
- }
- this.currentLevel.pbsCodelist.push(code)
- }
- let codeLen = ''
- if (code.codeLength) {
- codeLen = code.codeLength.toString()
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- }
-
- selectPBSNode(alevel: number) {
- if (!this.selectedPbs) return
- const pbsDefine = this.selectedPbs.pbsLevelList
- const node = pbsDefine.find((item) => item.alevel === alevel)
- this.currentLevel = node
- const codes = node.pbsCodelist || []
- codes.forEach((item, index) => {
- this.addNodeCodeWidget(item, false)
- })
- }
-
- selectChange(selection) {
- this.selectModels = selection
- }
- }
- </script>
- <style lang="scss" scoped>
- @import '~@/styles/mixin.scss';
- .halfHeight {
- height: 50%;
- position: relative;
- }
- .pbstb {
- .tf-table {
- height: calc(100% - 52px);
- padding: 0;
- }
- }
- .pbsDefine {
- position: relative;
- height: 100%;
- padding-left: 10px;
- .preview {
- .el-row {
- padding: 5px 10px;
- }
- .previewBtn {
- display: flex;
- .btngroup {
- .el-button {
- margin-right: 10px;
- }
- .el-select {
- margin-right: 10px;
- width: 70px;
- }
- }
- }
- }
- .footerBtns {
- position: absolute;
- bottom: 35px;
- left: 0;
- right: 0;
- }
- .nodeDefine {
- overflow-y: auto;
- overflow-x: hidden;
- height: calc(100% - 285px);
- @include scrollBar;
- .col16,
- .col16.el-input {
- width: 66.6666666667%;
- }
- }
- }
- </style>
|