Просмотр исходного кода

Merge branch 'master' of http://git.dongkesoft.com:9001/DK-MES-3.0/mes-web

hongxudong 1 год назад
Родитель
Сommit
bc2eb3db45

+ 2 - 2
.env.dev

@@ -1,7 +1,7 @@
 NODE_ENV = 'development'
 VUE_APP_BUILD_TYPE='dev'
-VUE_APP_SERVER_URL='http://localhost:6001'
-#VUE_APP_SERVER_URL='https://s.dev01.dkiboss.com:6010/api'
+#VUE_APP_SERVER_URL='http://localhost:6001'
+VUE_APP_SERVER_URL='https://s.dev01.dkiboss.com:6010/api'
 VUE_APP_UPLOAD_URL='https://s.dev01.dkiboss.com:6010/api/mdm-server/file/upload'
 VUE_APP_EXPORT_URL='http://localhost:5000/'
 VUE_APP_EXPORT_SQL_URL='http://s.dev01.dkiboss.com:6010/custom-report-sql.sql'

+ 4 - 0
src/api/pages/mst/process.js

@@ -22,5 +22,9 @@ export const routeUrl = {
   processFlow: {
     // 流程
     processSetting: {key: 'processSetting', url: '/process/process-flow/process-setting', chooseFlag: true},
+    // 编辑 initFlag(是否进入加载基础数据的方法)
+    edit: {key: 'edit', method: 'edit', initFlag: false},
+    // 新建 initFlag(是否进入加载基础数据的方法)
+    add: {key: 'add', method: 'add', initFlag: false},
   }
 }

+ 0 - 0
src/assets/icons/装卸.png → src/assets/icons/climbKiln.png


+ 0 - 0
src/assets/icons/收起.png → src/assets/icons/close.png


+ 0 - 0
src/assets/icons/检查.png → src/assets/icons/finishCheck.png


BIN
src/assets/icons/halfCheck.png


+ 0 - 0
src/assets/icons/火炉.png → src/assets/icons/inKiln.png


+ 0 - 0
src/assets/icons/展开.png → src/assets/icons/open.png


+ 0 - 0
src/assets/icons/火炉1.png → src/assets/icons/outKiln.png


+ 0 - 0
src/assets/icons/回收.png → src/assets/icons/recover.png


+ 0 - 0
src/assets/icons/登记.png → src/assets/icons/register.png


+ 0 - 0
src/assets/icons/马桶.png → src/assets/icons/shaping.png


+ 0 - 0
src/assets/icons/装卸1.png → src/assets/icons/uninstallKiln.png


+ 2 - 2
src/components/base/dk-table/dk-table-column.vue

@@ -9,8 +9,8 @@
     <template #header="{ row,column,columnIndex }">
       <!--树结构折叠展开-->
       <div v-if="treeFlag" class="seq-class">
-        <img src="@/assets/icons/展开.png" style="width: 24px;height: 24px;" @click="$emit('expandAll')"/>
-        <img src="@/assets/icons/收起.png" style="width: 24px;height: 24px;margin-left: 3px" @click="$emit('unExpandAll')"/>
+        <img src="@/assets/icons/open.png" style="width: 24px;height: 24px;" @click="$emit('expandAll')"/>
+        <img src="@/assets/icons/close.png" style="width: 24px;height: 24px;margin-left: 3px" @click="$emit('unExpandAll')"/>
       </div>
       <!--可操作添加删除表头-->
       <div v-else-if="headerOperateFlag" class="seq-class">

+ 8 - 1
src/components/base/edit-table/edit-table.vue

@@ -3104,8 +3104,15 @@ export default {
         if (this.errorInfoFlag) {
           columns.splice(1, 0, {type: 'info', field: 'info', fixed: 'left', width: '15'})
         }
-        columns.splice(0, 0, {type: 'blank', field: 'blank', width: '1'})
       }
+      //如果有序号,并且有checkBox,checkBox的位置要在seq之前
+      let checkboxIndex = columns.findIndex(item => item.type === 'checkbox');
+      if(checkboxIndex>-1){
+          const item = columns.splice(checkboxIndex, 1)[0]; // 从原位置删除元素
+          columns.unshift(item); // 将元素添加到数组最前面
+      }
+      columns.splice(0, 0, {type: 'blank', field: 'blank', width: '1'})
+
       this.columnsData = columns;
     },
     /**

+ 1 - 1
src/components/business/multi-select/multi-select.vue

@@ -481,7 +481,7 @@ export default {
           this.batchRowsPage = []
           let arr = []
           if (res.data && res.data.list) {
-            arr = res.data.list;
+            arr = res.data.list.map(it=>({...it, id: it[this.selectKey]}));
           }
           if (!arr && res.data) {
             arr = res.data;

+ 6 - 4
src/components/business/process/node-modal/node-modal.vue

@@ -2,7 +2,7 @@
 <template>
   <div class="main-div" ref="node-modal-div" v-if="existsFlag">
     <DkModal
-      :title="'工序 - '+nodeData.nodeKindName"
+      :title="'工序 - '+nodeKindList.find(it => it.kindCode == nodeData.nodeKind)?.kindName"
       v-model="modalDisplay"
       :mask-closable="false"
       :loading="loading"
@@ -62,7 +62,8 @@
                        :options="opnKindList.filter(it=>!(nodeControl?.opnKind?.invalidCode||[]).includes(it.kindCode))"/>
           </DkFormItem>
           <!--    载具模式 -->
-          <DkFormItem prop="carKind" key="carKind" :required="true" v-if="[$config.processType.dressKilnCar,$config.processType.exchangeKilnCar].includes(nodeData.opnKind)">
+          <DkFormItem prop="carKind" key="carKind" :required="true" v-if="nodeControl?.carKind?.visible
+          &&[$config.processType.dressKilnCar,$config.processType.exchangeKilnCar].includes(nodeData.opnKind)">
             <SelectPop ref="carKind" v-model="nodeData.carKind" label-key="kindName" value-key="kindCode" :multiple="false" :options="carKindList"/>
           </DkFormItem>
           <!--    计件模式    -->
@@ -169,7 +170,8 @@
                       v-if="nodeControl?.backGradeIds?.visible && ([$config.nodeKind.halfCheck,$config.nodeKind.finishCheck].includes(nodeData.nodeKind)&&nodeData.flgAloneJudge)"
                       :data-type="$config.dataType.array">
             <SelectPop ref="backGradeIds" v-model="nodeData.backGradeIds" label-key="gradeName" value-key="gradeId"
-                       :multiple="true" :options="productGradeList" @on-select="changeBackGradeIds" />
+                       :options="productGradeList.filter(it=>it.gradeKind!==$config.gradeKind.damage&&(it.gradeTypes?.length===0||it.gradeTypes.includes(nodeData.nodeKind)))"
+                       @on-select="changeBackGradeIds" />
           </DkFormItem>
           <!--    入库仓库    -->
           <DkFormItem prop="whId" :label="$t('whCodeName')" key="whId"
@@ -795,7 +797,7 @@ export default {
         this.nodeData.backGradeIds = null
       }
       // 回收时,结束工序,回收初始方式只能是后续流程
-      if (this.nodeData.flowKind === this.$config.flowKind.end) {
+      if (this.$config.nodeKind.recover===this.nodeData.nodeKind&&this.nodeData.flowKind === this.$config.flowKind.end) {
         this.recycledKindList = this.recycledKindListSocial.filter(it => it.kindCode === this.$config.recycledKind.after)
         this.$nextTick(() => {
           this.nodeData.recycledKind = this.$config.recycledKind.after

+ 6 - 3
src/locale/lang/zh-CN.js

@@ -116,7 +116,7 @@ export const button = {
   cancelLoading: '撤销装车(R)',
   addUser: '添加用户(A)',
   deleteUser: '删除用户(D)',
-  loadLimit: '装载数量限制(L)',
+  loadLimit: '装载限制(L)',
   addWorkItem: '添加报工明细(N)',
   prediction: '预测(Y)',
   createMoldPlan:'生成布模计划(N)',
@@ -270,7 +270,7 @@ export const formTitle = {
   'defect_setting': '缺陷设置',
   'advanced_attribute': '高级属性',
   'flow_control': '流程设置',
-  'model-car-load-limit': '装载数量限制',
+  'model-car-load-limit': '装载限制',
   'labelPrint': '标签打印',
   'labelRePrint': '标签补打',
   workSop: '作业指导书',
@@ -579,7 +579,10 @@ export const columns = {
   overallQuality: '整体质量设置',
 
   //产品型号相关
-  productModelName: '型号名称',
+  codeMouldModel: '模具编码',
+  nameMouldModel:'模具名称',
+  productModelCode:'产品编码',
+  productModelName: '产品名称',
   categoryId: '产品分类',
   pdtView: '产品视图',
   pdtModel: '产品型号',

+ 4 - 8
src/view/mst/carr-kiln-car/index.vue

@@ -8,10 +8,6 @@
       <template #left>
         <!--    查询    -->
         <BaseIndexButton right-button="carrKilnCar-select" ref="refresh" name="refresh"></BaseIndexButton>
-        <!--    清空条件    -->
-        <BaseIndexButton right-button="carrKilnCar-clear" ref="clear" name="clear"></BaseIndexButton>
-        <!--    清空条件    -->
-        <BaseIndexButton right-button="carrKilnCar-delete" ref="delete" name="delete"></BaseIndexButton>
         <!--    保存    -->
         <BaseIndexButton right-button="carrKilnCar-save" ref="save" name="save"></BaseIndexButton>
         <!--    操作日志    -->
@@ -40,7 +36,7 @@
           </DkFormItem>
 
           <div style="padding-top:2px;">
-            <DkButton type="primary" ref="confirm" size="small" @click="bindCar">{{ '增加窑车' }}</DkButton>
+            <DkButton type="success" ref="confirm" size="small" @click="bindCar">{{ '增加窑车' }}</DkButton>
           </div>
 
           <div style="padding-top:2px;  padding-left: 10px" >
@@ -111,8 +107,8 @@
           carModelId: null, // 批量设置载具型号
           displayNo: 0,
           remarks: '',
-          startNo: '',
-          carCount: '',
+          startNo: 1,
+          carCount: 1,
         },
         kilnList: [],
         carList: [],
@@ -120,7 +116,7 @@
         editList: [],
         // 窑车列表列
         carTableColumn: [
-          { field: 'choose', type: 'checkbox', width: 60, max: 60},
+          { field: 'choose', type: 'checkbox', width: 60, max: 60,fixed: 'left'},
           { field: 'carNo', type: 'number', width: 200, max: 1000, info: self.$config.carKilnCar.inputRange },
           { field: 'uniqueCode', title: this.$t('carCode'), type: 'disabled', width: 200, },
           {

+ 1 - 1
src/view/mst/label-print-layout/js/providers.js

@@ -18,7 +18,7 @@ export const providers = function (ops) {
           {
             tid: "DKModule.image",
             title: "图片",
-            data: "/img/dklogo.9404478a.png",
+            data: require('@/assets/images/dklogo.png'),
             type: "image"
           },
           {

+ 1 - 0
src/view/mst/model-car-load-limit/index.vue

@@ -70,6 +70,7 @@
         <DkFormItem prop="carModelId" :data-type="$config.dataType.number" :label="$t('carModelCode')" required>
           <SelectMagnifier v-model="formData.carModelId" :display-text="formData.carModelCodeName"
                            :type="this.$config.MagnifierType.modelCarrier"
+                           :other-condition="{modelKind:$config.modelKind.modelCarrier}"
                            :input-read-only="false"
                            :multiple="false"
                            title="载具型号"

+ 3 - 3
src/view/mst/model-product/form.vue

@@ -13,7 +13,7 @@
         <DkForm slot="content" ref="formInline" v-model="formData">
           <div id="search-cond-div" ref="search-cond-div">
             <!-- 型号编码 -->
-            <DkFormItem prop="modelCode" :required="true">
+            <DkFormItem :label="$t('productModelCode')" prop="modelCode" :required="true">
               <InputPop v-model="formData.modelCode" ref="modelCode"/>
             </DkFormItem>
             <!-- 型号名称-->
@@ -21,8 +21,8 @@
               <InputPop v-model="formData.modelName" ref="modelName"/>
             </DkFormItem>
             <!-- 产品分类 -->
-            <DkFormItem prop="categoryId" :required="true"
-                        :data-type="this.$config.dataType.number" :label="$t('modelCategory')">
+            <DkFormItem :label="$t('categoryId')" prop="categoryId" :required="true"
+                        :data-type="this.$config.dataType.number">
               <SelectPop v-model="formData.categoryId" ref="categoryId" :multiple="false"
                          :show-toolbar="true"
                          pop-type="productModelCategoryByLevel">

+ 2 - 2
src/view/mst/model-product/index.vue

@@ -43,11 +43,11 @@
                @current-change="modelPdtRadioChange"
                @pageChange="pageSizeChange">
         <!--型号编码-->
-        <DkTableColumn  field="modelCode" type="link" @on-link="handleLink(Object.assign($event,{button:'edit'}))"></DkTableColumn>
+        <DkTableColumn :title="$t('productModelCode')" field="modelCode" type="link" @on-link="handleLink(Object.assign($event,{button:'edit'}))"></DkTableColumn>
         <!--型号名称-->
         <DkTableColumn :title="$t('productModelName')" field="modelName"></DkTableColumn>
         <!--产品分类-->
-        <DkTableColumn field="categoryName"></DkTableColumn>
+        <DkTableColumn :title="$t('categoryId')" field="categoryName"></DkTableColumn>
         <!--产品规格-->
         <DkTableColumn field="pdtSpecs"></DkTableColumn>
         <!--默认商标-->

+ 3 - 2
src/view/mst/model-units/index.vue

@@ -39,7 +39,7 @@
                        @on-link="handleLink(Object.assign($event,{button:'edit'}))"></DkTableColumn>
         <DkTableColumn field="unitScale"></DkTableColumn>
         <DkTableColumn field="displayNo" sum></DkTableColumn>
-        <DkTableColumn field="unitCode" :title="$t('externalCode')"></DkTableColumn>
+        <DkTableColumn field="unitCode"></DkTableColumn>
         <DkTableColumn field="flgValid" type="switch" @on-switch-change="onSwitchChange"
                        :switch-disabled="false"></DkTableColumn>
         <DkTableColumn field="remarks" width="auto"></DkTableColumn>
@@ -69,7 +69,7 @@
           <InputNumberPop v-model="formData.displayNo" :digits=0 :min="0"/>
         </DkFormItem>
         <!--单位代码-->
-        <DkFormItem prop="unitCode" :label="$t('externalCode')">
+        <DkFormItem prop="unitCode">
           <InputPop v-model="formData.unitCode" ref="unitCode"/>
         </DkFormItem>
         <!--    备注    -->
@@ -198,6 +198,7 @@ export default {
         unitName: '',
         remarks: '',
         displayNo: 0,
+        unitScale: 0,
       }
       // 获取最大显示顺序
       this.getMaxDisplayNo(this.$config.displayNoTable.modelUnits)

+ 20 - 7
src/view/mst/model/index.vue

@@ -42,12 +42,12 @@
                :height="tableHeight" primaryKey="modelId"
                :choose-flag="false"
                @pageChange="pageSizeChange">
-        <DkTableColumn field="modelCode" type="link"
+        <DkTableColumn field="modelCode" type="link" :title="formType==$config.formCode.modelMaterial?$t('modelMaterialCode'):''"
                        v-if="formType==$config.formCode.modelProduct || formType==$config.formCode.modelEquipment || formType==$config.formCode.modelMaterial"
                        @on-link="handleLink(Object.assign($event,{button:'edit'}))"></DkTableColumn>
         <DkTableColumn field="modelName" :type="formType!=$config.formCode.modelProduct &&
                                                     formType!=$config.formCode.modelEquipment && formType!=$config.formCode.modelMaterial?'link':'text'"
-                       :title="typeFlag?$t('typesOfName'):$t('modelCName')"
+                       :title="typeFlag?$t('typesOfName'):(formType==$config.formCode.modelMaterial?$t('modelMaterialName'):$t('modelCName'))"
                        @on-link="handleLink(Object.assign($event,{button:'edit'}))"></DkTableColumn>
         <!--产品还有型号分类-->
         <DkTableColumn field="modelCategoryLevelName" v-if="formType==$config.formCode.modelProduct || formType==$config.formCode.modelCarrier"
@@ -73,7 +73,7 @@
         <DkTableColumn field="unitName" :title="$t('modelUnits')" v-if="formType==$config.formCode.modelMaterial"></DkTableColumn>
         <DkTableColumn field="modelSpecs" :title="$t('modelSpecs')" v-if="formType==$config.formCode.modelMaterial"></DkTableColumn>
         <DkTableColumn field="modelPlace" :title="$t('modelPlace')" v-if="formType==$config.formCode.modelMaterial"></DkTableColumn>
-        <DkTableColumn field="modelCategoryLevelName" v-if="formType==$config.formCode.modelMaterial"></DkTableColumn>
+        <DkTableColumn field="modelCategoryLevelName" v-if="formType==$config.formCode.modelMaterial" :title="$t('materialModelCategoryCode')"></DkTableColumn>
         <DkTableColumn field="flgValid" type="switch" @on-switch-change="onSwitchChange"
                        :switch-disabled="false"></DkTableColumn>
         <DkTableColumn field="remarks" width="auto"></DkTableColumn>
@@ -90,9 +90,9 @@
                :choose-flag="false"
                @pageChange="pageSizeChange"
       >
-        <DkTableColumn field="modelCode" type="link"
+        <DkTableColumn field="modelCode" type="link" :title="$t('codeMouldModel')"
                        @on-link="handleLink(Object.assign($event,{button:'edit'}))"></DkTableColumn>
-        <DkTableColumn field="modelName" :title="typeFlag?$t('typesOfName'):$t('modelCName')"></DkTableColumn>
+        <DkTableColumn field="modelName" :title="typeFlag?$t('typesOfName'):$t('nameMouldModel')"></DkTableColumn>
         <DkTableColumn field="stdNum"
                        :data-type="$config.dataType.number"></DkTableColumn>
         <DkTableColumn field="outputQty"
@@ -122,13 +122,26 @@
               :label-max-words="formType==$config.formCode.modelCarrier  || formType==$config.formCode.modelTypeKiln
                     || formType==$config.formCode.modelTypeMoldline
                     || formType==$config.formCode.modelTypeCar || formType==$config.formCode.modelMould?5:4">
+
+<!--        <DkTableColumn field="modelCode" type="link" :title="formType==$config.formCode.modelMaterial?$t('modelMaterialCode'):''"-->
+<!--                       v-if="formType==$config.formCode.modelProduct || formType==$config.formCode.modelEquipment || formType==$config.formCode.modelMaterial"-->
+<!--                       @on-link="handleLink(Object.assign($event,{button:'edit'}))"></DkTableColumn>-->
+<!--        <DkTableColumn field="modelName" :type="formType!=$config.formCode.modelProduct &&-->
+<!--                                                    formType!=$config.formCode.modelEquipment && formType!=$config.formCode.modelMaterial?'link':'text'"-->
+<!--                       :title="typeFlag?$t('typesOfName'):(formType==$config.formCode.modelMaterial?$t('modelMaterialName'):$t('modelCName'))"-->
+<!--                       @on-link="handleLink(Object.assign($event,{button:'edit'}))"></DkTableColumn>-->
         <!--  型号编码  -->
         <DkFormItem prop="modelCode" :span="24" required v-if="formType==$config.formCode.modelProduct || formType==$config.formCode.modelMould ||
-                                                    formType==$config.formCode.modelEquipment || formType==$config.formCode.modelMaterial">
+                                                    formType==$config.formCode.modelEquipment || formType==$config.formCode.modelMaterial"
+                    :label="formType==$config.formCode.modelMaterial?$t('modelMaterialCode'):(formType==$config.formCode.modelMould?$t('codeMouldModel'):'')">
           <InputPop v-model="formData.modelCode" ref="modelCode"/>
         </DkFormItem>
         <!--  型号名称 /类型名称 -->
-        <DkFormItem prop="modelName" :span="24" required :label="typeFlag?$t('typesOfName'):$t('modelCName')">
+        <DkFormItem prop="modelName" :span="24" required
+                    :label="typeFlag?$t('typesOfName')
+                    :(formType==$config.formCode.modelMaterial?$t('modelMaterialName')
+                    :(formType==$config.formCode.modelMould?$t('nameMouldModel')
+                    :$t('modelCName')))">
           <InputPop v-model="formData.modelName" ref="modelName"/>
         </DkFormItem>
         <!--  型号分类(目前只有产品型号、载具需要)  -->

+ 1 - 1
src/view/mst/product-defect-fine/index.vue

@@ -39,7 +39,7 @@
 
         <DkTableColumn field="fineCode" type="link" @on-link="handleLink(Object.assign($event,{button:'edit'}))"></DkTableColumn>
         <DkTableColumn field="fineName"></DkTableColumn>
-        <DkTableColumn field="deductNum" :data-type="$config.dataType.number"></DkTableColumn>
+        <DkTableColumn field="deductNum" :data-type="$config.dataType.number" :digits=2></DkTableColumn>
         <DkTableColumn field="displayNo"></DkTableColumn>
         <DkTableColumn field="flgValid" type="switch" @on-switch-change="onSwitchChange"
                        :switch-disabled="false"></DkTableColumn>

+ 1 - 0
src/view/process/process-flow/config/NodeGroup.js

@@ -142,6 +142,7 @@ NodeGroup.config({
       stroke: '#808080',
     },
   },
+  tools:['node-editor'],
 })
 // endregion
 

+ 68 - 39
src/view/process/process-flow/config/ProcessConfig.js

@@ -8,7 +8,16 @@ import { Clipboard } from '@antv/x6-plugin-clipboard'
 import { History } from '@antv/x6-plugin-history'
 import { Export } from '@antv/x6-plugin-export'
 import { MiniMap } from '@antv/x6-plugin-minimap'
-import { getImg } from '../../../../libs/base/x6-utils'
+import climbKiln from '@/assets/icons/climbKiln.png'
+import finishCheck from '@/assets/icons/finishCheck.png'
+import halfCheck from '@/assets/icons/halfCheck.png'
+import inKiln from '@/assets/icons/inKiln.png'
+import outKiln from '@/assets/icons/outKiln.png'
+import recover from '@/assets/icons/recover.png'
+import register from '@/assets/icons/register.png'
+import shaping from '@/assets/icons/shaping.png'
+import uninstallKiln from '@/assets/icons/uninstallKiln.png'
+import dklogo from '@/assets/images/dklogo.png'
 import router from '@/router'
 import config from '@/config'
 import { mapState, mapMutations } from 'vuex'
@@ -52,7 +61,7 @@ export default class Process {
       autoResize: showGraph,//自动设置宽高
       panning: {//开启拖拽画布
         enabled: true,
-        eventTypes: 'rightMouseDown',//触发画布平移的交互方式为“右键按下”
+        eventTypes: ['rightMouseDown'],//触发画布平移的交互方式为“右键按下”
       },
       grid: {//设置网格
         size: 10,
@@ -82,10 +91,10 @@ export default class Process {
         line: {
           stroke: '#A2B1C3',
           strokeWidth: 3,
-          strokeDasharray: 5,
-          style: {
-            animation: 'ant-line 30s infinite linear',
-          },
+          strokeDasharray: 6,
+          // style: {
+          //   animation: 'ant-line 30s infinite linear',
+          // },
         },
         router: {
           name: 'metro',
@@ -112,9 +121,9 @@ export default class Process {
                 stroke: '#A2B1C3',
                 strokeWidth: 3,
                 strokeDasharray: 6,
-                style: {
-                  animation: 'ant-line 30s infinite linear',
-                },
+                // style: {
+                //   animation: 'ant-line 30s infinite linear',
+                // },
               },
             },
             zIndex: 0,
@@ -220,8 +229,9 @@ export default class Process {
       .use(new Selection({//多选
         enabled: true,
         multiple: true,//是否启用点击多选,启用后按住 ctrl 或 command 键点击工序实现多选
-        rubberband: true,//是否启用多选工序功能
-        showNodeSelectionBox: true,//是否显示工序的选择框
+        rubberband: true,//是否启用框选工序功能
+        showNodeSelectionBox: true,//是否显示选择框
+        pointerEvents:'none',//事件向上冒泡
         filter: (e) => {
           return e.visible
         }
@@ -445,23 +455,42 @@ export default class Process {
     // endregion
 
     // region 鼠标移入移出 连接桩显示/隐藏
-    this.graph.on('node:mouseenter', ({ view} ) => {
+    this.graph.on('node:mouseenter', ({ node} ) => {
+      //取消动画
+      let allEdges=this.graph.getEdges()
+      allEdges?.forEach((edge) => {
+        edge.attr('line/style/animation', '')
+      })
+      //设置动画
+      let edges = this.graph.getOutgoingEdges(node)
+      edges?.forEach((edge) => {
+        edge.attr('line/style/animation', 'ant-line 30s infinite linear')
+      })
     })
 
 
     this.graph.on('node:mouseleave', ({ view} ) => {
+      console.log('node:mouseleave')
+      //取消动画
+      let allEdges=this.graph.getEdges()
+      allEdges?.forEach((edge) => {
+        edge.attr('line/style/animation', '')
+      })
     })
+
     this.graph.on('node:click', ({ node} ) => {
-      console.log('click')
+      console.log('node:click')
       // this.graph.clearTransformWidgets()
     })
+
     // 监听节点选中
     this.graph.on('node:selected', ({ node} ) => {
-      console.log('selected')
+      console.log('node:selected')
       this.showPorts(this.graph.findViewByCell(node.id),true)
     })
     this.graph.on('node:unselected', ({ node} ) => {
       this.showPorts(this.graph.findViewByCell(node.id),false)
+
     })
     // endregion
 
@@ -475,17 +504,11 @@ export default class Process {
     })
     // endregion
 
+
     // region 双击工序进入编辑模式
     this.graph.on('node:dblclick', ({ node, e }) => {
-      //如果是工序组 进入编辑模式
-      if (node.data?.parent) {
-        node.addTools({
-          name: 'node-editor',
-          args: {
-            event: e,
-          },
-        })
-      } else {
+      //如果双击的不是工序组,显示弹窗
+      if (!node.data?.parent) {
         //设置值
         store.commit('setCurrentNodeId', node.id)
         //显示弹窗
@@ -879,7 +902,7 @@ export default class Process {
         left.className = 'custom-html-left'
         right.className = 'custom-html-right'
         let img = document.createElement('img')
-        img.src = cell.getData().image
+        img.src = self.getCellImg(cell)
         img.width = 32
         img.height = 32
         let title = document.createElement('div')
@@ -887,7 +910,7 @@ export default class Process {
         title.className = 'custom-html-right-title'
         text.className = 'custom-html-right-text'
         title.innerHTML = cell.getData().nodeName
-        text.innerHTML = cell.getData().nodeKindName
+        text.innerHTML =  nodeKindList.find(it => it.kindCode == cell.getData().nodeKind)?.kindName
         left.appendChild(img)
         right.appendChild(title)
         right.appendChild(text)
@@ -929,7 +952,6 @@ export default class Process {
     const countImages = [
       {
         label: nodeKindList.find(it => it.kindCode == config.nodeKind.register)?.gradeKindDesc,
-        image: getImg('登记.png'),
         nodeKind: config.nodeKind.register,
         nodeKindName: nodeKindList.find(it => it.kindCode == config.nodeKind.register)?.kindName,
         flgJobDefect: true,
@@ -942,7 +964,6 @@ export default class Process {
       },
       {
         label: nodeKindList.find(it => it.kindCode == config.nodeKind.climbKiln)?.gradeKindDesc,
-        image: getImg('装卸.png'),
         nodeKind: config.nodeKind.climbKiln,
         nodeKindName: nodeKindList.find(it => it.kindCode == config.nodeKind.climbKiln)?.kindName,
         flgJobDefect: true,
@@ -955,7 +976,6 @@ export default class Process {
       },
       {
         label: nodeKindList.find(it => it.kindCode == config.nodeKind.inKiln)?.gradeKindDesc,
-        image: getImg('火炉.png'),
         nodeKind: config.nodeKind.inKiln,
         nodeKindName: nodeKindList.find(it => it.kindCode == config.nodeKind.inKiln)?.kindName,
         flgJobDefect: true,
@@ -968,7 +988,6 @@ export default class Process {
       },
       {
         label: nodeKindList.find(it => it.kindCode == config.nodeKind.outKiln)?.gradeKindDesc,
-        image: getImg('火炉1.png'),
         nodeKind: config.nodeKind.outKiln,
         nodeKindName: nodeKindList.find(it => it.kindCode == config.nodeKind.outKiln)?.kindName,
         flgJobDefect: true,
@@ -981,7 +1000,6 @@ export default class Process {
       },
       {
         label: nodeKindList.find(it => it.kindCode == config.nodeKind.uninstallKiln)?.gradeKindDesc,
-        image: getImg('装卸1.png'),
         nodeKind: config.nodeKind.uninstallKiln,
         nodeKindName: nodeKindList.find(it => it.kindCode == config.nodeKind.uninstallKiln)?.kindName,
         flgJobDefect: true,
@@ -1000,7 +1018,6 @@ export default class Process {
         data: {
           nodeName: item.label,
           nodeKind: item.nodeKind,
-          image: item.image,
           nodeKindName: item.nodeKindName,
           flgJobDefect: item.flgJobDefect,
           flowKind: item.flowKind,
@@ -1018,7 +1035,6 @@ export default class Process {
     const testImages = [
       {
         label: nodeKindList.find(it => it.kindCode == config.nodeKind.halfCheck)?.gradeKindDesc,
-        image: getImg('检查.png'),
         nodeKind: config.nodeKind.halfCheck,
         nodeKindName: nodeKindList.find(it => it.kindCode == config.nodeKind.halfCheck)?.kindName,
         flgJobDefect: true,
@@ -1031,7 +1047,6 @@ export default class Process {
       },
       {
         label: nodeKindList.find(it => it.kindCode == config.nodeKind.finishCheck)?.gradeKindDesc,
-        image: getImg('检查.png'),
         nodeKind: config.nodeKind.finishCheck,
         nodeKindName: nodeKindList.find(it => it.kindCode == config.nodeKind.finishCheck)?.kindName,
         flgJobDefect: true,
@@ -1050,7 +1065,6 @@ export default class Process {
         data: {
           nodeName: item.label,
           nodeKind: item.nodeKind,
-          image: item.image,
           nodeKindName: item.nodeKindName,
           flgJobDefect: item.flgJobDefect,
           flowKind: item.flowKind,
@@ -1068,7 +1082,6 @@ export default class Process {
     const specialImages = [
       {
         label: nodeKindList.find(it => it.kindCode == config.nodeKind.recover)?.gradeKindDesc,
-        image: getImg('回收.png'),
         nodeKind: config.nodeKind.recover,
         nodeKindName: nodeKindList.find(it => it.kindCode == config.nodeKind.recover)?.kindName,
         flgJobDefect: true,
@@ -1082,7 +1095,6 @@ export default class Process {
       },
       {
         label: nodeKindList.find(it => it.kindCode == config.nodeKind.shaping)?.gradeKindDesc,
-        image: getImg('马桶.png'),
         nodeKind: config.nodeKind.shaping,
         nodeKindName: nodeKindList.find(it => it.kindCode == config.nodeKind.shaping)?.kindName,
         flgJobDefect: true,
@@ -1101,7 +1113,6 @@ export default class Process {
         data: {
           nodeName: item.label,
           nodeKind: item.nodeKind,
-          image: item.image,
           nodeKindName: item.nodeKindName,
           flgJobDefect: item.flgJobDefect,
           flowKind: item.flowKind,
@@ -1129,11 +1140,11 @@ export default class Process {
     this.graph.on('view:mounted', ({ view }) => {
       if(view.cell.shape==='custom-image'){
         view.container.addEventListener("mouseenter",function () {
-          console.log('mouseenter')
+          // console.log('mouseenter')
           self.showPorts(view, true)
         },false)
         view.container.addEventListener("mouseleave",function () {
-          console.log('mouseleave')
+          // console.log('mouseleave')
           if(!self.graph.isSelected(view.cell)){
             self.showPorts(view, false)
           }
@@ -1169,4 +1180,22 @@ export default class Process {
   }
 
   // endregion
+  static imgList={
+    'climbKiln':climbKiln,
+    'finishCheck':finishCheck,
+    'halfCheck':halfCheck,
+    'inKiln':inKiln,
+    'outKiln':outKiln,
+    'recover':recover,
+    'register':register,
+    'shaping':shaping,
+    'uninstallKiln':uninstallKiln,
+  }
+
+  static getCellImg(cell) {
+    let nodeKindValue=cell.getData().nodeKind
+    let nodeKindKey=Object.keys(config.nodeKind).find(key => config.nodeKind[key] === nodeKindValue);
+    // console.log('1',self.imgList[nodeKindKey])
+    return this.imgList[nodeKindKey]
+  }
 }

+ 12 - 2
src/view/process/process-flow/index.vue

@@ -74,6 +74,7 @@
         <DkTableColumn field="recycledKindName" :title="$t('recycledKind')"></DkTableColumn>
         <DkTableColumn field="flgCheckLabel" type="switch"></DkTableColumn>
         <DkTableColumn field="pdtLabelKindsName" :title="$t('pdtLabelKinds')"></DkTableColumn>
+        <DkTableColumn field="flgJobDefect" type="switch"></DkTableColumn>
         <DkTableColumn field="flgScrap" type="switch" :title="$t('scrapFlg')"></DkTableColumn>
         <DkTableColumn field="cntPdtModelName" :title="$t('cntPdtModel')"></DkTableColumn>
         <DkTableColumn field="cntCarModelName" :title="$t('cntCarModel')"></DkTableColumn>
@@ -149,7 +150,7 @@ export default {
     return {
       flowFormData:undefined,
       graph: null,//图形对象
-      split:0.47,
+      split:0.2,
       nodeDataList:[],
       dataKindList: [],//基础数据
       productGradeList: [],//产品等级
@@ -276,6 +277,7 @@ export default {
         button: this.$config.formMode.add,
       }
       this.editAddModal = true
+      this.clear()
     },
     /**
      * @desc   : 编辑
@@ -283,6 +285,7 @@ export default {
      * @date   : 2023/2/3 14:11
      */
     edit(rows) {
+      this.clear()
       this.modalTitle = this.setTitle(this.$config.formMode.edit, 'processFlow')  // 给modal标题赋值
       this.modalParams = {
         button: this.$config.formMode.edit,
@@ -370,7 +373,14 @@ export default {
      * @date   : 2023/2/3 14:41
      */
     clear() {
-      this.$refs.formInline.resetFields();
+      // console.log('clear',this.$refs.formInline)
+      this.$refs.formInline?.resetFields();
+      this.formData={
+        flowCode: undefined,
+        flowName: undefined,
+        remarks: undefined,
+        displayNo: null
+      },
       this.getMaxDisplayNo(this.$config.displayNoTable.processFlow);
     },
   },

+ 121 - 1
src/view/process/process-flow/process-setting.vue

@@ -115,6 +115,27 @@
           <Tooltip content="显示/隐藏小地图">
             <Button icon="md-map" @click="()=>{this.showMiniMap=!this.showMiniMap}"></Button>
           </Tooltip>
+          <Tooltip :content="leftMouseContent">
+            <Button :icon="leftMouseIcon" @click="changeLeftMouse"></Button>
+          </Tooltip>
+          <Poptip trigger="hover" :class="{ 'disable-hover': !routeSelected }">
+            <Button icon="md-list" :disabled="!routeSelected"></Button>
+            <div slot="content" style="background: #f8f8f9;">
+              <Card title="连线类型" icon="md-list" :padding="0" shadow style="width: 450px;">
+                <CellGroup>
+                  <Cell title="默认" label="类似地铁轨道图,并自动避开路径上的其他节点(障碍)">
+                    <DkSwitch slot="extra" :value="currentRouter=='metro'" @on-change="()=>{currentRouter='metro';routeSelected.setRouter('metro')}"/>
+                  </Cell>
+                  <Cell title="直线" label="直线,不会避开路径上的其他节点(障碍)">
+                    <DkSwitch slot="extra" :value="currentRouter=='normal'" @on-change="()=>{currentRouter='normal';routeSelected.setRouter('normal')}"/>
+                  </Cell>
+                  <Cell title="正交" label="由水平或垂直的正交线段组成,并自动避开路径上的其他节点(障碍)">
+                    <DkSwitch slot="extra" :value="currentRouter=='manhattan'" @on-change="()=>{currentRouter='manhattan';routeSelected.setRouter('manhattan')}"/>
+                  </Cell>
+                </CellGroup>
+              </Card>
+            </div>
+          </Poptip>
           <Tooltip content="导出PNG">
             <Button icon="md-images" @click="()=>{this.graph.exportPNG('',{padding:50})}"></Button>
           </Tooltip>
@@ -176,6 +197,7 @@ import Process from '@/view/process/process-flow/config/ProcessConfig'
 import queryUtil from '@/view/process/process-flow/queryUtil'
 import { formMixin } from '@/mixins/form'
 import FileSaver from 'file-saver'
+import { Selection } from '@antv/x6-plugin-selection'
 
 export default {
   name: 'process-setting',
@@ -189,6 +211,8 @@ export default {
   },
   data() {
     return {
+      currentRouter:undefined,
+      routeSelected:undefined,
       showMiniMap:true,
       scaleValue: 1,
       scaleMax: 3,
@@ -203,6 +227,44 @@ export default {
       shopList:[],//车间
       kilnList:[],//窑炉
       whList:[],//仓库
+      leftMouseContent:'点击切换左键移动画布',
+      leftMouseIcon:'md-crop',
+      //条件label样式
+      conditionLabel:{
+        markup: [
+          {
+            tagName: 'rect',
+            selector: 'labelBody',
+          },
+          {
+            tagName: 'text',
+            selector: 'labelText',
+          },
+        ],
+        attrs: {
+          labelText: {
+            fontSize:22,
+            text: '!',
+            fill: '#4169E1',
+            textAnchor: 'middle',
+            textVerticalAnchor: 'middle',
+          },
+          labelBody: {
+            ref: 'labelText',
+            refX: -8,
+            refY: -1,
+            refWidth: '100%',
+            refHeight: '100%',
+            refWidth2: 16,
+            refHeight2: 2,
+            stroke: '#4169E1',
+            fill: '#fff',
+            strokeWidth: 1,
+            rx: 6,
+            ry: 6,
+          },
+        },
+      },
     }
   },
   created() {
@@ -224,6 +286,23 @@ export default {
   methods: {
     ...mapMutations(['setProcessNodeModalDisplay', 'setProcessEdgeModalDisplay', 'setCurrentNodeId', 'setCurrentEdgeId']),
 
+    handleMouseLeave(event){
+      event.preventDefault();
+    },
+    changeLeftMouse(){
+      console.log(this.graph)
+      if(this.leftMouseIcon=='ios-hand'){
+        this.leftMouseIcon='md-crop'
+        this.leftMouseContent='点击切换左键移动画布'
+        this.graph.panning.options.panning.eventTypes=['rightMouseDown']
+        this.graph.toggleRubberband(true)
+      }else{
+        this.leftMouseIcon='ios-hand'
+        this.leftMouseContent='点击切换左键框选主题'
+        this.graph.panning.options.panning.eventTypes=['leftMouseDown','rightMouseDown']
+        this.graph.toggleRubberband(false)
+      }
+    },
     /**
      * @desc   : 导出json方法
      * @author : 张潇木
@@ -349,6 +428,8 @@ export default {
       this.graph = Process.init(this.$refs.container,this.$refs.miniMap,this.dataKindList.filter(it=>it.kindType===this.$config.dataKind.nodeKind))
       //监听删除节点
       this.bindDeleteNodes()
+      //监听选中路线
+      this.bindRouteSelected()
       //监听画布缩放
       this.bindGraphScale()
       //初始化数据
@@ -365,6 +446,25 @@ export default {
           it.toggleCollapse(isCollapsed)
         }
       })
+      this.resetLabels();
+    },
+
+    /**
+     * @desc   : 重写路线label样式(避免db层面修改数据,而画面上依旧有条件label样式)
+     * @author : 张潇木
+     * @date   : 2024/4/24 9:30
+     */
+    resetLabels(){
+      let allEdges=this.graph.getEdges()
+      allEdges.forEach(edge=>{
+        //设置样式
+        if(Object.keys(edge.data).length!=0&&
+          ((edge?.data?.pdtGradeIds&&edge?.data?.pdtGradeIds.length>0)||(edge?.data?.moldlineTags&&edge?.data?.moldlineTags.length>0)||edge?.data?.pdtList.length>0)){
+          edge.setLabels(this.conditionLabel)
+        }else{
+          edge.removeLabelAt(0);
+        }}
+      )
     },
 
     /**
@@ -373,6 +473,13 @@ export default {
      * @date   : 2023/2/3 9:30
      */
     save() {
+      //清空选择项
+      this.graph.cleanSelection();
+      //取消动画
+      let allEdges=this.graph.getEdges()
+      allEdges?.forEach((edge) => {
+        edge.attr('line/style/animation', '')
+      })
       //节点组大小和是否展开存在data中
       this.graph.getNodes().filter(it => it.shape == 'groupNode').forEach((it) => {
         //如果是收起状态,存展开大小,如果展开,存当时的实际大小
@@ -494,6 +601,19 @@ export default {
       })
     },
 
+    bindRouteSelected(){
+      this.graph.on('edge:selected', ({ edge }) => {
+        this.currentRouter=edge?.getRouter()?.name;
+        this.routeSelected=edge;
+      })
+
+      // 边取消选中
+      this.graph.on('edge:unselected', ({ edge }) => {
+        this.currentRouter=undefined;
+        this.routeSelected=undefined;
+      })
+    },
+
 
     /**
      * @desc   : 监听画布缩放
@@ -687,7 +807,7 @@ export default {
 /deep/ .custom-html-left{
   background: #E9F1FF;
   height: 100%;
-  width: 40%;
+  width: 52px;
   border: solid 2px #E9F1FF;
   border-right: none;
   border-top-left-radius: 10px;

+ 8 - 0
vue.config.js

@@ -51,6 +51,14 @@ module.exports = {
       'Quill': 'quill/dist/quill.js'
     }])
 
+    config.module.rule('images').use('url-loader')
+      .loader('url-loader')
+      .options({
+         limit: 1024, //1KB以下使用base64
+         name: 'img/[name].[hash:8].[ext]'
+      })
+
+
     // svg图标
     config.module.rule('svg').exclude.add(resolve('src/components/svgs')).end()
     config.module.rule('icons').test(/\.svg$/).include.add(resolve('src/components/svgs')).end()