paramDetail.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485
  1. <template>
  2. <div>
  3. <!-- 弹窗 -->
  4. <el-dialog title="参数信息" :visible.sync="dialogVisible" width="60%" append-to-body @close="closeParamDialog">
  5. <div>
  6. <div class="sub-title">{{ params.paramName }}</div>
  7. <!-- 搜索栏 -->
  8. <div class="search-container">
  9. <div>
  10. <el-form :inline="true" :model="searchForm" class="demo-form-inline" size="small" >
  11. <el-form-item label="" prop="projectName">
  12. <el-select v-model="searchForm.projectName" placeholder="项目名称" @change="changeProject" clearable >
  13. <el-option
  14. v-for="item in projectList"
  15. :key="item.id"
  16. :label="item.projectName"
  17. :value="item.projectId">
  18. </el-option>
  19. </el-select>
  20. </el-form-item>
  21. <el-form-item label="" prop="contractSection">
  22. <el-select v-model="searchForm.contractId" placeholder="合同段" clearable >
  23. <el-option
  24. v-for="item in contractList"
  25. :key="item.id"
  26. :label="item.contractName"
  27. :value="item.id">
  28. </el-option>
  29. </el-select>
  30. </el-form-item>
  31. <el-form-item>
  32. <el-input v-model="searchForm.elementName" placeholder="元素名称" clearable></el-input>
  33. </el-form-item>
  34. <el-form-item>
  35. <el-button type="primary" @click="searchElement">搜索</el-button>
  36. </el-form-item>
  37. </el-form>
  38. </div>
  39. <!-- 新增按钮 -->
  40. <div>
  41. <el-button type="success" @click="handleAdd" size="small" >新增元素</el-button>
  42. <el-button type="primary" @click="handleEditParam" size="small" >编辑参数</el-button>
  43. <el-button type="danger" @click="handleDelteParam" size="small" >删除参数</el-button>
  44. </div>
  45. </div>
  46. <!-- 表格 -->
  47. <el-table :data="tableData" style="width: 100%" border v-loading="tableLoading">
  48. <el-table-column type="index" label="序号" width="50"></el-table-column>
  49. <el-table-column prop="elementName" label="元素名称"></el-table-column>
  50. <el-table-column prop="type" label="是否全局参数">
  51. <template slot-scope="scope">
  52. {{ scope.row.type===1?'是' : '否' }}
  53. </template>
  54. </el-table-column>
  55. <el-table-column prop="projectName" label="项目名称"></el-table-column>
  56. <el-table-column prop="contractName" label="合同段"></el-table-column>
  57. <el-table-column prop="name" label="创始人"></el-table-column>
  58. <el-table-column prop="createTime" label="创建时间"></el-table-column>
  59. <el-table-column label="操作" width="100">
  60. <template slot-scope="scope">
  61. <el-link size="mini" @click="handleEdit(scope.$index, scope.row)" type="primary" >编辑</el-link>
  62. <el-link size="mini" type="danger" @click="handleDelete(scope.$index, scope.row)" class="mg-l-10">删除</el-link>
  63. </template>
  64. </el-table-column>
  65. </el-table>
  66. </div>
  67. </el-dialog>
  68. <!-- 新增弹窗 -->
  69. <el-dialog :title="form.id?'元素编辑':'元素新增'" :visible.sync="addDialogVisible" width="30%" append-to-body @close="closeDialog">
  70. <el-form :model="form" :rules="rules" ref="formRef" label-position="left">
  71. <el-form-item label="元素名称" label-width="120px">
  72. <el-input v-model="form.elementName" :disabled="form.selectedElement.length>0"></el-input>
  73. </el-form-item>
  74. <el-form-item label="选择元素" label-width="120px" v-if="!isEdit">
  75. <el-button style="width: 100%;" @click="checkEle" v-if="form.selectedElement.length===0" :disabled="form.elementName.length>0">点击选择元素</el-button>
  76. <div class="bottom-box" v-else @click="checkEle">
  77. <el-tag type="info" closable v-for="item in form.selectedElement" :key="id" class="mr-5" @close="handleClose(tag)">{{ item.eName }}</el-tag>
  78. </div>
  79. </el-form-item>
  80. <el-form-item label="是否全局参数" label-width="120px" prop="type">
  81. <el-radio-group v-model="form.type">
  82. <el-radio :label="1">是</el-radio>
  83. <el-radio :label="2">否</el-radio>
  84. </el-radio-group>
  85. </el-form-item>
  86. <div class="form-container1" v-if="form.type===2" >
  87. <el-button type="warning" class="add-button" size="small" @click="addProData" v-if="form.type===2&&!form.id">新增</el-button>
  88. <div v-if="form.type===2" class="form-container" v-for="(item,index) in proData" :key="index" :style="{ marginTop: index === 0 ? '40px' : '0' }">
  89. <!-- 删除图标 -->
  90. <el-button type="danger" size="mini" v-if="index !== 0"
  91. icon="el-icon-delete"
  92. circle
  93. class="delete-icon"
  94. @click="removeProData(index)">
  95. </el-button>
  96. <el-form-item label="选择项目" prop="contractSection" label-width="120px">
  97. <el-select v-model="item.projectName" placeholder="请选择项目" @change="changeProject" clearable style="width: 100%;">
  98. <el-option
  99. v-for="item1 in projectList1"
  100. :key="item1.id"
  101. :label="item1.projectName"
  102. :value="item1.id">
  103. </el-option>
  104. </el-select>
  105. </el-form-item>
  106. <el-form-item label="选择合同段" prop="contractSection" label-width="120px" >
  107. <el-select v-model="item.contractSection" placeholder="请选择合同段" clearable multiple class="multiple-select">
  108. <el-option
  109. v-for="item2 in contractList"
  110. :key="item2.id"
  111. :label="item2.contractName"
  112. :value="item2.id">
  113. </el-option>
  114. </el-select>
  115. </el-form-item>
  116. </div>
  117. </div>
  118. </el-form>
  119. <span slot="footer" class="dialog-footer">
  120. <el-button @click="addDialogVisible = false">取 消</el-button>
  121. <el-button type="primary" @click="confirmAdd">确 定</el-button>
  122. </span>
  123. </el-dialog>
  124. <!-- 选择元素弹窗 -->
  125. <checkEleDialog ref="checkEleDialogRef" @confirmCheck="confirmCheck"></checkEleDialog>
  126. <!-- 编辑参数弹窗 -->
  127. <addParamDialog :visible.sync="editDialogVisible" :params="params" @add-parameter="addCardFinish" ref="addParamDialogRef"/>
  128. </div>
  129. </template>
  130. <script>
  131. import checkEleDialog from './checkEleDialog.vue';
  132. import { getProjectList } from "@/api/manager/projectinfo";
  133. import { findContractByProjectId } from "@/api/manager/contractinfo";
  134. import addParamDialog from './addParamDialog.vue';
  135. import { remove,getProjectContractByParam,submitElement,getParameterElementList,removeElement} from "../../../api/paramter/parmter.js";
  136. export default {
  137. components:{
  138. checkEleDialog,
  139. addParamDialog
  140. },
  141. props:{
  142. params:Object
  143. },
  144. watch: {
  145. params: {
  146. handler: function(n) {
  147. this.params=n
  148. },
  149. deep: true,
  150. },
  151. },
  152. data() {
  153. return {
  154. dialogVisible: false,
  155. projectList: [],
  156. projectList1:[],
  157. contractList: [
  158. ],
  159. searchForm: {
  160. projectName: '',
  161. contractId: '',
  162. elementName: '',
  163. },
  164. tableData: [],
  165. tableLoading:false,
  166. addDialogVisible:false,
  167. isEdit:false,
  168. form: {
  169. elementName: '',
  170. selectedElement: [],
  171. type: false
  172. },
  173. proData:[{}],
  174. rules: {
  175. type: [
  176. { required: true, message: '请选择是否全局参数', trigger: 'change' }
  177. ]
  178. },
  179. editDialogVisible:false,
  180. paramId:''
  181. };
  182. },
  183. methods: {
  184. show(id) {
  185. this.paramId = id
  186. this.dialogVisible = true;
  187. this.getProjectListData(id)
  188. this.getTableData(id)
  189. },
  190. closeParamDialog(){
  191. this.$emit('finshDetail')
  192. this.dialogVisible = false;
  193. this.addDialogVisible=false;
  194. },
  195. onSearch() {
  196. // 实现搜索逻辑
  197. console.log('搜索条件:', this.searchForm);
  198. },
  199. handleAdd() {
  200. // 实现新增逻辑
  201. this.addDialogVisible=true;
  202. this.getProjectListData1()
  203. this.isEdit=false
  204. this.form={
  205. elementName: '',
  206. selectedElement: [],
  207. type: false
  208. }
  209. this.proData=[{}]
  210. },
  211. closeDialog(){
  212. this.addDialogVisible=false;
  213. this.isEdit=false
  214. this.contractList=[]
  215. },
  216. handleEditParam(item){
  217. // this.editDialogVisible=true
  218. this.$refs.addParamDialogRef.show( this.params)
  219. },
  220. addCardFinish(){
  221. console.log('编辑完成');
  222. closeParamDialog()
  223. },
  224. handleEdit(index, row) {;
  225. this.addDialogVisible=true;
  226. this.getProjectListData1()
  227. this.changeProject(row.projectId)
  228. this.isEdit=true
  229. console.log(row,'row');
  230. this.form=row
  231. let arr=[{
  232. projectName:row.projectId,
  233. contractSection:row.contractId?row.contractId.split(','):[]
  234. }]
  235. this.proData=arr
  236. this.form.selectedElement=[]
  237. },
  238. handleDelteParam(){
  239. this.$confirm("确定将选择数据删除?", {
  240. confirmButtonText: "确定",
  241. cancelButtonText: "取消",
  242. type: "warning"
  243. })
  244. .then(() => {
  245. return remove({
  246. id:this.params.id
  247. });
  248. })
  249. .then((res) => {
  250. this.$message({
  251. type: "success",
  252. message:res.data.msg
  253. });
  254. this.dialogVisible=false
  255. this.$emit('finshDetail');
  256. });
  257. },
  258. handleDelete(index, row) {
  259. // 实现删除逻辑
  260. console.log('删除:', index, row);
  261. this.$confirm("确定将选择数据删除?", {
  262. confirmButtonText: "确定",
  263. cancelButtonText: "取消",
  264. type: "warning"
  265. })
  266. .then(() => {
  267. return removeElement({
  268. id:row.id
  269. });
  270. })
  271. .then((res) => {
  272. this.$message({
  273. type: "success",
  274. message:res.data.msg
  275. });
  276. this.getTableData( this.paramId)
  277. });
  278. },
  279. //获取项目列表
  280. getProjectListData(id) {
  281. if(!id ){
  282. getProjectList(1, 999).then((res) => {
  283. this.projectList = res.data.data.records;
  284. });
  285. }else{
  286. getProjectContractByParam({
  287. parameterId: id
  288. }).then((res) => {
  289. this.projectList = res.data.data;
  290. });
  291. }
  292. },
  293. getProjectListData1() {
  294. getProjectList(1, 999).then((res) => {
  295. this.projectList1 = res.data.data.records;
  296. });
  297. },
  298. changeProject(val){
  299. //根据项目id获取合同段列表
  300. findContractByProjectId(val).then((res) => {
  301. this.contractList = res.data.data;
  302. });
  303. },
  304. searchElement(){
  305. this.getTableData()
  306. },
  307. //获取元素列表
  308. getTableData(id){
  309. this.tableLoading=true
  310. getParameterElementList({
  311. parameterId: this.paramId,
  312. contractId:this.searchForm.contractId,
  313. projectId:this.searchForm.projectName,
  314. elementName:this.searchForm.elementName
  315. }).then((res)=>{
  316. this.tableLoading=false
  317. this.tableData = res.data.data||[];
  318. this.tableLoading=false
  319. })
  320. },
  321. confirmAdd(){
  322. console.log(this.form,'form');
  323. const {selectedElement}=this.form;
  324. if(!this.form.elementName&&selectedElement.length==0){
  325. this.$message.error('请选择元素或者完善元素名称');
  326. return;
  327. }
  328. let subArr=[]
  329. let projectList=[]
  330. let proData=this.proData
  331. console.log(proData,'proData');
  332. if(proData.length>0&&proData[0].projectName){
  333. proData.forEach(item=>{
  334. projectList.push({
  335. projectId:item.projectName,
  336. contractId:item.contractSection.join(','),
  337. })
  338. })
  339. }
  340. if(selectedElement.length>0){
  341. selectedElement.forEach(item=>{
  342. subArr.push({
  343. id:this.form.id,
  344. parameterId: this.params.id,
  345. type:this.form.type,
  346. elementName:item.eName,
  347. projectList:this.form.type===2?projectList:[]
  348. })
  349. })
  350. }else if(this.form.elementName){
  351. subArr.push({
  352. id:this.form.id,
  353. parameterId: this.params.id,
  354. type:this.form.type,
  355. elementName:this.form.elementName,
  356. projectList:this.form.type===2?projectList:[]
  357. })
  358. }
  359. console.log(subArr,'subArr');
  360. console.log(this.proData,'proData');
  361. if(this.form.type===2&&this.proData&&!this.proData[0]['projectName']){
  362. this.$message.warning('请先选择项目');
  363. return;
  364. }
  365. submitElement(subArr).then((res) => {
  366. if(res.data.code==200){
  367. this.$message.success(res.data.msg)
  368. this.addDialogVisible=false
  369. }else{
  370. this.$message.error(res.data.msg)
  371. }
  372. this.addDialogVisible=false
  373. this.getTableData()
  374. });
  375. },
  376. addProData(){
  377. this.proData.push({})
  378. },
  379. removeProData(index){
  380. this.proData.splice(index,1)
  381. },
  382. //选择元素
  383. checkEle(){
  384. this.$refs.checkEleDialogRef.show( this.form.selectedElement)
  385. },
  386. confirmCheck(selectedData){
  387. this.form.selectedElement=selectedData
  388. console.log('选择的元素1111111111:', selectedData);
  389. },
  390. handleClose(tag) {
  391. this.form.selectedElement.splice(this.form.selectedElement.indexOf(tag), 1);
  392. },
  393. }
  394. };
  395. </script>
  396. <style scoped>
  397. .form-container1{
  398. position: relative;
  399. max-height: 400px;
  400. overflow-y: auto;
  401. }
  402. .form-container {
  403. border: 1px solid #ccc; /* 淡灰色边框 */
  404. padding: 20px 40px 0px 20px;
  405. margin-bottom: 15px;
  406. position: relative;
  407. }
  408. .delete-icon {
  409. position: absolute;
  410. top: 5px;
  411. right:5px;
  412. z-index: 1000;
  413. }
  414. .add-button {
  415. margin-left: 20px;
  416. position: absolute;
  417. top: 0px;
  418. right: 5px;
  419. z-index: 1000;
  420. }
  421. .multiple-select {
  422. width: 100%;
  423. }
  424. .search-container {
  425. display: flex;
  426. justify-content: space-between; /* 使子元素两端对齐 */
  427. align-items: center; /* 垂直居中对齐 */
  428. }
  429. .bottom-box{
  430. width: 100%;
  431. height: 20%;
  432. border: 1px solid #DBDBDB;
  433. margin-top: 10px;
  434. padding: 10px;
  435. }
  436. .mr-5{
  437. margin-right: 5px;
  438. }
  439. .sub-title{
  440. margin-bottom: 15px;
  441. font-weight: bold;
  442. font-size: 16px
  443. }
  444. </style>