edit.vue 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183
  1. <template>
  2. <basic-container>
  3. <el-row :gutter="20">
  4. <el-col :span="10">
  5. <div class="box">
  6. <p>工程节点信息</p>
  7. <div class="flex">
  8. <el-input placeholder="输入关键字进行过滤" v-model="filterText" @input="filterChange"></el-input>
  9. <!-- <el-button type="info" class="mg-l-20">导入划分</el-button> -->
  10. </div>
  11. <el-scrollbar>
  12. <div v-loading="treeLoad">
  13. <el-tree v-show="!filterText"
  14. class="filter-tree" lazy
  15. :load="loadNode" @node-click="getNodeDetail"
  16. :props="defaultProps" :expand-on-click-node="false"
  17. highlight-current node-key="id"
  18. ref="tree">
  19. <span class="custom-tree-node" :class="data.moreShow?'show':''" slot-scope="{ node, data }">
  20. <!--@mouseover="mouseover(data)" @mouseleave="mouseout(data)"-->
  21. <span>
  22. {{ node.label }}
  23. <el-dropdown @click="command=>{setLeftType(command,data)}" @visible-change="visiblechange($event,data)">
  24. <el-button
  25. type="text" icon="el-icon-more" class="normal-black">
  26. </el-button>
  27. <el-dropdown-menu slot="dropdown">
  28. <el-dropdown-item @click.native="setLeftType(1,data,node)" icon="el-icon-circle-plus-outline">新增子级</el-dropdown-item>
  29. <el-dropdown-item @click.native="setLeftType(2,data,node)" icon="el-icon-edit">编辑节点</el-dropdown-item>
  30. <el-dropdown-item @click.native="setLeftType(3,data,node)" icon="el-icon-document-copy">复制节点</el-dropdown-item>
  31. <el-dropdown-item @click.native="setLeftType(4,data,node)" icon="iconfont hcicon-danganziliao-biaogetianxie" class="font-s-12">元素公式</el-dropdown-item>
  32. <el-dropdown-item @click.native="setLeftType(5,data,node)" icon="el-icon-coin">元素设置</el-dropdown-item>
  33. <el-dropdown-item @click.native="nodeInfo(data,node)" icon="el-icon-help">节点参数</el-dropdown-item>
  34. <el-dropdown-item @click.native="importTemplate(data,node)" v-if="node.level == 2" icon="el-icon-upload">导入划分</el-dropdown-item>
  35. </el-dropdown-menu>
  36. </el-dropdown>
  37. </span>
  38. </span>
  39. </el-tree>
  40. <el-tree v-show="filterText"
  41. class="filter-tree"
  42. :data="treeData" @node-click="getNodeDetail"
  43. :props="defaultProps" :expand-on-click-node="false"
  44. highlight-current node-key="id"
  45. :filter-node-method="filterNode"
  46. ref="treeall">
  47. <span class="custom-tree-node" slot-scope="{ node, data }" :class="data.moreShow?'show':''">
  48. <span>
  49. {{ node.label }}
  50. <el-dropdown @click="command=>{setLeftType(command,data)}" @visible-change="visiblechange($event,data)">
  51. <el-button
  52. type="text" icon="el-icon-more" class="normal-black">
  53. </el-button>
  54. <el-dropdown-menu slot="dropdown">
  55. <el-dropdown-item @click.native="setLeftType(1,data,node)" icon="el-icon-circle-plus-outline">新增子级</el-dropdown-item>
  56. <el-dropdown-item @click.native="setLeftType(2,data,node)" icon="el-icon-edit">编辑节点</el-dropdown-item>
  57. <el-dropdown-item @click.native="setLeftType(3,data,node)" icon="el-icon-document-copy">复制节点</el-dropdown-item>
  58. <el-dropdown-item @click.native="setLeftType(4,data,node)" icon="iconfont hcicon-danganziliao-biaogetianxie" class="font-s-12">元素公式</el-dropdown-item>
  59. <el-dropdown-item @click.native="setLeftType(5,data,node)" icon="el-icon-coin">元素设置</el-dropdown-item>
  60. <el-dropdown-item @click.native="nodeInfo(data,node)" icon="el-icon-help">节点参数</el-dropdown-item>
  61. <el-dropdown-item @click.native="importTemplate(data,node)" v-if="node.level == 2" icon="el-icon-upload">导入划分</el-dropdown-item>
  62. </el-dropdown-menu>
  63. </el-dropdown>
  64. </span>
  65. </span>
  66. </el-tree>
  67. </div>
  68. </el-scrollbar>
  69. </div>
  70. </el-col>
  71. <el-col :span="14">
  72. <template v-if="leftType==5">
  73. <p>节点信息</p>
  74. <el-table :data="tableData" border style="width: 100%">
  75. <el-table-column align="center" prop="deptName" label="当前节点" ></el-table-column>
  76. <el-table-column align="center" prop="deptCategory" :formatter="formatCat" label="节点类型" width="180"></el-table-column>
  77. <el-table-column align="center" prop="parentName" label="上级节点"></el-table-column>
  78. </el-table>
  79. <p>
  80. <span>当前已创建的元素表</span>
  81. <el-button @click="showFormElement" type="text" icon="el-icon-circle-plus-outline" class="text-icon mg-l-10"></el-button>
  82. <el-button type="text" icon="el-icon-document-copy" class="text-icon"></el-button>
  83. </p>
  84. <el-table :data="formData" border style="width: 100%">
  85. <el-table-column align="center" prop="tableName" label="表单名称" ></el-table-column>
  86. <el-table-column align="center" prop="elementTotal" label="元素总量"></el-table-column>
  87. <el-table-column align="center" prop="tableType" :formatter="formatTableType" label="表单类型"></el-table-column>
  88. <el-table-column align="center" prop="tableOwner" :formatter="formatOwner" label="所属方"></el-table-column>
  89. <el-table-column label="操作">
  90. <template slot-scope="scope">
  91. <el-button
  92. size="mini"
  93. @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
  94. <el-button
  95. size="mini"
  96. type="danger"
  97. @click="handleDelete(scope.$index, scope.row)">删除</el-button>
  98. </template>
  99. </el-table-column>
  100. </el-table>
  101. </template>
  102. <template v-if="leftType==4">
  103. <el-table :data="formData" border style="width: 100%">
  104. <el-table-column align="center" prop="tableName" label="表单名称" ></el-table-column>
  105. <el-table-column align="center" prop="elementTotal" label="元素总量"></el-table-column>
  106. <el-table-column align="center" prop="tableType" :formatter="formatTableType" label="表单类型"></el-table-column>
  107. <el-table-column align="center" prop="tableOwner" :formatter="formatOwner" label="所属方"></el-table-column>
  108. <el-table-column label="操作" width="200">
  109. <template slot-scope="scope">
  110. <el-button
  111. size="mini"
  112. @click="handleEditFormula(scope.$index, scope.row)">编辑元素公式</el-button>
  113. <el-button
  114. size="mini"
  115. type="danger"
  116. @click="handleDelete(scope.$index, scope.row)">删除</el-button>
  117. </template>
  118. </el-table-column>
  119. </el-table>
  120. </template>
  121. </el-col>
  122. </el-row>
  123. <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="50%" append-to-body :close-on-click-modal="false">
  124. <el-form ref="nodeDetail" :model="nodeDetail" :rules="rules" label-width="110px">
  125. <el-form-item label="节点名称" prop="deptName">
  126. <el-input v-model="nodeDetail.deptName"></el-input>
  127. </el-form-item>
  128. <el-form-item label="上级节点">
  129. <el-input v-model="nodeDetail.parentName" disabled></el-input>
  130. </el-form-item>
  131. <el-form-item label="节点类型" prop="deptCategory">
  132. <el-select v-model="nodeDetail.deptCategory" placeholder="请选择" class="w-100p">
  133. <el-option v-for="item in deptCategorylist" :key="item.id" :label="item.dictValue" :value="item.dictKey"></el-option>
  134. </el-select>
  135. </el-form-item>
  136. <el-form-item label="划分编号">
  137. <el-input v-model="nodeDetail.partitionCode"></el-input>
  138. </el-form-item>
  139. <el-form-item label="唯一编码">
  140. <el-input v-model="nodeDetail.uniqueCode"></el-input>
  141. </el-form-item>
  142. <template v-if="nodeDetail.deptCategory == 6">
  143. <el-form-item label="是否有混凝土">
  144. <el-radio-group v-model="nodeDetail.isConcrete" size="small">
  145. <el-radio :label="0" border>无</el-radio>
  146. <el-radio :label="1" border>有</el-radio>
  147. </el-radio-group>
  148. </el-form-item>
  149. <el-form-item label="是否试验节点">
  150. <el-radio-group v-model="nodeDetail.isExpernode" size="small">
  151. <el-radio :label="0" border>否</el-radio>
  152. <el-radio :label="1" border>是</el-radio>
  153. </el-radio-group>
  154. </el-form-item>
  155. </template>
  156. <el-form-item label="内业资料类型">
  157. <el-select v-model="nodeDetail.majorDataType" placeholder="请选择" class="w-100p">
  158. <el-option v-for="item in majorDataTypeList" :key="item.id" :label="item.dictValue" :value="item.dictKey"></el-option>
  159. </el-select>
  160. </el-form-item>
  161. </el-form>
  162. <span slot="footer" class="dialog-footer">
  163. <el-button @click="dialogVisible = false">取 消</el-button>
  164. <el-button type="primary" @click="saveNode">确 定</el-button>
  165. </span>
  166. </el-dialog>
  167. <el-dialog title="创建新的元素表" :visible.sync="eleVisible" width="80%" append-to-body :close-on-click-modal="false">
  168. <el-form ref="eleDialog" :model="eleForm" :rules="eleRules" label-width="110px">
  169. <el-form-item label="表名" prop="deptName">
  170. <el-input v-model="eleForm.deptName"></el-input>
  171. </el-form-item>
  172. <el-row>
  173. <el-col :span="12">
  174. <el-form-item label="表类型" prop="tableType">
  175. <el-select v-model="eleForm.tableType" placeholder="请选择" class="w-100p">
  176. <el-option v-for="item in tableTypelist" :key="item.id" :label="item.dictValue" :value="item.dictKey"></el-option>
  177. </el-select>
  178. </el-form-item>
  179. </el-col>
  180. <el-col :span="12">
  181. <el-form-item label="所属方" prop="tableOwner">
  182. <el-select v-model="eleForm.tableOwner" placeholder="请选择" class="w-100p">
  183. <el-option v-for="item in ownerTypeList" :key="item.id" :label="item.dictValue" :value="item.dictKey"></el-option>
  184. </el-select>
  185. </el-form-item>
  186. </el-col>
  187. </el-row>
  188. </el-form>
  189. <div class="flex jc-sb">
  190. <div></div>
  191. <div>
  192. <el-link type="primary" @click="importVisible = true">快捷导入</el-link>
  193. <el-link type="primary" class="mg-l-20" @click="downloadTmp">下载导入模版</el-link>
  194. </div>
  195. </div>
  196. <div class="border-grey">
  197. <p class="font-c-warning">编辑元素信息(请谨慎操作)</p>
  198. <el-table :data="eleForm.elementList" border style="width: 100%" height="400px">
  199. <el-table-column align="center" type="index" width="50"></el-table-column>
  200. <el-table-column align="center" prop="eName" label="元素名称" >
  201. <template slot-scope="scope">
  202. <el-input v-model="scope.row.eName" size="small" placeholder="请输入内容"></el-input>
  203. </template>
  204. </el-table-column>
  205. <el-table-column align="center" prop="eType" label="数据类型" width="120">
  206. <template slot-scope="scope">
  207. <el-select v-model="scope.row.eType" size="small" placeholder="请选择">
  208. <el-option v-for="item in dataTypeList" :key="item.id" :label="item.dictValue" :value="item.dictKey"></el-option>
  209. </el-select>
  210. </template>
  211. </el-table-column>
  212. <el-table-column align="center" prop="eLength" label="长度" width="120">
  213. <template slot-scope="scope">
  214. <el-input v-model="scope.row.eLength" size="small" placeholder="请输入内容" :disabled="scope.row.eType == 4" ></el-input>
  215. </template>
  216. </el-table-column>
  217. <el-table-column align="center" prop="eAllowDeviation" label="允许偏差值">
  218. <template slot-scope="scope">
  219. <div class="flex">
  220. <el-select v-model="scope.row.allow" size="small" placeholder="请选择" style="width:120px">
  221. <el-option :key="1" label="≥" value="≥"></el-option>
  222. <el-option :key="2" label="≤" value="≤"></el-option>
  223. <el-option :key="3" label="±" value="±"></el-option>
  224. <el-option :key="4" label="【】" value="【】"></el-option>
  225. </el-select>
  226. <el-input v-model="scope.row.deviation" size="small" placeholder="请输入内容"></el-input>
  227. </div>
  228. </template>
  229. </el-table-column>
  230. <el-table-column align="center" prop="eInspectionMethod" label="检查方法和频率">
  231. <template slot-scope="scope">
  232. <el-input v-model="scope.row.eInspectionMethod" size="small" placeholder="请输入内容"></el-input>
  233. </template>
  234. </el-table-column>
  235. <el-table-column align="center" label="操作" width="80">
  236. <template slot="header">
  237. <el-button @click="addEleRow(eleForm.elementList)" type="text" icon="el-icon-circle-plus-outline" class="text-icon"></el-button>
  238. </template>
  239. <template slot-scope="scope">
  240. <el-button icon="el-icon-remove-outline" type="text" @click="delEleRow(scope.$index,eleForm.elementList)" class="text-icon text-icon-danger"></el-button>
  241. </template>
  242. </el-table-column>
  243. </el-table>
  244. </div>
  245. <span slot="footer" class="dialog-footer">
  246. <el-button @click="eleVisible = false">取 消</el-button>
  247. <el-button type="primary" @click="saveFormAndElementHandle">保 存</el-button>
  248. </span>
  249. </el-dialog>
  250. <el-dialog title="模版导入" :visible.sync="importVisible" width="50%" append-to-body :close-on-click-modal="false">
  251. <p>提示:必须按照系统要求的模版格式上传,否则系统识别无效 <el-link type="primary" @click="downloadTmp">下载导入模版</el-link></p>
  252. <div>
  253. <el-button size="small" type="primary" @click="fileClick2">本地上传</el-button>
  254. <input @change="tmpImport" type="file" hidden ref="file2" accept=".xls, .xlsx">
  255. </div>
  256. <el-table :data="tempList" border style="width: 100%" >
  257. <el-table-column align="center" prop="eName" label="元素名称" >
  258. </el-table-column>
  259. <el-table-column align="center" prop="eType" label="数据类型" width="120">
  260. </el-table-column>
  261. <el-table-column align="center" prop="eLength" label="长度" width="120">
  262. </el-table-column>
  263. <el-table-column align="center" prop="eAllowDeviation" label="允许偏差值">
  264. </el-table-column>
  265. <el-table-column align="center" prop="eInspectionMethod" label="检查方法和频率">
  266. </el-table-column>
  267. </el-table>
  268. <span slot="footer" class="dialog-footer">
  269. <el-button @click="importVisible = false">取 消</el-button>
  270. <el-button type="primary" @click="importHandle">确 定</el-button>
  271. </span>
  272. </el-dialog>
  273. <el-dialog :title="(curEleTable.tableName?curEleTable.tableName:'')+' 元素编辑'" :visible.sync="editEleVisible" width="80%" append-to-body :close-on-click-modal="false">
  274. <p class="font-c-warning">编辑元素信息(请谨慎操作)</p>
  275. <el-table :data="editEleList" border style="width: 100%" height="400px">
  276. <el-table-column align="center" type="index" width="50"></el-table-column>
  277. <el-table-column align="center" prop="eName" label="元素名称" >
  278. <template slot-scope="scope">
  279. <el-input v-model="scope.row.eName" size="small" placeholder="请输入内容"></el-input>
  280. </template>
  281. </el-table-column>
  282. <el-table-column align="center" prop="eType" label="数据类型" width="120">
  283. <template slot-scope="scope">
  284. <el-select v-model="scope.row.eType" size="small" placeholder="请选择">
  285. <el-option v-for="item in dataTypeList" :key="item.id" :label="item.dictValue" :value="item.dictKey"></el-option>
  286. </el-select>
  287. </template>
  288. </el-table-column>
  289. <el-table-column align="center" prop="eLength" label="长度" width="120">
  290. <template slot-scope="scope">
  291. <el-input v-model="scope.row.eLength" size="small" placeholder="请输入内容" :disabled="scope.row.eType == 4"></el-input>
  292. </template>
  293. </el-table-column>
  294. <el-table-column align="center" prop="eAllowDeviation" label="允许偏差值">
  295. <template slot-scope="scope">
  296. <div class="flex">
  297. <el-select v-model="scope.row.allow" size="small" placeholder="请选择" style="width:120px">
  298. <el-option :key="1" label="≥" value="≥"></el-option>
  299. <el-option :key="2" label="≤" value="≤"></el-option>
  300. <el-option :key="3" label="±" value="±"></el-option>
  301. <el-option :key="4" label="【】" value="【】"></el-option>
  302. </el-select>
  303. <el-input v-model="scope.row.deviation" size="small" placeholder="请输入内容"></el-input>
  304. </div>
  305. </template>
  306. </el-table-column>
  307. <el-table-column align="center" prop="eInspectionMethod" label="检查方法和频率">
  308. <template slot-scope="scope">
  309. <el-input v-model="scope.row.eInspectionMethod" size="small" placeholder="请输入内容"></el-input>
  310. </template>
  311. </el-table-column>
  312. <el-table-column align="center" label="操作" width="120">
  313. <template slot="header">
  314. <el-button @click="addEleRow(editEleList)" type="text" icon="el-icon-circle-plus-outline" class="text-icon"></el-button>
  315. </template>
  316. <template slot-scope="scope">
  317. <el-button v-if="scope.row.id" icon="el-icon-remove-outline" type="text" @click="delEleRowHandle(scope.$index,editEleList)" class="text-icon text-icon-danger"></el-button>
  318. <div class="flex" v-else>
  319. <el-button @click="saveNewEle(scope.row)" type="mini">保存</el-button>
  320. <el-button icon="el-icon-remove-outline" type="text" @click="delEleRowHandle(scope.$index,editEleList)" class="text-icon text-icon-danger"></el-button>
  321. </div>
  322. </template>
  323. </el-table-column>
  324. </el-table>
  325. <span slot="footer" class="dialog-footer">
  326. <el-button @click="editEleVisible = false">取 消</el-button>
  327. <el-button type="primary" @click="saveEles">确 定</el-button>
  328. </span>
  329. </el-dialog>
  330. <el-dialog title="元素公式" :visible.sync="editEleFormulaVisible" width="800px" append-to-body :close-on-click-modal="false">
  331. <div class="flex mg-b-10">
  332. <el-input v-model="formulaInput" placeholder="请输入内容" size="samll"></el-input>
  333. <el-button type="info">保存</el-button>
  334. </div>
  335. <el-table :data="editEleList" border style="width: 100%" height="400px">
  336. <el-table-column align="center" prop="eName" label="元素名称" >
  337. </el-table-column>
  338. <el-table-column align="center" label="操作" width="200">
  339. <template slot-scope="scope">
  340. <el-link type="primary" >公式配置</el-link>
  341. <el-link class="mg-l-10" type="danger" @click="delEleRowHandle(scope.$index,editEleList)">删除</el-link>
  342. </template>
  343. </el-table-column>
  344. </el-table>
  345. </el-dialog>
  346. <el-dialog title="导入划分" :visible.sync="importTemplateVisible" width="800px" append-to-body :close-on-click-modal="false">
  347. <div v-loading="importLoading">
  348. <div><el-link type="primary" @click="handleDownload">下载导入模版</el-link></div>
  349. <div class="mg-t-20">
  350. <el-button type="primary" @click="fileClick">选择文件</el-button>
  351. <span v-if="upFile" class="mg-l-20">{{upFile.name}}</span>
  352. <input @change="fileChange" type="file" hidden ref="file" accept=".xls, .xlsx">
  353. </div>
  354. <div v-if="!upFile">当前还未选择文件,请选择需要导入的文件</div>
  355. </div>
  356. <span slot="footer" class="dialog-footer">
  357. <el-button @click="importTemplateVisible = false">取 消</el-button>
  358. <el-button type="primary" @click="importTemplateHandle" :loading="importLoading">导 入</el-button>
  359. </span>
  360. </el-dialog>
  361. <el-dialog title="节点参数" :visible.sync="nodeInfoVisible" width="800px" append-to-body :close-on-click-modal="false" :show-close="false">
  362. <div>
  363. <el-button
  364. type="text" icon="el-icon-s-operation" class="right-btn"
  365. @click="infoNameVisible = true"></el-button>
  366. <el-table :data="nodeInfoTable" border style="width: 100%" height="400">
  367. <el-table-column align="center" prop="name" label="参数名称">
  368. <template slot-scope="scope">
  369. <template v-if="scope.row.isEdit">
  370. <el-select v-model="scope.row.name" placeholder="请选择" class="w-100p">
  371. <el-option v-for="item in namelist" :key="item.id" :label="item.dictValue" :value="item.dictKey"></el-option>
  372. </el-select>
  373. </template>
  374. <template v-else>
  375. {{scope.row.name}}
  376. </template>
  377. </template>
  378. </el-table-column>
  379. <el-table-column align="center" prop="value" label="参数值设置">
  380. <template slot-scope="scope">
  381. <template v-if="scope.row.isEdit">
  382. <el-input v-model="scope.row.value"></el-input>
  383. </template>
  384. <template v-else>
  385. {{scope.row.value}}
  386. </template>
  387. </template>
  388. </el-table-column>
  389. <el-table-column align="center" prop="describe" label="描述">
  390. <template slot-scope="scope">
  391. <template v-if="scope.row.isEdit">
  392. <el-input v-model="scope.row.describe"></el-input>
  393. </template>
  394. <template v-else>
  395. {{scope.row.describe}}
  396. </template>
  397. </template>
  398. </el-table-column>
  399. <el-table-column label="操作" width="120" align="center">
  400. <template slot-scope="scope">
  401. <el-button
  402. type="text" size="small" v-show="scope.row.isEdit"
  403. @click="saveNodeInfoHandle(scope.$index, scope.row)">保存</el-button>
  404. <el-button
  405. type="text" size="small" v-show="!scope.row.isEdit"
  406. @click="editNodeInfo(scope.$index, scope.row)">编辑</el-button>
  407. <el-button
  408. type="text" size="small" class="text-icon-danger"
  409. @click="delNodeInfo(scope.$index, scope.row)">删除</el-button>
  410. </template>
  411. </el-table-column>
  412. </el-table>
  413. </div>
  414. <span slot="footer" class="dialog-footer">
  415. <el-button @click="nodeInfoVisible = false">取 消</el-button>
  416. <el-button type="primary" @click="nodeInfoSave">保 存</el-button>
  417. </span>
  418. </el-dialog>
  419. <el-dialog title="设置参数名称" :visible.sync="infoNameVisible" width="800px" append-to-body :close-on-click-modal="false">
  420. <div>
  421. <el-table :data="namelist" border style="width: 100%" height="400">
  422. <el-table-column align="center" prop="name" label="参数名称">
  423. <template slot-scope="scope">
  424. <template v-if="scope.row.isEdit">
  425. <el-input v-model="scope.row.name"></el-input>
  426. </template>
  427. <template v-else>
  428. {{scope.row.name}}
  429. </template>
  430. </template>
  431. </el-table-column>
  432. <el-table-column align="center" prop="key" label="参数值KEY">
  433. <template slot-scope="scope">
  434. <template v-if="scope.row.isEdit">
  435. <el-input v-model="scope.row.key"></el-input>
  436. </template>
  437. <template v-else>
  438. {{scope.row.key}}
  439. </template>
  440. </template>
  441. </el-table-column>
  442. <el-table-column align="center" prop="describe" label="描述">
  443. <template slot-scope="scope">
  444. <template v-if="scope.row.isEdit">
  445. <el-input v-model="scope.row.describe"></el-input>
  446. </template>
  447. <template v-else>
  448. {{scope.row.describe}}
  449. </template>
  450. </template>
  451. </el-table-column>
  452. <el-table-column label="操作" width="120" align="center">
  453. <template slot-scope="scope">
  454. <el-button
  455. type="text" size="small" v-show="scope.row.isEdit"
  456. @click="saveNodeInfoHandle(scope.$index, scope.row)">保存</el-button>
  457. <el-button
  458. type="text" size="small" v-show="!scope.row.isEdit"
  459. @click="editNodeInfo(scope.$index, scope.row)">编辑</el-button>
  460. <el-button
  461. type="text" size="small" class="text-icon-danger"
  462. @click="delNodeInfo(scope.$index, scope.row)">删除</el-button>
  463. </template>
  464. </el-table-column>
  465. </el-table>
  466. </div>
  467. <span slot="footer" class="dialog-footer">
  468. <el-button @click="infoNameVisible = false">关 闭</el-button>
  469. </span>
  470. </el-dialog>
  471. </basic-container>
  472. </template>
  473. <script>
  474. import {getLazytree,getDetail,update,selectByNodeTable,getAlltree,
  475. saveFormAndElement,selectFormElements,removeTableById,
  476. importWbsTree} from "@/api/manager/wbstree";
  477. import {saveElement,remove as removeElement,updateBatchElements,getTemplate,
  478. importWbsElement} from "@/api/manager/wbsformelement";
  479. import {getList as getAttchFromOriginalName} from "@/api/resource/attach";
  480. import {getDictionary} from "@/api/system/dict";
  481. import {mapGetters} from "vuex";
  482. export default {
  483. data() {
  484. return {
  485. id:'',
  486. filterText:'',
  487. treeData:[],
  488. treeLoad:false,
  489. menuShow:false,
  490. defaultProps: {
  491. children: 'children',
  492. label: 'title',
  493. isLeaf: function(data){
  494. return !data.hasChildren;
  495. }
  496. },
  497. leftType:5,
  498. curTreeData:{},
  499. tableData:[],
  500. nodeDetail:{},
  501. formData:[],
  502. dialogVisible:false,
  503. deptCategorylist:[],
  504. majorDataTypeList:[],
  505. rules:{
  506. deptName: [
  507. { required: true, message: '请输入节点名称', trigger: 'blur' },
  508. ],
  509. deptCategory:[
  510. { required: true, message: '请选择节点类型', trigger: 'change' }
  511. ]
  512. },
  513. eleVisible:false,
  514. tableTypelist:[],
  515. dataTypeList:[],
  516. ownerTypeList:[],
  517. eleForm:{
  518. elementList:[],
  519. },
  520. eleRules:{
  521. deptName: [
  522. { required: true, message: '请输入表名称', trigger: 'blur' },
  523. ],
  524. tableType:[
  525. { required: true, message: '请选择表类型', trigger: 'change' }
  526. ],
  527. tableOwner:[
  528. { required: true, message: '请选择所属方', trigger: 'change' }
  529. ],
  530. },
  531. importVisible:false,
  532. tempList:[],
  533. curEleTable:{},
  534. editEleVisible:false,
  535. editEleList:[],
  536. eleReg:/(≥|≤|±|【】)?([^≥≤±【】]*)/,
  537. editEleFormulaVisible:false,
  538. formulaInput:'',
  539. importTemplateVisible:false,
  540. fileUrl:'',
  541. upFile:null,
  542. importLoading:false,
  543. nodeInfoVisible:false,
  544. nodeInfoTable:[],
  545. namelist:[],
  546. infoNameVisible:false,
  547. };
  548. },
  549. computed: {
  550. ...mapGetters(["userInfo"]),
  551. dialogTitle:function(){
  552. let text = '节点';
  553. if(this.leftType == 1){
  554. text = '新增'+text;
  555. }else if(this.leftType == 2){
  556. text = '编辑'+text;
  557. }
  558. return text;
  559. },
  560. },
  561. created() {
  562. this.init();
  563. //console.log(this.userInfo)
  564. },
  565. methods: {
  566. init(){
  567. this.id = this.$route.params.id;
  568. this.getDeptCategorylist();
  569. this.getTableTypelist();
  570. this.getDataTypelist();
  571. this.getOwnerTypelist();
  572. },
  573. loadNode(node, resolve){
  574. let pid = 0;
  575. if (node.level != 0) {
  576. pid = node.data.id
  577. }
  578. getLazytree(this.id ,pid,this.userInfo.tenant_id).then((res)=>{
  579. let arr = [];
  580. if(Array.isArray(res.data.data)){
  581. arr = res.data.data;
  582. }
  583. return resolve(arr);
  584. })
  585. },
  586. getNodeDetail(data,node){
  587. //console.log(data,node,ref)
  588. let parentName = '';
  589. if(node.parent.data){
  590. parentName = node.parent.data.title;
  591. }
  592. this.curTreeData = data;
  593. this.curTreeData.parentName = parentName;
  594. getDetail(data.id).then((res)=>{
  595. res.data.data.parentName = parentName;
  596. this.tableData = [res.data.data];
  597. this.nodeDetail = Object.assign({},res.data.data);
  598. })
  599. this.updateNodeTable();
  600. },
  601. saveNode(){
  602. this.$refs['nodeDetail'].validate((valid) => {
  603. if (valid) {
  604. if(this.leftType == 1){
  605. this.addNode();
  606. }else if(this.leftType == 2){
  607. this.updateNode();
  608. }
  609. } else {
  610. console.log('error submit!!');
  611. return false;
  612. }
  613. });
  614. },
  615. addNode(){
  616. update(this.nodeDetail).then(()=>{
  617. this.updateTreeNewNode();
  618. this.dialogVisible = false;
  619. this.$message({
  620. type: "success",
  621. message: "新增成功!"
  622. });
  623. })
  624. },
  625. updateNode(){
  626. update(this.nodeDetail).then(()=>{
  627. let node = this.tableData[0];
  628. node.deptName = this.nodeDetail.deptName;
  629. node.deptCategory = this.nodeDetail.deptCategory;
  630. this.curTreeData.title = this.nodeDetail.deptName;
  631. this.dialogVisible = false;
  632. this.$message({
  633. type: "success",
  634. message: "修改成功!"
  635. });
  636. })
  637. },
  638. setLeftType(type,data,node){
  639. if(type == 4 || type == 5){
  640. this.leftType = type;
  641. }
  642. this.curTreeData = data;
  643. this.$refs.tree.setCurrentKey(data.id);
  644. if(type == 1 || type == 2){
  645. this.getMajorDataTypeList();
  646. this.dialogVisible = true;
  647. }
  648. getDetail(data.id).then((res)=>{
  649. let parentName = '';
  650. if(node.parent.data){
  651. parentName = node.parent.data.title;
  652. }
  653. res.data.data.parentName = parentName;
  654. this.tableData = [res.data.data];
  655. if(type == 1){
  656. this.nodeDetail = {
  657. parentId:res.data.data.id,
  658. parentName:parentName
  659. };
  660. }else{
  661. this.nodeDetail = Object.assign({},res.data.data);
  662. }
  663. this.nodeDetail.type = 1;// '1'节点 '2'表单
  664. this.nodeDetail.wbsId = this.id;
  665. this.nodeDetail.tenantId = this.userInfo.tenant_id
  666. })
  667. if(this.leftType == 4){
  668. selectByNodeTable(data.id).then((res)=>{
  669. if(res.data.data.length){
  670. this.formData = res.data.data;
  671. }else{
  672. this.formData = [];
  673. }
  674. })
  675. }
  676. },
  677. showFormElement(){
  678. if(!this.nodeDetail.id){
  679. this.$message({
  680. type: "warning",
  681. message: "请先选择在哪个节点下创建表"
  682. });
  683. return;
  684. }
  685. this.eleVisible = true;
  686. },
  687. addEleRow(list){
  688. list.push({});
  689. },
  690. delEleRow(index,list){
  691. list.splice(index,1);
  692. },
  693. saveFormAndElementHandle(){
  694. this.$refs['eleDialog'].validate((valid) => {
  695. if (valid) {
  696. this.eleForm.wbsId = this.id;
  697. this.eleForm.tenantId = this.userInfo.tenant_id;
  698. this.eleForm.deptCategory = -1;
  699. this.eleForm.type = 2;// '1'节点 '2'表单
  700. this.eleForm.parentId = this.nodeDetail.id;
  701. this.eleForm.elementList.forEach((element)=>{
  702. element.eAllowDeviation = (element.allow?element.allow:'') + (element.deviation?element.deviation:'');
  703. if(element.eType == 4){
  704. element.eLength = 0;
  705. }
  706. })
  707. saveFormAndElement(this.eleForm).then(()=>{
  708. //console.log(res)
  709. this.updateTreeNewNode();
  710. this.updateNodeTable();
  711. this.eleVisible = false;
  712. this.$message({
  713. type: "success",
  714. message: "新增成功!"
  715. });
  716. })
  717. } else {
  718. console.log('error submit!!');
  719. return false;
  720. }
  721. });
  722. },
  723. updateTreeNewNode(){
  724. getLazytree(this.id ,this.nodeDetail.parentId).then((res)=>{
  725. this.$refs.tree.updateKeyChildren(this.nodeDetail.parentId,res.data.data)
  726. })
  727. },
  728. updateNodeTable(){
  729. selectByNodeTable(this.curTreeData.id).then((res)=>{
  730. if(res.data.data.length){
  731. this.formData = res.data.data;
  732. }else{
  733. this.formData = [];
  734. }
  735. })
  736. },
  737. importHandle(){
  738. },
  739. handleEdit(index,row){
  740. this.curEleTable = row;
  741. selectFormElements(this.curEleTable.id).then((res)=>{
  742. res.data.data.forEach((element)=>{
  743. this.eleReg.exec(element.eAllowDeviation);
  744. // console.log(RegExp.$1)
  745. // console.log(RegExp.$2)
  746. element.allow = RegExp.$1?RegExp.$1:'';
  747. element.deviation = RegExp.$2?RegExp.$2:'';
  748. })
  749. this.editEleList = res.data.data;
  750. })
  751. this.editEleVisible = true;
  752. },
  753. handleDelete(index,row){
  754. this.$confirm('是否删除 '+row.tableName + ' ?', '删除元素表', {
  755. distinguishCancelAndClose: true,
  756. confirmButtonText: '删除',
  757. cancelButtonText: '取消'
  758. }).then(() => {
  759. removeTableById(row.id).then(()=>{
  760. this.formData.splice(index,1);
  761. this.updateTreeNewNode();
  762. this.$message({
  763. type: "success",
  764. message: "删除成功!"
  765. });
  766. })
  767. })
  768. },
  769. handleEditFormula(index,row){
  770. this.curEleTable = row;
  771. selectFormElements(this.curEleTable.id).then((res)=>{
  772. this.editEleList = res.data.data;
  773. })
  774. this.editEleFormulaVisible = true;
  775. },
  776. saveNewEle(row){
  777. row.eAllowDeviation = (row.allow?row.allow:'') + (row.deviation?row.deviation:'');
  778. row.fId = this.curEleTable.id;
  779. row.initTableName = this.curEleTable.initTableName;
  780. if(row.eType == 4){
  781. row.eLength = 0;
  782. }
  783. saveElement(row).then((res)=>{
  784. if(res.data.data){
  785. this.$set(row,'id',res.data.data.id);
  786. this.$set(row,'ekey',res.data.data.ekey);
  787. this.$message({
  788. type: "success",
  789. message: "保存成功!"
  790. });
  791. }
  792. })
  793. },
  794. delEleRowHandle(index,list){
  795. let row = list[index];
  796. if(row.id){
  797. //有id需要请求删除
  798. this.$confirm('是否确认删除?', '删除元素', {
  799. distinguishCancelAndClose: true,
  800. confirmButtonText: '删除',
  801. cancelButtonText: '取消'
  802. }).then(() => {
  803. removeElement(row.id,this.curEleTable.initTableName,row.ekey).then(()=>{
  804. list.splice(index,1);
  805. })
  806. })
  807. }else{
  808. list.splice(index,1);
  809. }
  810. },
  811. saveEles(){
  812. for (let i = 0; i < this.editEleList.length; i++) {
  813. if(!this.editEleList[i].id){
  814. this.$message({
  815. type: "warning",
  816. message: "请先将新增的元素点击保存"
  817. });
  818. return;
  819. }
  820. }
  821. if(this.editEleList.length > 0){
  822. this.editEleList.forEach((element)=>{
  823. element.eAllowDeviation = (element.allow?element.allow:'') + (element.deviation?element.deviation:'');
  824. if(element.eType == 4){
  825. element.eLength = 0;
  826. }
  827. })
  828. updateBatchElements(this.editEleList,this.curEleTable.initTableName).then(()=>{
  829. this.editEleVisible = false;
  830. this.updateNodeTable();
  831. this.$message({
  832. type: "success",
  833. message: "保存成功!"
  834. });
  835. })
  836. }else{
  837. this.editEleVisible = false;
  838. this.updateNodeTable();
  839. this.$message({
  840. type: "success",
  841. message: "保存成功!"
  842. });
  843. }
  844. },
  845. filterChange(){
  846. //console.log(this.$refs)
  847. //debugger
  848. if(this.treeData.length > 0){
  849. this.$refs.treeall.filter(this.filterText);
  850. return;
  851. }
  852. this.treeLoad = true;
  853. getAlltree(this.userInfo.tenant_id,'',this.id).then((res)=>{
  854. this.treeLoad = false;
  855. this.treeData = res.data.data;
  856. this.$nextTick(()=>{
  857. this.$refs.treeall.filter(this.filterText);
  858. })
  859. })
  860. },
  861. importTemplate(data){
  862. this.importTemplateVisible = true;
  863. this.curTreeData = data;
  864. if(!this.fileUrl){
  865. getAttchFromOriginalName(1, 20, {
  866. originalName:'WBS划分模板.xls'
  867. }).then((res)=>{
  868. if(res.data.data.records.length){
  869. this.fileUrl = res.data.data.records[0].link;
  870. }else{
  871. this.fileUrl = '';
  872. }
  873. })
  874. }
  875. },
  876. importTemplateHandle(){
  877. if(!this.upFile){
  878. this.$message({
  879. type: "warning",
  880. message: "请先选择文件再进行导入"
  881. });
  882. }
  883. let forms = new FormData();
  884. forms.append('excelFile', this.upFile);
  885. let wbsTreeFu = {
  886. wbsId:this.id,
  887. parentId:this.curTreeData.id,
  888. // ancestors:'0,'+this.curTreeData.id,
  889. }
  890. let json = JSON.stringify(wbsTreeFu);
  891. let blob = new Blob([json],{type:'application/json'})
  892. forms.append('wbsTreeFu', blob);
  893. this.importLoading = true;
  894. importWbsTree(forms).then(()=>{
  895. //this.$router.go(0)
  896. let node = this.$refs.tree.getNode(this.curTreeData.id);
  897. node.isLeaf = false;
  898. this.importTemplateVisible = false;
  899. this.upFile = null;
  900. }).finally(()=>{
  901. this.importLoading = false;
  902. })
  903. },
  904. handleDownload() {
  905. if(this.fileUrl){
  906. window.open(this.fileUrl);
  907. }else{
  908. this.$message({
  909. type: "warning",
  910. message: "请先在附件管理上传【WBS划分模板.xls】文件"
  911. });
  912. }
  913. },
  914. fileClick(){
  915. this.$refs.file.click();
  916. },
  917. fileChange(e){
  918. const file = e.target.files[0]
  919. if (!file) {
  920. // 如果用户没有选择图片,只是点了文件上传这个按钮
  921. return
  922. }
  923. //console.log(file)
  924. this.upFile = file;
  925. },
  926. nodeInfo(){
  927. this.nodeInfoVisible = true;
  928. },
  929. nodeInfoSave(){
  930. },
  931. delNodeInfo(){
  932. },
  933. editNodeInfo(index,row){
  934. this.$set(row,'isEdit',true);
  935. },
  936. saveNodeInfoHandle(index,row){
  937. row.isEdit = false;
  938. },
  939. downloadTmp(){
  940. getTemplate().then((res)=>{
  941. //console.log(res)
  942. let blob = new Blob([res.data], {
  943. type: 'application/vnd.ms-excel'
  944. });
  945. //console.log(blob)
  946. let filename = Date.parse(new Date()) + '.xls';
  947. if (window.navigator.msSaveOrOpenBlob) {
  948. // 兼容IE10
  949. window.navigator.msSaveBlob(blob, filename);
  950. } else {
  951. // 兼容chrome/firefox
  952. let aTag = document.createElement('a');
  953. aTag.download = Date.parse(new Date()) + '.xls';
  954. aTag.href = window.URL.createObjectURL(blob);
  955. aTag.click();
  956. URL.revokeObjectURL(aTag.href);
  957. }
  958. })
  959. },
  960. fileClick2(){
  961. this.$refs.file2.click();
  962. },
  963. tmpImport(e){
  964. const file = e.target.files[0];
  965. const formData = new FormData();
  966. formData.append('file', file);
  967. //console.log(file.name)
  968. importWbsElement(formData).then((res)=>{
  969. res.data.data.forEach((element)=>{
  970. element.eName = element.elementName;
  971. element.eLength = element.elementLength;
  972. element.eType = Number(element.elementType);
  973. element.eAllowDeviation = element.elementAllowDeviation;
  974. element.eInspectionMethod = element.elementInspectionMethod;
  975. this.eleReg.exec(element.eAllowDeviation);
  976. // console.log(RegExp.$1)
  977. // console.log(RegExp.$2)
  978. element.allow = RegExp.$1?RegExp.$1:'';
  979. element.deviation = RegExp.$2?RegExp.$2:'';
  980. })
  981. this.eleForm.elementList = res.data.data;
  982. this.importVisible = false;
  983. }).finally(()=>{
  984. e.target.value='';
  985. })
  986. },
  987. visiblechange(value,data){
  988. this.$set(data, 'moreShow', value)
  989. },
  990. getDeptCategorylist(){
  991. if(this.deptCategorylist.length >1){
  992. return;
  993. }
  994. getDictionary({
  995. code:'wbs_node_type'
  996. }).then((res)=>{
  997. res.data.data.forEach(element => {
  998. element.dictKey = Number(element.dictKey)
  999. });
  1000. this.deptCategorylist = res.data.data;
  1001. })
  1002. },
  1003. getMajorDataTypeList(){
  1004. if(this.majorDataTypeList.length >1){
  1005. return;
  1006. }
  1007. getDictionary({
  1008. code:'major_data_type'
  1009. }).then((res)=>{
  1010. res.data.data.forEach(element => {
  1011. element.dictKey = Number(element.dictKey)
  1012. });
  1013. this.majorDataTypeList = res.data.data;
  1014. })
  1015. },
  1016. getTableTypelist(){
  1017. if(this.tableTypelist.length >1){
  1018. return;
  1019. }
  1020. getDictionary({
  1021. code:'table_type'
  1022. }).then((res)=>{
  1023. res.data.data.forEach(element => {
  1024. element.dictKey = Number(element.dictKey)
  1025. });
  1026. this.tableTypelist = res.data.data;
  1027. })
  1028. },
  1029. getDataTypelist(){
  1030. if(this.dataTypeList.length >1){
  1031. return;
  1032. }
  1033. getDictionary({
  1034. code:'data_type'
  1035. }).then((res)=>{
  1036. res.data.data.forEach(element => {
  1037. element.dictKey = Number(element.dictKey)
  1038. });
  1039. this.dataTypeList = res.data.data;
  1040. })
  1041. },
  1042. getOwnerTypelist(){
  1043. if(this.ownerTypeList.length >1){
  1044. return;
  1045. }
  1046. getDictionary({
  1047. code:'owner_type'
  1048. }).then((res)=>{
  1049. res.data.data.forEach(element => {
  1050. element.dictKey = Number(element.dictKey)
  1051. });
  1052. this.ownerTypeList = res.data.data;
  1053. })
  1054. },
  1055. formatCat(row, column, cellValue){
  1056. for (let i = 0; i < this.deptCategorylist.length; i++) {
  1057. if(this.deptCategorylist[i].dictKey == cellValue){
  1058. return this.deptCategorylist[i].dictValue
  1059. }
  1060. }
  1061. return cellValue;
  1062. //console.log(cellValue)
  1063. },
  1064. formatTableType(row, column, cellValue){
  1065. for (let i = 0; i < this.tableTypelist.length; i++) {
  1066. if(this.tableTypelist[i].dictKey == cellValue){
  1067. return this.tableTypelist[i].dictValue
  1068. }
  1069. }
  1070. return cellValue;
  1071. //console.log(cellValue)
  1072. },
  1073. formatOwner(row, column, cellValue){
  1074. for (let i = 0; i < this.ownerTypeList.length; i++) {
  1075. if(this.ownerTypeList[i].dictKey == cellValue){
  1076. return this.ownerTypeList[i].dictValue
  1077. }
  1078. }
  1079. return cellValue;
  1080. //console.log(cellValue)
  1081. },
  1082. formatdataType(row, column, cellValue){
  1083. for (let i = 0; i < this.dataTypeList.length; i++) {
  1084. if(this.dataTypeList[i].dictKey == cellValue){
  1085. return this.dataTypeList[i].dictValue
  1086. }
  1087. }
  1088. return cellValue;
  1089. //console.log(cellValue)
  1090. },
  1091. filterNode(value, data) {
  1092. //console.log(value)
  1093. if (!value) return true;
  1094. return data.title.indexOf(value) !== -1;
  1095. }
  1096. }
  1097. };
  1098. </script>
  1099. <style scoped lang="scss">
  1100. .font-s-12 /deep/ .iconfont{
  1101. font-size: 12px;
  1102. }
  1103. .el-popper[x-placement^=bottom]{
  1104. margin-top: -6px;
  1105. }
  1106. .right-btn{
  1107. position: absolute;
  1108. right: 20px;
  1109. top: 10px;
  1110. font-size: 20px;
  1111. }
  1112. .custom-tree-node {
  1113. .normal-black {
  1114. display: none;
  1115. }
  1116. &:hover {
  1117. .normal-black {
  1118. display: block;
  1119. }
  1120. }
  1121. &.show .normal-black{
  1122. display: block;
  1123. }
  1124. }
  1125. </style>