You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1318 lines
43 KiB

4 years ago
4 years ago
4 years ago
1 year ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
3 years ago
1 year ago
4 years ago
3 years ago
3 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
3 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
1 year ago
3 years ago
1 year ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
  1. <template>
  2. <div class="mod-config">
  3. <el-form :inline="true" label-position="top" :model="searchData">
  4. <el-form-item label="BU">
  5. <el-select v-model="searchData.buDesc" placeholder="请选择" clearable style="width: 80px">
  6. <el-option
  7. v-for = "i in userBuList"
  8. :key = "i.buNo"
  9. :label = "i.buDesc"
  10. :value = "i.buDesc">
  11. </el-option>
  12. </el-select>
  13. </el-form-item>
  14. <el-form-item label="维保项目编码">
  15. <el-input v-model="searchData.itemNo" clearable style="width: 120px"></el-input>
  16. </el-form-item>
  17. <el-form-item label="维保项目名称">
  18. <el-input v-model="searchData.itemDesc" clearable style="width: 200px"></el-input>
  19. </el-form-item>
  20. <el-form-item label="部门">
  21. <el-select v-model="searchData.checkType" clearable style="width: 80px">
  22. <el-option label="生产" value="R022"></el-option>
  23. <el-option label="设备" value="R023"></el-option>
  24. <el-option label="质量" value="R024"></el-option>
  25. </el-select>
  26. </el-form-item>
  27. <el-form-item label=" ">
  28. <el-button v-if="!authSearch" type="primary" @click="getDataList()">查询</el-button>
  29. <el-button v-if="!authSave" type="primary" @click="addModal()">新增</el-button>
  30. <el-button type="primary" icon="el-icon-upload" @click="importExcel" style="margin-left: 2px">导入</el-button>
  31. <el-button @click="exportExcel()" type="primary" style="margin-left: 2px">{{'导出'}}</el-button>
  32. <!-- <download-excel-->
  33. <!-- :fields="fields()"-->
  34. <!-- :data="exportData"-->
  35. <!-- type="xls"-->
  36. <!-- :name="exportName"-->
  37. <!-- :header="exportHeader"-->
  38. <!-- :footer="exportFooter"-->
  39. <!-- :fetch="createExportData"-->
  40. <!-- :before-generate="startDownload"-->
  41. <!-- :before-finish="finishDownload"-->
  42. <!-- worksheet="导出信息"-->
  43. <!-- class="el-button el-button&#45;&#45;primary el-button&#45;&#45;medium">-->
  44. <!-- {{ "导出" }}-->
  45. <!-- </download-excel>-->
  46. </el-form-item>
  47. </el-form>
  48. <el-table
  49. :height="height"
  50. :data="dataList"
  51. border
  52. v-loading="dataListLoading"
  53. style="width: 100%;">
  54. <el-table-column
  55. v-for="(item,index) in columnList" :key="index"
  56. :sortable="item.columnSortable"
  57. :prop="item.columnProp"
  58. :header-align="item.headerAlign"
  59. :show-overflow-tooltip="item.showOverflowTooltip"
  60. :align="item.align"
  61. :fixed="item.fixed==''?false:item.fixed"
  62. :min-width="item.columnWidth"
  63. :label="item.columnLabel">
  64. <template slot-scope="scope">
  65. <span v-if="!item.columnHidden">
  66. <span v-if="columnsProp.includes(item.columnProp)">{{ scope.row[`${item.columnProp}Desc`] }}</span>
  67. <span v-else>
  68. {{ scope.row[item.columnProp] }}
  69. </span>
  70. </span>
  71. <span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
  72. </template>
  73. </el-table-column>
  74. <el-table-column
  75. fixed="right"
  76. header-align="center"
  77. align="center"
  78. width="160"
  79. label="操作">
  80. <template slot-scope="scope">
  81. <el-link style="cursor: pointer" v-if="!authUpdate" @click="updateModal(scope.row)">修改</el-link>
  82. <el-link style="cursor: pointer" v-if="scope.row.valueChooseFlag === 'Y' && !authChoose" @click="chooseModal(scope.row)">可选值</el-link>
  83. <el-link style="cursor: pointer" v-if="!authDelete" @click="deleteEamPropertiesItem(scope.row)">删除</el-link>
  84. </template>
  85. </el-table-column>
  86. </el-table>
  87. <!-- 分页栏 -->
  88. <el-pagination
  89. @size-change="sizeChangeHandle"
  90. @current-change="currentChangeHandle"
  91. :current-page="pageIndex"
  92. :page-sizes="[20, 50, 100, 200, 500]"
  93. :page-size="pageSize"
  94. :total="totalPage"
  95. layout="total, sizes, prev, pager, next, jumper">
  96. </el-pagination>
  97. <el-dialog title="维保项目" :close-on-click-modal="false" v-drag :visible.sync="modalFlag" width="460px">
  98. <el-form :inline="true" label-position="top" :model="modalData" :rules="rules" style="margin-left: 7px;margin-top: -5px;">
  99. <el-form-item label="BU" prop="bu" :rules="rules.bu">
  100. <el-select v-model="modalData.bu" placeholder="请选择" :disabled="modalDisableFlag" style="width: 230px">
  101. <el-option
  102. v-for = "i in userBuList"
  103. :key = "i.buNo"
  104. :label = "i.sitename"
  105. :value = "i.buNo">
  106. <span style="float: left;width: 100px">{{ i.sitename }}</span>
  107. <span style="float: right; color: #8492a6;white-space:nowrap;overflow:hidden;text-overflow:ellipsis; font-size: 11px;width: 60px">
  108. {{ i.buDesc }}
  109. </span>
  110. </el-option>
  111. </el-select>
  112. </el-form-item>
  113. <el-form-item label="部门" prop="checkType">
  114. <el-select v-model="modalData.checkType" :disabled="modalDisableFlag" style="width: 80px">
  115. <el-option label="生产" value="R022"></el-option>
  116. <el-option label="设备" value="R023"></el-option>
  117. <el-option label="质量" value="R024"></el-option>
  118. </el-select>
  119. </el-form-item>
  120. <el-form-item label="检测值类型" prop="valueTypeDb" :rules="rules.valueTypeDbType">
  121. <el-select filterable v-model="modalData.valueTypeDb" style="width: 80px">
  122. <el-option label="文本" value="T"></el-option>
  123. <el-option label="数字" value="N"></el-option>
  124. </el-select>
  125. </el-form-item>
  126. </el-form>
  127. <el-form :inline="true" label-position="top" :model="modalData" :rules="rules" style="margin-left: 7px;">
  128. <el-form-item label="维保项目编码" prop="itemNo" :rules="rules.itemNoType">
  129. <el-input v-model="modalData.itemNo" :disabled="modalDisableFlag" style="width: 130px"></el-input>
  130. <el-button type="primary" @click="itemNoChanged()">Next No</el-button>
  131. </el-form-item>
  132. <el-form-item label="维保项目名称" prop="itemDesc" :rules="rules.itemDescType">
  133. <el-input v-model="modalData.itemDesc" style="width: 416px"></el-input>
  134. </el-form-item>
  135. </el-form>
  136. <el-form :inline="true" label-position="top" :model="modalData" :rules="rules" style="margin-left: 7px;">
  137. <el-form-item label="参照值">
  138. <el-input v-model="modalData.defaultValue" style="width: 130px"></el-input>
  139. </el-form-item>
  140. <el-form-item label="最大值">
  141. <el-input v-model="modalData.maxValue" style="width: 130px"></el-input>
  142. </el-form-item>
  143. <el-form-item label="最小值">
  144. <el-input v-model="modalData.minValue" style="width: 129px"></el-input>
  145. </el-form-item>
  146. </el-form>
  147. <el-form :inline="true" label-position="top" :model="modalData" :rules="rules" style="margin-left: 7px;">
  148. <el-form-item label="维保方法说明">
  149. <el-input v-model="modalData.itemRemark" style="width: 255px"></el-input>
  150. </el-form-item>
  151. <el-form-item label="是否值可选" prop="valueChooseFlag" :rules="rules.valueChooseFlagType">
  152. <el-select filterable v-model="modalData.valueChooseFlag" style="width: 80px">
  153. <el-option label="是" value="Y"></el-option>
  154. <el-option label="否" value="N"></el-option>
  155. </el-select>
  156. </el-form-item>
  157. <el-form-item label="图片必填">
  158. <input type="checkbox" value="Y" name="addWorkOrderRule" v-model="modalData.imageFlag"/>
  159. </el-form-item>
  160. </el-form>
  161. <el-footer style="height:40px;margin-top: 20px;text-align:center">
  162. <el-button type="primary" @click="saveData()">保存</el-button>
  163. <el-button type="primary" @click="modalFlag = false">关闭</el-button>
  164. </el-footer>
  165. </el-dialog>
  166. <el-dialog title="可选值" :close-on-click-modal="false" v-drag :visible.sync="chooseModalFlag" width="430px">
  167. <el-form :inline="true" label-position="top" style="margin-left: 7px;margin-top: -5px;">
  168. <el-form-item label="维保项目名称:">
  169. <el-input v-model="chooseModalData.itemDesc" disabled style="width: 120px"></el-input>
  170. </el-form-item>
  171. <el-form-item :label="'检测值类型'">
  172. <el-select filterable v-model="chooseModalData.valueTypeDb" disabled style="width: 120px">
  173. <el-option label="文本" value="T"></el-option>
  174. <el-option label="数字" value="N"></el-option>
  175. </el-select>
  176. </el-form-item>
  177. <el-form-item :label="' '">
  178. <el-button type="primary" @click="addChooseModal()">新增</el-button>
  179. </el-form-item>
  180. </el-form>
  181. <el-table
  182. :height="300"
  183. :data="chooseTableData"
  184. border
  185. style="width: 100%">
  186. <el-table-column
  187. prop="availableValue"
  188. header-align="center"
  189. align="center"
  190. min-width="200"
  191. label="属性值">
  192. </el-table-column>
  193. <el-table-column
  194. prop=""
  195. header-align="center"
  196. align="center"
  197. min-width="100"
  198. label="操作">
  199. <template slot-scope="scope">
  200. <el-link style="cursor: pointer" @click="updateChooseModal(scope.row)">修改</el-link>
  201. <el-link style="cursor: pointer" @click="deleteItemAvailable(scope.row)">删除</el-link>
  202. </template>
  203. </el-table-column>
  204. </el-table>
  205. </el-dialog>
  206. <el-dialog title="可选值维护" :close-on-click-modal="false" v-drag :visible.sync="itemModalFlag" width="215px" >
  207. <el-form :inline="true" label-position="top" style="margin-left: 22px;margin-top: -5px;" @submit.native.prevent>
  208. <el-form-item :label="'可选值'">
  209. <el-input v-model="itemData.availableValue" :type="itemFlag" style="width: 130px;"></el-input>
  210. </el-form-item>
  211. </el-form>
  212. <el-footer style="height:40px;margin-top: 20px;text-align:center">
  213. <el-button type="primary" @click="saveItemAvailable()">保存</el-button>
  214. <el-button type="primary" @click="itemModalFlag = false">关闭</el-button>
  215. </el-footer>
  216. </el-dialog>
  217. <!-- 导入对话框 -->
  218. <template>
  219. <el-dialog
  220. title="维保项目数据导入"
  221. :close-on-click-modal="false"
  222. :visible.sync="uploadDialogVisible"
  223. width="400px"
  224. top="12vh"
  225. class="simple-dialog"
  226. @close="handleUploadDialogClose"
  227. >
  228. <div style="margin-bottom: 8px;">
  229. <el-button type="primary" @click="downloadTemplate" size="medium" style="width: 40%;">
  230. <i class="el-icon-download"></i> 下载文件模板
  231. </el-button>
  232. </div>
  233. <!-- BU选择 -->
  234. <div style="margin-bottom: 15px;">
  235. <el-form :inline="true" label-position="top" label-width="80px">
  236. <el-form-item label="BU">
  237. <el-select v-model="uploadBu" placeholder="请选择" style="width: 295px">
  238. <el-option
  239. v-for = "i in userBuList"
  240. :key = "i.buNo"
  241. :label = "i.sitename"
  242. :value = "i.buNo">
  243. <span style="float: left;width: 100px">{{ i.sitename }}</span>
  244. <span style="float: right; color: #8492a6;white-space:nowrap;overflow:hidden;text-overflow:ellipsis; font-size: 11px;">
  245. {{ i.buDesc }}
  246. </span>
  247. </el-option>
  248. </el-select>
  249. </el-form-item>
  250. </el-form>
  251. </div>
  252. <div>
  253. <el-upload
  254. class="upload-demo"
  255. drag
  256. action="javascript:void(0);"
  257. ref="uploadFile"
  258. :on-change="handleFileChange"
  259. :auto-upload="false"
  260. :limit="1"
  261. accept=".xlsx,.xls"
  262. style="width: 100%;"
  263. >
  264. <i class="el-icon-upload"></i>
  265. <div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
  266. </el-upload>
  267. </div>
  268. <!-- 底部 -->
  269. <span slot="footer" class="dialog-footer">
  270. <el-button type="primary" @click="confirmUpload" size="medium">保存</el-button>
  271. <el-button @click="uploadDialogVisible = false" size="medium">关闭</el-button>
  272. </span>
  273. </el-dialog>
  274. </template>
  275. </div>
  276. </template>
  277. <script>
  278. import {
  279. eamPropertiesItemSearch,
  280. eamPropertiesItemSave,
  281. eamPropertiesItemEdit,
  282. eamPropertiesItemDelete,
  283. searchItemAvailable,
  284. saveItemAvailable,
  285. deleteItemAvailable,
  286. getSiteAndBuByUserName,
  287. getRoleByUserName,
  288. uploadEamMaintenanceItemExcel, // 导入维保项目Excel
  289. downloadEamMaintenanceItemTemplate, // 下载维保项目导入模板
  290. } from "@/api/eam/eam.js"
  291. import {getTableDefaultListLanguage, getTableUserListLanguage} from "@/api/table.js"
  292. import {userFavoriteList, saveUserFavorite, removeUserFavorite} from '@/api/userFavorite.js'
  293. import excel from "@/utils/excel-util.js";
  294. import {queryItemNo} from "../../../api/eam/eam";
  295. export default {
  296. watch: {
  297. searchData: {
  298. deep: true,
  299. handler: function (newV, oldV) {
  300. this.searchData.itemNo = this.searchData.itemNo.toUpperCase()
  301. }
  302. },
  303. itemData: {
  304. deep: true,
  305. handler: function (newV, oldV) {
  306. this.itemData.itemNo = this.itemData.itemNo.toUpperCase()
  307. }
  308. },
  309. modalData: {
  310. deep: true,
  311. handler: function (newV, oldV) {
  312. this.modalData.itemNo = this.modalData.itemNo.toUpperCase()
  313. }
  314. },
  315. chooseModalData: {
  316. deep: true,
  317. handler: function (newV, oldV) {
  318. this.chooseModalData.itemNo = this.chooseModalData.itemNo.toUpperCase()
  319. }
  320. }
  321. },
  322. data () {
  323. return {
  324. columnsProp:['createdBy','valueChooseFlag','updateBy'],
  325. // 是否收藏
  326. favorite: false,
  327. // 导出 start
  328. exportData: [],
  329. exportName: "维保项目" + this.dayjs().format('YYYYMMDDHHmmss'),
  330. exportHeader: ["维保项目"],
  331. exportFooter: [],
  332. exportList:[],
  333. // 导出 end
  334. searchData: {
  335. site: '',
  336. userName: this.$store.state.user.name,
  337. itemNo: '',
  338. itemDesc: '',
  339. buDesc: '',
  340. itemType: 'B',
  341. checkType: '',
  342. page: 1,
  343. limit: 10,
  344. },
  345. height: 200,
  346. pageIndex: 1,
  347. pageSize: 20,
  348. totalPage: 0,
  349. dataList: [],
  350. chooseTableData:[],
  351. dataListLoading: false,
  352. dataListSelections: [],
  353. modalFlag: false,
  354. modalDisableFlag: false,
  355. chooseModalFlag: false,
  356. itemModalFlag: false,
  357. itemFlag: 'text',
  358. itemData: {
  359. site: '',
  360. buNo: '',
  361. itemNo:'',
  362. valueNo:'',
  363. availableValue:'',
  364. itemType:'B',
  365. createdBy: this.$store.state.user.name
  366. },
  367. modalData: {
  368. flag:'',
  369. itemNo:'',
  370. itemDesc:'',
  371. valueTypeDb:'',
  372. defaultValue:'',
  373. valueChooseFlag:'',
  374. createdBy:this.$store.state.user.name,
  375. maxValue:'',
  376. minValue:'',
  377. itemRemark:'',
  378. itemType:'B',
  379. updateBy: this.$store.state.user.name,
  380. imageFlag: '',
  381. checkType: ''
  382. },
  383. departmentList: [],
  384. // 展示列集
  385. columnList: [
  386. {
  387. userId: this.$store.state.user.name,
  388. functionId: 101003001,
  389. serialNumber: '101003001Table1BuDesc',
  390. tableId: "101003001Table1",
  391. tableName: "维保项目表",
  392. columnProp: 'buDesc',
  393. headerAlign: "center",
  394. align: "center",
  395. columnLabel: 'BU',
  396. columnHidden: false,
  397. columnImage: false,
  398. columnSortable: false,
  399. sortLv: 0,
  400. status: true,
  401. fixed: '',
  402. columnWidth: 100,
  403. },
  404. {
  405. userId: this.$store.state.user.name,
  406. functionId: 101003001,
  407. serialNumber: '101003001Table1ItemNo',
  408. tableId: "101003001Table1",
  409. tableName: "维保项目表",
  410. columnProp: 'itemNo',
  411. headerAlign: "center",
  412. align: "center",
  413. columnLabel: '维保项目编码',
  414. columnHidden: false,
  415. columnImage: false,
  416. columnSortable: false,
  417. sortLv: 0,
  418. status: true,
  419. fixed: '',
  420. columnWidth: 120,
  421. },
  422. {
  423. userId: this.$store.state.user.name,
  424. functionId: 101003001,
  425. serialNumber: '101003001Table1ItemDesc',
  426. tableId: "101003001Table1",
  427. tableName: "维保项目表",
  428. columnProp: 'itemDesc',
  429. headerAlign: "center",
  430. align: "left",
  431. columnLabel: '维保项目名称',
  432. columnHidden: false,
  433. columnImage: false,
  434. columnSortable: false,
  435. sortLv: 0,
  436. status: true,
  437. fixed: '',
  438. columnWidth: 200,
  439. },
  440. {
  441. userId: this.$store.state.user.name,
  442. functionId: 101003001,
  443. serialNumber: '101003001Table1ItemRemark',
  444. tableId: "101003001Table1",
  445. tableName: "维保项目表",
  446. columnProp: 'itemRemark',
  447. headerAlign: "center",
  448. align: "left",
  449. columnLabel: '维保方法说明',
  450. columnHidden: false,
  451. columnImage: false,
  452. columnSortable: false,
  453. sortLv: 0,
  454. status: true,
  455. fixed: '',
  456. columnWidth: 450,
  457. },
  458. {
  459. userId: this.$store.state.user.name,
  460. functionId: 101003001,
  461. serialNumber: '101003001Table1ValueType',
  462. tableId: "101003001Table1",
  463. tableName: "维保项目表",
  464. columnProp: 'valueType',
  465. headerAlign: "center",
  466. align: "center",
  467. columnLabel: '检测值类型',
  468. columnHidden: false,
  469. columnImage: false,
  470. columnSortable: false,
  471. sortLv: 0,
  472. status: true,
  473. fixed: '',
  474. columnWidth: 100,
  475. },
  476. {
  477. userId: this.$store.state.user.name,
  478. functionId: 101003001,
  479. serialNumber: '101003001Table1DefaultValue',
  480. tableId: "101003001Table1",
  481. tableName: "维保项目表",
  482. columnProp: 'defaultValue',
  483. headerAlign: "center",
  484. align: "right",
  485. columnLabel: '参照值',
  486. columnHidden: false,
  487. columnImage: false,
  488. columnSortable: false,
  489. sortLv: 0,
  490. status: true,
  491. fixed: '',
  492. columnWidth: 100,
  493. },
  494. {
  495. userId: this.$store.state.user.name,
  496. functionId: 101003001,
  497. serialNumber: '101003001Table1MaxValue',
  498. tableId: "101003001Table1",
  499. tableName: "维保项目表",
  500. columnProp: 'maxValue',
  501. headerAlign: "center",
  502. align: "right",
  503. columnLabel: '最大值',
  504. columnHidden: false,
  505. columnImage: false,
  506. columnSortable: false,
  507. sortLv: 0,
  508. status: true,
  509. fixed: '',
  510. columnWidth: 100,
  511. },
  512. {
  513. userId: this.$store.state.user.name,
  514. functionId: 101003001,
  515. serialNumber: '101003001Table1MinValue',
  516. tableId: "101003001Table1",
  517. tableName: "维保项目表",
  518. columnProp: 'minValue',
  519. headerAlign: "center",
  520. align: "right",
  521. columnLabel: '最小值',
  522. columnHidden: false,
  523. columnImage: false,
  524. columnSortable: false,
  525. sortLv: 0,
  526. status: true,
  527. fixed: '',
  528. columnWidth: 100,
  529. },
  530. {
  531. userId: this.$store.state.user.name,
  532. functionId: 101003001,
  533. serialNumber: '101003001Table1ValueChooseFlag',
  534. tableId: "101003001Table1",
  535. tableName: "维保项目表",
  536. columnProp: 'valueChooseFlag',
  537. headerAlign: "center",
  538. align: "center",
  539. columnLabel: '是否值可选',
  540. columnHidden: false,
  541. columnImage: false,
  542. columnSortable: false,
  543. sortLv: 0,
  544. status: true,
  545. fixed: '',
  546. columnWidth: 100,
  547. },
  548. {
  549. userId: this.$store.state.user.name,
  550. functionId: 101003001,
  551. serialNumber: '101003001Table1ImageFlag',
  552. tableId: "101003001Table1",
  553. tableName: "维保项目表",
  554. columnProp: 'imageFlag',
  555. headerAlign: "center",
  556. align: "center",
  557. columnLabel: '是否图片必填',
  558. columnHidden: false,
  559. columnImage: false,
  560. columnSortable: false,
  561. sortLv: 0,
  562. status: true,
  563. fixed: '',
  564. columnWidth: 100,
  565. },
  566. {
  567. userId: this.$store.state.user.name,
  568. functionId: 101003001,
  569. serialNumber: '101003001Table1CreatedDate',
  570. tableId: "101003001Table1",
  571. tableName: "维保项目表",
  572. columnProp: 'createdDate',
  573. headerAlign: "center",
  574. align: "center",
  575. columnLabel: '创建时间',
  576. columnHidden: false,
  577. columnImage: false,
  578. columnSortable: false,
  579. sortLv: 0,
  580. status: true,
  581. fixed: '',
  582. columnWidth: 170,
  583. },
  584. {
  585. userId: this.$store.state.user.name,
  586. functionId: 101003001,
  587. serialNumber: '101003001Table1CreatedBy',
  588. tableId: "101003001Table1",
  589. tableName: "维保项目表",
  590. columnProp: 'createdBy',
  591. headerAlign: "center",
  592. align: "center",
  593. columnLabel: '创建人',
  594. columnHidden: false,
  595. columnImage: false,
  596. columnSortable: false,
  597. sortLv: 0,
  598. status: true,
  599. fixed: '',
  600. columnWidth: 100,
  601. },
  602. {
  603. userId: this.$store.state.user.name,
  604. functionId: 101003001,
  605. serialNumber: '101003001Table1UpdateDate',
  606. tableId: "101003001Table1",
  607. tableName: "维保项目表",
  608. columnProp: 'updateDate',
  609. headerAlign: "center",
  610. align: "center",
  611. columnLabel: '更新时间',
  612. columnHidden: false,
  613. columnImage: false,
  614. columnSortable: false,
  615. sortLv: 0,
  616. status: true,
  617. fixed: '',
  618. columnWidth: 170,
  619. },
  620. {
  621. userId: this.$store.state.user.name,
  622. functionId: 101003001,
  623. serialNumber: '101003001Table1UpdateBy',
  624. tableId: "101003001Table1",
  625. tableName: "维保项目表",
  626. columnProp: 'updateBy',
  627. headerAlign: "center",
  628. align: "center",
  629. columnLabel: '更新人',
  630. columnHidden: false,
  631. columnImage: false,
  632. columnSortable: false,
  633. sortLv: 0,
  634. status: true,
  635. fixed: '',
  636. columnWidth: 100,
  637. },
  638. ],
  639. levelList: [],
  640. chooseModalData: {
  641. site: '',
  642. buNo: '',
  643. itemNo: '',
  644. itemDesc: '',
  645. itemType:'B',
  646. valueTypeDb:'',
  647. },
  648. rules: {
  649. itemNoType:[
  650. {
  651. required: true,
  652. message: ' ',
  653. trigger: ['blur','change']
  654. }
  655. ],
  656. itemDescType:[
  657. {
  658. required: true,
  659. message: ' ',
  660. trigger: ['blur','change']
  661. }
  662. ],
  663. valueTypeDbType:[
  664. {
  665. required: true,
  666. message: ' ',
  667. trigger: ['blur','change']
  668. }
  669. ],
  670. valueChooseFlagType:[
  671. {
  672. required: true,
  673. message: ' ',
  674. trigger: ['blur','change']
  675. }
  676. ],
  677. bu:[
  678. {
  679. required: true,
  680. message: ' ',
  681. trigger: ['blur','change']
  682. }
  683. ],
  684. checkType: [
  685. {
  686. required: true,
  687. message: ' ',
  688. trigger: ['blur','change']
  689. }
  690. ]
  691. },
  692. userBuList: [],
  693. userRoleList: [],
  694. authSearch: false,
  695. authSave: false,
  696. authUpdate: false,
  697. authDelete: false,
  698. authChoose: false,
  699. menuId: this.$route.meta.menuId,
  700. // 上传相关
  701. uploadDialogVisible: false,
  702. uploadFileName: '',
  703. uploadFile: null,
  704. uploadBu: '', // 上传时选择的BU
  705. }
  706. },
  707. mounted () {
  708. this.$nextTick(() => {
  709. this.height = window.innerHeight - 180
  710. })
  711. },
  712. created () {
  713. // 按钮控制
  714. this.getButtonAuthData()
  715. // 获取用户的 site 和 bu
  716. this.getSiteAndBuByUserName()
  717. // 获取用户的 role
  718. this.getRoleByUserName()
  719. // 校验用户是否收藏
  720. this.favoriteIsOk()
  721. // 动态列
  722. this.getTableUserColumn(this.$route.meta.menuId+'table1',1)
  723. if (!this.authSearch) {
  724. // 获取数据列表
  725. this.getDataList()
  726. }
  727. },
  728. methods: {
  729. // 获取用户的bu
  730. getSiteAndBuByUserName () {
  731. let tempData = {
  732. username: this.$store.state.user.name,
  733. }
  734. getSiteAndBuByUserName(tempData).then(({data}) => {
  735. if (data.code === 0) {
  736. this.userBuList = data.rows
  737. }
  738. })
  739. },
  740. // 获取用户的 role
  741. getRoleByUserName () {
  742. let tempData = {
  743. username: this.$store.state.user.name,
  744. }
  745. getRoleByUserName(tempData).then(({data}) => {
  746. if (data.code === 0) {
  747. this.userRoleList = data.rows
  748. }
  749. })
  750. },
  751. // 每页数
  752. sizeChangeHandle (val) {
  753. this.pageSize = val
  754. this.pageIndex = 1
  755. this.getDataList()
  756. },
  757. // 当前页
  758. currentChangeHandle (val) {
  759. this.pageIndex = val
  760. this.getDataList()
  761. },
  762. // 获取数据列表
  763. getDataList () {
  764. this.searchData.limit = this.pageSize
  765. this.searchData.page = this.pageIndex
  766. eamPropertiesItemSearch(this.searchData).then(({data}) => {
  767. if (data.code === 0) {
  768. this.dataList = data.page.list
  769. this.pageIndex = data.page.currPage
  770. this.pageSize = data.page.pageSize
  771. this.totalPage = data.page.totalCount
  772. }
  773. this.dataListLoading = false
  774. })
  775. },
  776. async exportExcel() {
  777. this.searchData.limit = -1
  778. this.searchData.page = 1
  779. excel.exportTable({
  780. url: "/pms/eam/eamPropertiesItemSearch",
  781. columnMapping: this.columnList,//可以直接用table,不需要的列就剔除
  782. mergeSetting: [],//需要合并的列
  783. params: this.searchData,
  784. fileName: this.exportName+".xlsx",
  785. rowFetcher: res => res.data,
  786. columnFormatter: [],
  787. dropColumns: [],//需要剔除的列,例如dropColumns: ["netWeight"],即剔除净重列
  788. });
  789. },
  790. //导出excel
  791. // async createExportData () {
  792. // await eamPropertiesItemSearch(this.searchData).then(({data}) => {
  793. // this.exportList = data.rows
  794. // })
  795. // return this.exportList
  796. // },
  797. //
  798. // startDownload () {},
  799. //
  800. // finishDownload() {},
  801. //
  802. // fields () {
  803. // let json = "{"
  804. // this.columnList.forEach((item, index) => {
  805. // if (index == this.columnList.length - 1) {
  806. // json += "\"" + item.columnLabel + "\"" + ":" + "\"" + item.columnProp + "\""
  807. // } else {
  808. // json += "\"" + item.columnLabel + "\"" + ":" + "\"" + item.columnProp + "\"" + ","
  809. // }
  810. // })
  811. // json += "}"
  812. // let s = eval("(" + json + ")")
  813. // return s
  814. // },
  815. addModal () {
  816. this.modalData = {
  817. bu: this.userBuList[0].buNo,
  818. site: '',
  819. flag: '1',
  820. itemNo: '',
  821. itemDesc: '',
  822. valueTypeDb: 'T',
  823. defaultValue: '',
  824. valueChooseFlag: 'N',
  825. createdBy: this.$store.state.user.name,
  826. maxValue: '',
  827. minValue: '',
  828. itemRemark: '',
  829. itemType: 'B',
  830. updateBy: this.$store.state.user.name,
  831. imageFlag: '',
  832. checkType: this.userRoleList.length > 0 ? this.userRoleList[0].roleNo : 'R022',
  833. }
  834. this.modalDisableFlag = false
  835. this.modalFlag = true
  836. },
  837. chooseModal (row) {
  838. this.chooseModalData.site = row.site
  839. this.chooseModalData.buNo = row.buNo
  840. this.chooseModalData.itemNo = row.itemNo
  841. this.chooseModalData.itemDesc = row.itemDesc
  842. this.chooseModalData.valueTypeDb = row.valueTypeDb
  843. searchItemAvailable(this.chooseModalData).then(({data}) => {
  844. this.chooseTableData = data.rows
  845. })
  846. this.chooseModalFlag = true
  847. },
  848. updateModal (row) {
  849. this.modalData = {
  850. site: row.site,
  851. bu: row.site + '_' + row.buNo,
  852. flag: '2',
  853. itemNo: row.itemNo,
  854. itemDesc: row.itemDesc,
  855. valueTypeDb: row.valueTypeDb,
  856. defaultValue: row.defaultValue,
  857. valueChooseFlag: row.valueChooseFlag,
  858. maxValue: row.maxValue,
  859. minValue: row.minValue,
  860. itemRemark: row.itemRemark,
  861. itemType: 'B',
  862. updateBy: this.$store.state.user.name,
  863. imageFlag: row.imageFlag,
  864. checkType: row.checkType
  865. }
  866. this.modalDisableFlag = true
  867. this.modalFlag = true
  868. },
  869. // 删除
  870. deleteEamPropertiesItem (row) {
  871. this.$confirm(`是否删除这个维保项目?`, '提示', {
  872. confirmButtonText: '确定',
  873. cancelButtonText: '取消',
  874. type: 'warning'
  875. }).then(() => {
  876. eamPropertiesItemDelete(row).then(({data}) => {
  877. if (data && data.code === 0) {
  878. this.getDataList()
  879. this.$message({
  880. message: '操作成功',
  881. type: 'success',
  882. duration: 1500,
  883. onClose: () => {}
  884. })
  885. } else {
  886. this.$alert(data.msg, '错误', {
  887. confirmButtonText: '确定'
  888. })
  889. }
  890. })
  891. })
  892. },
  893. itemNoChanged(){
  894. let param = {
  895. site: this.modalData.bu.split('_')[0],
  896. buNo: this.modalData.bu.split('_')[1],
  897. itemNo: this.modalData.itemNo,
  898. itemType: this.modalData.itemType
  899. }
  900. queryItemNo(param).then(({data}) => {
  901. if (data && data.code == 0 && data.length==5) {
  902. this.modalData.itemNo = data.data
  903. } else {
  904. this.$message.error(data.data)
  905. }
  906. })
  907. },
  908. saveData () {
  909. if (this.modalData.bu === '' || this.modalData.bu == null) {
  910. this.$message.warning('请选择BU!')
  911. return
  912. }
  913. if (this.modalData.checkType === '' || this.modalData.checkType == null) {
  914. this.$message.warning('请选择部门!')
  915. return
  916. }
  917. if (this.modalData.itemNo === '' || this.modalData.itemNo == null) {
  918. this.$message.warning('请输入维保项目编码!')
  919. return
  920. }
  921. if (this.modalData.itemDesc === '' || this.modalData.itemDesc == null) {
  922. this.$message.warning('请输入维保项目名称!')
  923. return
  924. }
  925. let obj = document.getElementsByName('addWorkOrderRule');
  926. let s = '';
  927. for (let i = 0; i < obj.length; i++) {
  928. if (obj[i].checked) {
  929. s += obj[i].value + ','
  930. }
  931. }
  932. s = s.substring(0,s.length-1)
  933. this.modalData.imageFlag = s
  934. if(this.modalData.flag === '1'){
  935. eamPropertiesItemSave(this.modalData).then(({data}) => {
  936. if (data && data.code === '0') {
  937. this.getDataList()
  938. this.modalFlag = false
  939. this.$message({
  940. message: '操作成功',
  941. type: 'success',
  942. duration: 1500,
  943. onClose: () => {}
  944. })
  945. } else {
  946. this.$alert(data.msg, '错误', {
  947. confirmButtonText: '确定'
  948. })
  949. }
  950. })
  951. } else {
  952. eamPropertiesItemEdit(this.modalData).then(({data}) => {
  953. if (data && data.code === '0') {
  954. this.getDataList()
  955. this.modalFlag=false
  956. this.$message({
  957. message: '操作成功',
  958. type: 'success',
  959. duration: 1500,
  960. onClose: () => {}
  961. })
  962. } else {
  963. this.$alert(data.msg, '错误', {
  964. confirmButtonText: '确定'
  965. })
  966. }
  967. })
  968. }
  969. },
  970. addChooseModal () {
  971. this.itemFlag = this.chooseModalData.valueTypeDb === 'T'?'text':'number'
  972. this.itemData = {
  973. site: this.chooseModalData.site,
  974. buNo: this.chooseModalData.buNo,
  975. itemNo: this.chooseModalData.itemNo,
  976. valueNo: 0,
  977. availableValue: '',
  978. itemType: 'B',
  979. createdBy: this.$store.state.user.name
  980. }
  981. this.itemModalFlag = true
  982. },
  983. updateChooseModal (row) {
  984. this.itemFlag = this.chooseModalData.valueTypeDb === 'T'?'text':'number'
  985. this.itemData = {
  986. site: row.site,
  987. buNo: row.buNo,
  988. itemNo: this.chooseModalData.itemNo,
  989. valueNo: row.valueNo,
  990. availableValue: row.availableValue,
  991. itemType: 'B',
  992. createdBy: row.createdBy
  993. }
  994. this.itemModalFlag = true
  995. },
  996. saveItemAvailable () {
  997. if (this.itemData.availableValue === ''||this.itemData.availableValue == null) {
  998. this.$message.warning('请输入可选值!')
  999. return
  1000. }
  1001. saveItemAvailable(this.itemData).then(({data}) => {
  1002. if (data && data.code === 0) {
  1003. searchItemAvailable(this.chooseModalData).then(({data}) => {
  1004. this.chooseTableData = data.rows
  1005. })
  1006. this.itemModalFlag = false
  1007. this.$message({
  1008. message: '操作成功',
  1009. type: 'success',
  1010. duration: 1500,
  1011. onClose: () => {}
  1012. })
  1013. } else {
  1014. this.$alert(data.msg, '错误', {
  1015. confirmButtonText: '确定'
  1016. })
  1017. }
  1018. })
  1019. },
  1020. deleteItemAvailable (row) {
  1021. this.$confirm(`是否删除这个可选值?`, '提示', {
  1022. confirmButtonText: '确定',
  1023. cancelButtonText: '取消',
  1024. type: 'warning'
  1025. }).then(() => {
  1026. deleteItemAvailable(row).then(({data}) => {
  1027. if (data && data.code === 0) {
  1028. searchItemAvailable(this.chooseModalData).then(({data}) => {
  1029. this.chooseTableData = data.rows
  1030. })
  1031. this.$message({
  1032. message: '操作成功',
  1033. type: 'success',
  1034. duration: 1500,
  1035. onClose: () => {}
  1036. })
  1037. } else {
  1038. this.$alert(data.msg, '错误', {
  1039. confirmButtonText: '确定'
  1040. })
  1041. }
  1042. })
  1043. })
  1044. },
  1045. // 校验用户是否收藏
  1046. favoriteIsOk () {
  1047. let userFavorite = {
  1048. userId: this.$store.state.user.id,
  1049. languageCode: this.$i18n.locale
  1050. }
  1051. userFavoriteList(userFavorite).then(({data}) => {
  1052. for (let i = 0; i < data.list.length; i++) {
  1053. if(this.$route.meta.menuId === data.list[i].menuId){
  1054. this.favorite = true
  1055. }
  1056. }
  1057. })
  1058. },
  1059. // 收藏 OR 取消收藏
  1060. favoriteFunction() {
  1061. let userFavorite = {
  1062. userId: this.$store.state.user.id,
  1063. functionId: this.$route.meta.menuId,
  1064. }
  1065. if (this.favorite) {
  1066. removeUserFavorite(userFavorite).then(({data}) => {
  1067. this.$message.success(data.msg)
  1068. this.favorite = false
  1069. })
  1070. } else {
  1071. // 收藏
  1072. saveUserFavorite(userFavorite).then(({data}) => {
  1073. this.$message.success(data.msg)
  1074. this.favorite = true
  1075. })
  1076. }
  1077. },
  1078. // 动态列开始 获取 用户保存的 格式列
  1079. async getTableUserColumn (tableId, columnId) {
  1080. let queryTableUser = {
  1081. userId: this.$store.state.user.name,
  1082. functionId: this.$route.meta.menuId,
  1083. tableId: tableId,
  1084. status: true,
  1085. languageCode: this.$i18n.locale
  1086. }
  1087. await getTableUserListLanguage(queryTableUser).then(({data}) => {
  1088. if (data.rows.length > 0) {
  1089. switch (columnId) {
  1090. case 1:
  1091. this.columnList = data.rows
  1092. break;
  1093. }
  1094. } else {
  1095. this.getColumnList(tableId, columnId)
  1096. }
  1097. })
  1098. },
  1099. // 获取 tableDefault 列
  1100. async getColumnList (tableId, columnId) {
  1101. let queryTable = {
  1102. functionId: this.$route.meta.menuId,
  1103. tableId: tableId,
  1104. languageCode: this.$i18n.locale
  1105. }
  1106. await getTableDefaultListLanguage(queryTable).then(({data}) => {
  1107. if (!data.rows.length == 0) {
  1108. switch (columnId) {
  1109. case 1:
  1110. this.columnList = data.rows
  1111. break;
  1112. }
  1113. }
  1114. })
  1115. },
  1116. //获取按钮的权限数据
  1117. getButtonAuthData () {
  1118. let searchFlag = this.isAuth(this.menuId+":search")
  1119. let saveFlag = this.isAuth(this.menuId+":save")
  1120. let updateFlag = this.isAuth(this.menuId+":update")
  1121. let deleteFlag = this.isAuth(this.menuId+":delete")
  1122. let chooseFlag = this.isAuth(this.menuId+":choose")
  1123. //处理页面的权限数据
  1124. this.authSearch = !searchFlag
  1125. this.authSave = !saveFlag
  1126. this.authUpdate = !updateFlag
  1127. this.authDelete = !deleteFlag
  1128. this.authChoose = !chooseFlag
  1129. },
  1130. // Excel导入
  1131. importExcel () {
  1132. this.uploadDialogVisible = true
  1133. this.uploadFileName = ''
  1134. this.uploadFile = null
  1135. this.uploadBu = '' // 清空BU选择
  1136. // 清空el-upload组件的文件列表
  1137. if (this.$refs.uploadFile) {
  1138. this.$refs.uploadFile.clearFiles()
  1139. }
  1140. },
  1141. // 文件选择变化
  1142. handleFileChange (file) {
  1143. this.uploadFile = file.raw
  1144. this.uploadFileName = file.name
  1145. },
  1146. // 确认上传
  1147. confirmUpload () {
  1148. // 验证BU是否选择
  1149. if (!this.uploadBu || this.uploadBu === '') {
  1150. this.$message.warning('请先选择BU')
  1151. return
  1152. }
  1153. if (!this.uploadFile) {
  1154. this.$message.warning('请先选择文件')
  1155. return
  1156. }
  1157. const formData = new FormData()
  1158. formData.append('file', this.uploadFile)
  1159. formData.append('createBy', this.$store.state.user.name)
  1160. formData.append('site', this.uploadBu.split('_')[0]) // 从BU中提取site
  1161. formData.append('buNo', this.uploadBu.split('_')[1]) // 从BU中提取buNo
  1162. // 调用后端导入接口
  1163. uploadEamMaintenanceItemExcel(formData).then(({data}) => {
  1164. if (data.code === 0) {
  1165. this.$message.success(data.msg || '导入成功')
  1166. this.uploadDialogVisible = false
  1167. // 清空文件信息
  1168. this.uploadFileName = ''
  1169. this.uploadFile = null
  1170. this.uploadBu = ''
  1171. if (this.$refs.uploadFile) {
  1172. this.$refs.uploadFile.clearFiles()
  1173. }
  1174. this.getDataList()
  1175. } else {
  1176. this.$message.error(data.msg || '导入失败')
  1177. }
  1178. }).catch((error) => {
  1179. console.error('导入失败:', error)
  1180. const errorMsg = (error.response && error.response.data && error.response.data.msg) || error.message || '未知错误'
  1181. this.$message.error('导入失败: ' + errorMsg)
  1182. })
  1183. },
  1184. // 下载模板
  1185. downloadTemplate () {
  1186. const loading = this.$loading({
  1187. lock: true,
  1188. text: '正在下载模板...',
  1189. spinner: 'el-icon-loading',
  1190. background: 'rgba(0, 0, 0, 0.7)'
  1191. })
  1192. // 使用axios直接请求,设置responseType为arraybuffer
  1193. this.$http({
  1194. url: this.$http.adornUrl('/pms/eam/downloadEamMaintenanceItemTemplate'),
  1195. method: 'get',
  1196. responseType: 'arraybuffer' // 使用arraybuffer避免乱码
  1197. }).then(response => {
  1198. loading.close()
  1199. // 创建Blob对象,指定正确的MIME类型
  1200. const blob = new Blob([response.data], {
  1201. type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
  1202. })
  1203. // 验证Blob大小
  1204. if (blob.size === 0) {
  1205. this.$message.error('模板文件为空,请联系管理员')
  1206. return
  1207. }
  1208. // 创建下载链接
  1209. const url = window.URL.createObjectURL(blob)
  1210. const link = document.createElement('a')
  1211. link.href = url
  1212. link.download = '维保项目导入模板.xlsx'
  1213. link.style.display = 'none'
  1214. document.body.appendChild(link)
  1215. link.click()
  1216. document.body.removeChild(link)
  1217. // 释放URL对象
  1218. setTimeout(() => {
  1219. window.URL.revokeObjectURL(url)
  1220. }, 100)
  1221. this.$message.success('模板下载成功')
  1222. }).catch(error => {
  1223. loading.close()
  1224. console.error('模板下载失败:', error)
  1225. this.$message.error('模板下载失败:' + (error.message || '未知错误'))
  1226. })
  1227. },
  1228. // 关闭上传对话框时清空文件
  1229. handleUploadDialogClose () {
  1230. this.uploadFileName = ''
  1231. this.uploadFile = null
  1232. this.uploadBu = '' // 清空BU选择
  1233. if (this.$refs.uploadFile) {
  1234. this.$refs.uploadFile.clearFiles()
  1235. }
  1236. },
  1237. }
  1238. }
  1239. </script>
  1240. <style scoped lang="scss">
  1241. .el-table /deep/ .cell{
  1242. height: auto;
  1243. line-height: 1.5;
  1244. }
  1245. .simple-dialog >>> .el-dialog {
  1246. margin-top: 12vh !important;
  1247. max-height: 70vh;
  1248. border-radius: 8px;
  1249. }
  1250. .simple-dialog >>> .el-dialog__body {
  1251. padding: 20px 30px;
  1252. max-height: calc(70vh - 120px);
  1253. overflow-y: auto;
  1254. }
  1255. /* 上传拖拽区域大小调整 */
  1256. .upload-demo .el-upload-dragger {
  1257. width: 100%;
  1258. height: 150px;
  1259. display: flex;
  1260. flex-direction: column;
  1261. justify-content: center;
  1262. align-items: center;
  1263. }
  1264. .upload-demo .el-upload-dragger .el-icon-upload {
  1265. margin-bottom: 10px;
  1266. }
  1267. </style>