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.

2297 lines
74 KiB

4 years ago
4 years ago
4 years ago
4 years ago
1 year 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
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
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
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
1 year ago
4 years ago
1 year ago
1 year ago
4 years ago
1 year 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
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
  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.codeNo" clearable style="width: 120px"></el-input>
  16. </el-form-item>
  17. <el-form-item label="维保模板名称">
  18. <el-input v-model="searchData.codeDesc" clearable style="width: 200px"></el-input>
  19. </el-form-item>
  20. <el-form-item label="在用">
  21. <el-select v-model="searchData.active" style="width: 80px">
  22. <el-option label="全部" value=""></el-option>
  23. <el-option label="是" value="Y"></el-option>
  24. <el-option label="否" value="N"></el-option>
  25. </el-select>
  26. </el-form-item>
  27. <el-form-item label="是否被用">
  28. <el-select v-model="searchData.isUse" style="width: 80px">
  29. <el-option label="全部" value=""></el-option>
  30. <el-option label="是" value="Y"></el-option>
  31. <el-option label="否" value="N"></el-option>
  32. </el-select>
  33. </el-form-item>
  34. <el-form-item label="部门">
  35. <el-select v-model="searchData.checkType" clearable style="width: 80px">
  36. <el-option label="生产" value="R022"></el-option>
  37. <el-option label="设备" value="R023"></el-option>
  38. <el-option label="质量" value="R024"></el-option>
  39. </el-select>
  40. </el-form-item>
  41. <el-form-item label=" ">
  42. <el-button v-if="!authSearch" @click="getDataList()">查询</el-button>
  43. <el-button v-if="!authSave" type="primary" @click="addModal()">新增</el-button>
  44. <el-button type="primary" icon="el-icon-upload" @click="importExcel" style="margin-left: 2px">导入模板</el-button>
  45. <el-button type="primary" icon="el-icon-upload" @click="importItemExcel" style="margin-left: 2px">导入维保项目</el-button>
  46. <el-button @click="exportExcel()" type="primary" style="margin-left: 2px">{{'导出'}}</el-button>
  47. <el-button @click="exportDetailExcel()" type="primary" style="margin-left: 2px">{{'导出明细'}}</el-button>
  48. <!-- <download-excel-->
  49. <!-- :fields="fields()"-->
  50. <!-- :data="exportData"-->
  51. <!-- type="xls"-->
  52. <!-- :name="exportName"-->
  53. <!-- :header="exportHeader"-->
  54. <!-- :footer="exportFooter"-->
  55. <!-- :fetch="createExportData"-->
  56. <!-- :before-generate="startDownload"-->
  57. <!-- :before-finish="finishDownload"-->
  58. <!-- worksheet="导出信息"-->
  59. <!-- class="el-button el-button&#45;&#45;primary el-button&#45;&#45;medium">-->
  60. <!-- {{ "导出" }}-->
  61. <!-- </download-excel>-->
  62. </el-form-item>
  63. </el-form>
  64. <el-table
  65. :height="height"
  66. :data="dataList"
  67. border
  68. v-loading="dataListLoading"
  69. style="width: 100%;">
  70. <el-table-column
  71. v-for="(item,index) in columnList" :key="index"
  72. :sortable="item.columnSortable"
  73. :prop="item.columnProp"
  74. :header-align="item.headerAlign"
  75. :show-overflow-tooltip="item.showOverflowTooltip"
  76. :align="item.align"
  77. :fixed="item.fixed==''?false:item.fixed"
  78. :min-width="item.columnWidth"
  79. :label="item.columnLabel">
  80. <template slot-scope="scope">
  81. <span v-if="!item.columnHidden">
  82. <span v-if="columnsProp.includes(item.columnProp)">{{ scope.row[`${item.columnProp}Desc`] }}</span>
  83. <span v-else>
  84. {{ scope.row[item.columnProp] }}
  85. </span>
  86. </span>
  87. <span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
  88. </template>
  89. </el-table-column>
  90. <el-table-column
  91. fixed="right"
  92. header-align="center"
  93. align="center"
  94. width="160"
  95. label="操作">
  96. <template slot-scope="scope">
  97. <el-link style="cursor: pointer" v-if="!authUpdate" @click="updateModal(scope.row)">修改</el-link>
  98. <el-link style="cursor: pointer" @click="detailModal(scope.row)">维保项目</el-link>
  99. <el-link style="cursor: pointer" v-if="!authDelete" @click="deletePropertiesModel(scope.row)">删除</el-link>
  100. </template>
  101. </el-table-column>
  102. </el-table>
  103. <el-pagination
  104. @size-change="sizeChangeHandle"
  105. @current-change="currentChangeHandle"
  106. :current-page="pageIndex"
  107. :page-sizes="[20, 50, 100, 200, 500]"
  108. :page-size="pageSize"
  109. :total="totalPage"
  110. layout="total, sizes, prev, pager, next, jumper">
  111. </el-pagination>
  112. <el-dialog title="维保模板" :close-on-click-modal="false" v-drag :visible.sync="modalFlag" width="460px">
  113. <el-form :inline="true" label-position="top" :model="modalData" :rules="rules" style="margin-left: 7px;margin-top: -5px;">
  114. <el-form-item label="BU" prop="bu" :rules="rules.bu">
  115. <el-select v-model="modalData.bu" placeholder="请选择" :disabled="modalDisableFlag" style="width: 230px">
  116. <el-option
  117. v-for = "i in userBuList"
  118. :key = "i.buNo"
  119. :label = "i.sitename"
  120. :value = "i.buNo">
  121. <span style="float: left;width: 100px">{{ i.sitename }}</span>
  122. <span style="float: right; color: #8492a6;white-space:nowrap;overflow:hidden;text-overflow:ellipsis; font-size: 11px;width: 60px">
  123. {{ i.buDesc }}
  124. </span>
  125. </el-option>
  126. </el-select>
  127. </el-form-item>
  128. <el-form-item label="部门" prop="checkType">
  129. <el-select v-model="modalData.checkType" :disabled="modalDisableFlag" style="width: 80px">
  130. <el-option label="生产" value="R022"></el-option>
  131. <el-option label="设备" value="R023"></el-option>
  132. <el-option label="质量" value="R024"></el-option>
  133. </el-select>
  134. </el-form-item>
  135. <el-form-item label="是否在用" prop="active" :rules="rules.activeType">
  136. <el-select filterable v-model="modalData.active" style="width: 80px">
  137. <el-option label="是" value="Y"></el-option>
  138. <el-option label="否" value="N"></el-option>
  139. </el-select>
  140. </el-form-item>
  141. </el-form>
  142. <el-form :inline="true" label-position="top" :model="modalData" :rules="rules" style="margin-left: 7px;">
  143. <el-form-item label="维保模板编码" prop="codeNo" :rules="rules.codeNoType">
  144. <el-input v-model="modalData.codeNo" :disabled="modalDisableFlag" style="width: 140px"></el-input>
  145. </el-form-item>
  146. <el-form-item label="维保模板名称" prop="codeDesc" :rules="rules.codeDescType">
  147. <el-input v-model="modalData.codeDesc" style="width: 264px"></el-input>
  148. </el-form-item>
  149. </el-form>
  150. <el-footer style="height:40px;margin-top: 10px;text-align:center">
  151. <el-button type="primary" @click="saveData()">保存</el-button>
  152. <el-button type="primary" @click="modalFlag = false">关闭</el-button>
  153. </el-footer>
  154. </el-dialog>
  155. <el-dialog title="维保项目清单" :close-on-click-modal="false" v-drag :visible.sync="detailModelFlag" width="987px">
  156. <el-form :inline="true" label-position="top">
  157. <el-form-item label="维保模板编码">
  158. <el-input v-model="detailData.codeNo" readonly style="width: 120px"></el-input>
  159. </el-form-item>
  160. <el-form-item label="维保模板名称">
  161. <el-input v-model="detailData.codeDesc" readonly style="width: 120px"></el-input>
  162. </el-form-item>
  163. <el-form-item label=" ">
  164. <el-button type="primary" @click="addFastModal()">新增</el-button>
  165. <el-button type="primary" @click="goUp()">上移</el-button>
  166. <el-button type="primary" @click="goDown()">下移</el-button>
  167. </el-form-item>
  168. </el-form>
  169. <el-table
  170. :height="300"
  171. :data="detailList"
  172. border
  173. @row-click="itemClickRow"
  174. v-loading="dataListLoading"
  175. ref="detailTable"
  176. highlight-current-row
  177. style="width: 100%;">
  178. <el-table-column
  179. v-for="(item,index) in columnDetailList" :key="index"
  180. :sortable="item.columnSortable"
  181. :prop="item.columnProp"
  182. :header-align="item.headerAlign"
  183. :show-overflow-tooltip="item.showOverflowTooltip"
  184. :align="item.align"
  185. :fixed="item.fixed==''?false:item.fixed"
  186. :min-width="item.columnWidth"
  187. :label="item.columnLabel">
  188. <template slot-scope="scope">
  189. <span v-if="!item.columnHidden"> {{ scope.row[item.columnProp] }}</span>
  190. <span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
  191. </template>
  192. </el-table-column>
  193. <el-table-column
  194. fixed="right"
  195. header-align="center"
  196. align="center"
  197. width="130"
  198. label="操作">
  199. <template slot-scope="scope">
  200. <el-link style="cursor: pointer" v-if="scope.row.valueChooseFlag === 'Y'" @click="chooseModal(scope.row)">可选值</el-link>
  201. <el-link style="cursor: pointer" @click="deleteModalDetails(scope.row)">删除项目</el-link>
  202. </template>
  203. </el-table-column>
  204. </el-table>
  205. <el-footer style="height:40px;margin-top: 20px;text-align:center">
  206. <el-button type="primary" @click="detailModelFlag = false">关闭</el-button>
  207. </el-footer>
  208. </el-dialog>
  209. <el-dialog title="添加项目" :close-on-click-modal="false" v-drag :visible.sync="addDetailModalFlag" width="300px">
  210. <el-form :inline="true" label-position="top" style="margin-left: 7px;margin-top: -5px;">
  211. <el-form-item >
  212. <span slot="label" style="" @click="getBaseList(1025)"><a herf="#">维保项目编码</a></span>
  213. <el-input v-model="detailData.itemNo" @blur="itemNoBlur" style="width: 120px"></el-input>
  214. </el-form-item>
  215. <el-form-item label="维保项目名称:">
  216. <el-input v-model="detailData.itemDesc" disabled style="width: 120px"></el-input>
  217. </el-form-item>
  218. </el-form>
  219. <el-footer style="height:40px;margin-top: 10px;text-align:center">
  220. <el-button type="primary" @click="saveModalDetails()">保存</el-button>
  221. <el-button type="primary" @click="addDetailModalFlag = false">关闭</el-button>
  222. </el-footer>
  223. </el-dialog>
  224. <el-dialog title="快速添加" @close="refreshDetailList" :close-on-click-modal="false" v-drag :visible.sync="fastAddFlag" width="1200px">
  225. <div style="font-size: 12px">
  226. <!-- 维保模板编码<el-input v-model="detailData.codeNo" readonly style="width: 120px"></el-input>-->
  227. <!-- 维保模板名称<el-input v-model="detailData.codeDesc" readonly style="width: 120px"></el-input>-->
  228. <el-form :inline="true" label-position="top" :model="detailData">
  229. <el-form-item :label="'项目编码'">
  230. <el-input v-model="detailData.itemNo" style="width: 120px"></el-input>
  231. </el-form-item>
  232. <el-form-item :label="'项目名称'">
  233. <el-input v-model="detailData.itemDesc" style="width: 120px"></el-input>
  234. </el-form-item>
  235. <el-form-item :label="' '">
  236. <el-button type="primary" @click="queryTemplateItem()">查询</el-button>
  237. </el-form-item>
  238. </el-form>
  239. </div>
  240. <el-container style="margin-top: 0px;">
  241. <el-main style="width: 450px;padding: 1px">
  242. <span style="font-size: 12px" >可选项目</span>
  243. <el-table
  244. height="400px"
  245. :data="itemList1"
  246. border
  247. ref="itemTable1"
  248. @row-click="itemClickRow1"
  249. @selection-change="selectionItem1"
  250. highlight-current-row
  251. v-loading="dataListLoading"
  252. style="width: 100%">
  253. <el-table-column
  254. type="selection"
  255. header-align="center"
  256. align="center"
  257. width="50">
  258. </el-table-column>
  259. <el-table-column
  260. prop="itemNo"
  261. header-align="center"
  262. align="center"
  263. min-width="64"
  264. label="项目编码">
  265. </el-table-column>
  266. <el-table-column
  267. prop="itemDesc"
  268. header-align="center"
  269. align="left"
  270. min-width="95"
  271. label="项目名称">
  272. </el-table-column>
  273. <el-table-column
  274. prop="itemRemark"
  275. header-align="center"
  276. align="left"
  277. min-width="311"
  278. label="方法说明">
  279. </el-table-column>
  280. </el-table>
  281. </el-main>
  282. <el-main style="width: 10px;padding: 1px">
  283. <div style="margin-top: 200px;margin-left: 18px">
  284. <el-button type="primary" @click="addItem()">添加>></el-button>
  285. </div>
  286. <div style="margin-top: 15px;margin-left: 18px">
  287. <el-button type="primary" @click="deleteItem()">删除<<</el-button>
  288. </div>
  289. </el-main>
  290. <el-main style="width: 450px;padding: 1px">
  291. <span style="font-size: 12px" >已有项目</span>
  292. <el-table
  293. height="400px"
  294. :data="itemList2"
  295. border
  296. ref="itemTable2"
  297. @row-click="itemClickRow2"
  298. @selection-change="selectionItem2"
  299. highlight-current-row
  300. v-loading="dataListLoading"
  301. style="width: 100%">
  302. <el-table-column
  303. type="selection"
  304. header-align="center"
  305. align="center"
  306. width="50">
  307. </el-table-column>
  308. <el-table-column
  309. prop="itemNo"
  310. header-align="center"
  311. align="center"
  312. min-width="64"
  313. label="项目编码">
  314. </el-table-column>
  315. <el-table-column
  316. prop="itemDesc"
  317. header-align="center"
  318. align="left"
  319. min-width="95"
  320. label="项目名称">
  321. </el-table-column>
  322. <el-table-column
  323. prop="itemRemark"
  324. header-align="center"
  325. align="left"
  326. min-width="311"
  327. label="方法说明">
  328. </el-table-column>
  329. </el-table>
  330. </el-main>
  331. </el-container>
  332. <el-footer style="height:40px;margin-top: 20px;text-align:center">
  333. <el-button type="primary" @click="fastAddFlag = false">关闭</el-button>
  334. </el-footer>
  335. </el-dialog>
  336. <el-dialog title="可选值" :close-on-click-modal="false" v-drag :visible.sync="chooseModalFlag" width="350px">
  337. <el-form :inline="true" label-position="top" style="margin-left: 7px;margin-top: -5px;">
  338. <el-form-item label="维保项目名称">
  339. <el-input v-model="chooseModalData.itemDesc" disabled style="width: 120px"></el-input>
  340. </el-form-item>
  341. <el-form-item :label="'检测值类型'">
  342. <el-select filterable v-model="chooseModalData.valueTypeDb" disabled style="width: 120px">
  343. <el-option label="文本" value="T"></el-option>
  344. <el-option label="数字" value="N"></el-option>
  345. </el-select>
  346. </el-form-item>
  347. </el-form>
  348. <el-table
  349. :height="300"
  350. :data="chooseTableData"
  351. border
  352. style="width: 100%">
  353. <el-table-column
  354. prop="availableValue"
  355. header-align="center"
  356. align="center"
  357. min-width="200"
  358. label="属性值">
  359. </el-table-column>
  360. </el-table>
  361. <el-footer style="height:40px;margin-top: 10px;text-align:center">
  362. <el-button type="primary" @click="chooseModalFlag = false">关闭</el-button>
  363. </el-footer>
  364. </el-dialog>
  365. <Chooselist ref="baseList" @getBaseData="getBaseData"></Chooselist>
  366. <!-- 导入对话框 -->
  367. <template>
  368. <el-dialog
  369. title="维保模板数据导入"
  370. :close-on-click-modal="false"
  371. :visible.sync="uploadDialogVisible"
  372. width="400px"
  373. top="12vh"
  374. class="simple-dialog"
  375. @close="handleUploadDialogClose"
  376. >
  377. <div style="margin-bottom: 8px;">
  378. <el-button type="primary" @click="downloadTemplate" size="medium" style="width: 40%;">
  379. <i class="el-icon-download"></i> 下载文件模板
  380. </el-button>
  381. </div>
  382. <!-- BU选择 -->
  383. <div style="margin-bottom: 15px;">
  384. <el-form :inline="true" label-position="top" label-width="80px">
  385. <el-form-item label="BU">
  386. <el-select v-model="uploadBu" placeholder="请选择" style="width: 295px">
  387. <el-option
  388. v-for="i in userBuList"
  389. :key="i.buNo"
  390. :label="i.sitename"
  391. :value="i.buNo">
  392. <span style="float: left;width: 100px">{{ i.sitename }}</span>
  393. <span style="float: right; color: #8492a6;white-space:nowrap;overflow:hidden;text-overflow:ellipsis; font-size: 11px;">
  394. {{ i.buDesc }}
  395. </span>
  396. </el-option>
  397. </el-select>
  398. </el-form-item>
  399. </el-form>
  400. </div>
  401. <!-- 文件上传 -->
  402. <div>
  403. <el-upload
  404. class="upload-demo"
  405. drag
  406. action="javascript:void(0);"
  407. ref="uploadFile"
  408. :on-change="handleFileChange"
  409. :auto-upload="false"
  410. :limit="1"
  411. accept=".xlsx,.xls"
  412. style="width: 100%;"
  413. >
  414. <i class="el-icon-upload"></i>
  415. <div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
  416. </el-upload>
  417. </div>
  418. <!-- 底部 -->
  419. <span slot="footer" class="dialog-footer">
  420. <el-button type="primary" @click="confirmUpload" size="medium" :disabled="uploadSubmitting">保存</el-button>
  421. <el-button @click="uploadDialogVisible = false" size="medium" :disabled="uploadSubmitting">关闭</el-button>
  422. </span>
  423. </el-dialog>
  424. </template>
  425. <!-- 导入维保项目对话框 -->
  426. <template>
  427. <el-dialog
  428. title="维保项目清单导入"
  429. :close-on-click-modal="false"
  430. :visible.sync="uploadItemDialogVisible"
  431. width="400px"
  432. top="12vh"
  433. class="simple-dialog"
  434. @close="handleUploadItemDialogClose"
  435. >
  436. <div class="download-area">
  437. <el-button type="primary" @click="downloadItemTemplate" size="medium" style="width: 40%;">
  438. <i class="el-icon-download"></i> 下载文件模板
  439. </el-button>
  440. </div>
  441. <!-- 文件上传 -->
  442. <div>
  443. <el-upload
  444. class="upload-demo"
  445. drag
  446. action="javascript:void(0);"
  447. ref="uploadItemFile"
  448. :on-change="handleItemFileChange"
  449. :auto-upload="false"
  450. :limit="1"
  451. accept=".xlsx,.xls"
  452. >
  453. <i class="el-icon-upload"></i>
  454. <div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
  455. </el-upload>
  456. </div>
  457. <!-- 底部 -->
  458. <span slot="footer" class="dialog-footer">
  459. <el-button type="primary" @click="confirmItemUpload" size="medium" :disabled="uploadItemSubmitting">保存</el-button>
  460. <el-button @click="uploadItemDialogVisible = false" size="medium" :disabled="uploadItemSubmitting">关闭</el-button>
  461. </span>
  462. </el-dialog>
  463. </template>
  464. </div>
  465. </template>
  466. <script>
  467. import {
  468. eamPropertiesModelSearch,
  469. eamPropertiesModelSave,
  470. eamPropertiesModelEdit,
  471. eamPropertiesModelDelete,
  472. searchItemAvailable,
  473. searchModalDetails,
  474. saveModalDetails,
  475. deleteModalDetails, // 项目多选删除
  476. eamPropertiesItemSearch,
  477. getItemLists,
  478. deleteModalDetail, // 项目单删
  479. getSiteAndBuByUserName,
  480. getRoleByUserName,
  481. goUpItemEam,
  482. goDownItemEam,
  483. uploadEamMaintenanceModelExcel, // 导入维保模板Excel
  484. downloadEamMaintenanceModelTemplate, // 下载维保模板导入模板
  485. uploadEamMaintenanceItemDetailExcel, // 导入维保项目清单Excel
  486. downloadEamMaintenanceItemDetailTemplate // 下载维保项目清单导入模板
  487. } from "@/api/eam/eam.js"
  488. import {getTableDefaultListLanguage, getTableUserListLanguage} from "@/api/table.js"
  489. import Chooselist from '@/views/modules/common/Chooselist_eam'
  490. import {userFavoriteList, saveUserFavorite, removeUserFavorite} from '@/api/userFavorite.js'
  491. import excel from "@/utils/excel-util.js";
  492. export default {
  493. components: {
  494. Chooselist
  495. },
  496. watch: {
  497. searchData: {
  498. deep: true,
  499. handler: function (newV, oldV) {
  500. this.searchData.codeNo = this.searchData.codeNo.toUpperCase()
  501. }
  502. },
  503. itemData: {
  504. deep: true,
  505. handler: function (newV, oldV) {
  506. this.itemData.itemNo = this.itemData.itemNo.toUpperCase()
  507. }
  508. },
  509. modalData: {
  510. deep: true,
  511. handler: function (newV, oldV) {
  512. this.modalData.codeNo = this.modalData.codeNo.toUpperCase()
  513. }
  514. },
  515. detailData: {
  516. deep: true,
  517. handler: function (newV, oldV) {
  518. this.detailData.codeNo = this.detailData.codeNo.toUpperCase()
  519. this.detailData.itemNo = this.detailData.itemNo.toUpperCase()
  520. }
  521. }
  522. },
  523. data () {
  524. return {
  525. columnsProp:['createdBy','active','updateBy'],
  526. // 是否收藏
  527. favorite: false,
  528. // 导出 start
  529. exportData: [],
  530. exportName: "维保模板" + this.dayjs().format('YYYYMMDDHHmmss'),
  531. exportHeader: ["维保模板"],
  532. exportFooter: [],
  533. exportList: [],
  534. // 导出 end
  535. tagNo: '',
  536. searchData: {
  537. site: '',
  538. userName: this.$store.state.user.name,
  539. codeNo: '',
  540. codeDesc: '',
  541. active: 'Y',
  542. functionType: 'B',
  543. isUse: '',
  544. checkType: '',
  545. page: 1,
  546. limit: 10,
  547. },
  548. height: 200,
  549. pageIndex: 1,
  550. pageSize: 20,
  551. totalPage: 0,
  552. addDetailModalFlag: false,
  553. modalFlag: false,
  554. modalDisableFlag: false,
  555. modalData: {
  556. flag: '',
  557. bu: '',
  558. codeNo: '',
  559. codeDesc: '',
  560. active: '',
  561. functionType: 'B',
  562. createdBy: this.$store.state.user.name,
  563. updateBy: this.$store.state.user.name,
  564. userId: this.$store.state.user.name,
  565. checkType: ''
  566. },
  567. detailData: {
  568. site: '',
  569. buNo: '',
  570. codeNo: '',
  571. codeDesc: '',
  572. functionType: 'B',
  573. itemNo: '',
  574. itemDesc: '',
  575. itemType: 'B',
  576. userId: this.$store.state.user.name,
  577. checkType: ''
  578. },
  579. columnList: [
  580. {
  581. userId: this.$store.state.user.name,
  582. functionId: 101003002,
  583. serialNumber: '101003002Table1BuDesc',
  584. tableId: "101003002Table1",
  585. tableName: "维保模板表",
  586. columnProp: 'buDesc',
  587. headerAlign: "center",
  588. align: "center",
  589. columnLabel: 'BU',
  590. columnHidden: false,
  591. columnImage: false,
  592. columnSortable: false,
  593. sortLv: 0,
  594. status: true,
  595. fixed: '',
  596. columnWidth: 100,
  597. },
  598. {
  599. userId: this.$store.state.user.name,
  600. functionId: 101003002,
  601. serialNumber: '101003002Table1CodeNo',
  602. tableId: "101003002Table1",
  603. tableName: "维保模板表",
  604. columnProp: 'codeNo',
  605. headerAlign: "center",
  606. align: "center",
  607. columnLabel: '维保模板编码',
  608. columnHidden: false,
  609. columnImage: false,
  610. columnSortable: false,
  611. sortLv: 0,
  612. status: true,
  613. fixed: '',
  614. columnWidth: 120,
  615. },
  616. {
  617. userId: this.$store.state.user.name,
  618. functionId: 101003002,
  619. serialNumber: '101003002Table1CodeDesc',
  620. tableId: "101003002Table1",
  621. tableName: "维保模板表",
  622. columnProp: 'codeDesc',
  623. headerAlign: "center",
  624. align: "left",
  625. columnLabel: '维保模板名称',
  626. columnHidden: false,
  627. columnImage: false,
  628. columnSortable: false,
  629. sortLv: 0,
  630. status: true,
  631. fixed: '',
  632. columnWidth: 200,
  633. },
  634. {
  635. userId: this.$store.state.user.name,
  636. functionId: 101003002,
  637. serialNumber: '101003002Table1Active',
  638. tableId: "101003002Table1",
  639. tableName: "维保模板表",
  640. columnProp: 'active',
  641. headerAlign: "center",
  642. align: "center",
  643. columnLabel: '在用',
  644. columnHidden: false,
  645. columnImage: false,
  646. columnSortable: false,
  647. sortLv: 0,
  648. status: true,
  649. fixed: '',
  650. columnWidth: 100,
  651. },
  652. {
  653. userId: this.$store.state.user.name,
  654. functionId: 101003002,
  655. serialNumber: '101003002Table1IsUse',
  656. tableId: "101003002Table1",
  657. tableName: "维保模板表",
  658. columnProp: 'isUse',
  659. headerAlign: "center",
  660. align: "center",
  661. columnLabel: '是否被用',
  662. columnHidden: false,
  663. columnImage: false,
  664. columnSortable: false,
  665. sortLv: 0,
  666. status: true,
  667. fixed: '',
  668. columnWidth: 100,
  669. },
  670. {
  671. userId: this.$store.state.user.name,
  672. functionId: 101003002,
  673. serialNumber: '101003002Table1CreatedDate',
  674. tableId: "101003002Table1",
  675. tableName: "维保模板表",
  676. columnProp: 'createdDate',
  677. headerAlign: "center",
  678. align: "center",
  679. columnLabel: '创建时间',
  680. columnHidden: false,
  681. columnImage: false,
  682. columnSortable: false,
  683. sortLv: 0,
  684. status: true,
  685. fixed: '',
  686. columnWidth: 170,
  687. },
  688. {
  689. userId: this.$store.state.user.name,
  690. functionId: 101003002,
  691. serialNumber: '101003002Table1CreatedBy',
  692. tableId: "101003002Table1",
  693. tableName: "维保模板表",
  694. columnProp: 'createdBy',
  695. headerAlign: "center",
  696. align: "center",
  697. columnLabel: '创建人',
  698. columnHidden: false,
  699. columnImage: false,
  700. columnSortable: false,
  701. sortLv: 0,
  702. status: true,
  703. fixed: '',
  704. columnWidth: 100,
  705. },
  706. {
  707. userId: this.$store.state.user.name,
  708. functionId: 101003002,
  709. serialNumber: '101003002Table1UpdateDate',
  710. tableId: "101003002Table1",
  711. tableName: "维保模板表",
  712. columnProp: 'updateDate',
  713. headerAlign: "center",
  714. align: "center",
  715. columnLabel: '更新时间',
  716. columnHidden: false,
  717. columnImage: false,
  718. columnSortable: false,
  719. sortLv: 0,
  720. status: true,
  721. fixed: '',
  722. columnWidth: 170,
  723. },
  724. {
  725. userId: this.$store.state.user.name,
  726. functionId: 101003002,
  727. serialNumber: '101003002Table1UpdateBy',
  728. tableId: "101003002Table1",
  729. tableName: "维保模板表",
  730. columnProp: 'updateBy',
  731. headerAlign: "center",
  732. align: "center",
  733. columnLabel: '更新人',
  734. columnHidden: false,
  735. columnImage: false,
  736. columnSortable: false,
  737. sortLv: 0,
  738. status: true,
  739. fixed: '',
  740. columnWidth: 100,
  741. },
  742. ],
  743. detailModelFlag: false,
  744. detailList: [],
  745. chooseTable1Data: [],
  746. dataListLoading: false,
  747. dataListSelections: [],
  748. chooseModalFlag: false,
  749. itemFlag: 'text',
  750. itemData: {
  751. itemNo: '',
  752. valueNo: '',
  753. availableValue: '',
  754. itemType: 'B',
  755. createdBy: this.$store.state.user.name
  756. },
  757. dataList: [],
  758. departmentList: [],
  759. // 展示列集
  760. columnDetailList: [
  761. {
  762. userId: this.$store.state.user.name,
  763. functionId: 101003002,
  764. serialNumber: '101003002Table2ItemNo',
  765. tableId: "101003002Table2",
  766. tableName: "维保项目表",
  767. columnProp: 'itemNo',
  768. headerAlign: "center",
  769. align: "left",
  770. columnLabel: '维保项目编码',
  771. columnHidden: false,
  772. columnImage: false,
  773. columnSortable: false,
  774. sortLv: 0,
  775. status: true,
  776. fixed: '',
  777. columnWidth: 82,
  778. },
  779. {
  780. userId: this.$store.state.user.name,
  781. functionId: 101003002,
  782. serialNumber: '101003002Table2ItemDesc',
  783. tableId: "101003002Table2",
  784. tableName: "维保项目表",
  785. columnProp: 'itemDesc',
  786. headerAlign: "center",
  787. align: "left",
  788. columnLabel: '维保项目名称',
  789. columnHidden: false,
  790. columnImage: false,
  791. columnSortable: false,
  792. sortLv: 0,
  793. status: true,
  794. fixed: '',
  795. columnWidth:106,
  796. },
  797. {
  798. userId: this.$store.state.user.name,
  799. functionId: 101003002,
  800. serialNumber: '101003002Table2ItemRemark',
  801. tableId: "101003002Table2",
  802. tableName: "维保项目表",
  803. columnProp: 'itemRemark',
  804. headerAlign: "center",
  805. align: "left",
  806. columnLabel: '维保方法说明',
  807. columnHidden: false,
  808. columnImage: false,
  809. columnSortable: false,
  810. sortLv: 0,
  811. status: true,
  812. fixed: '',
  813. columnWidth: 298,
  814. },
  815. {
  816. userId: this.$store.state.user.name,
  817. functionId: 101003002,
  818. serialNumber: '101003002Table2ValueType',
  819. tableId: "101003002Table2",
  820. tableName: "维保项目表",
  821. columnProp: 'valueType',
  822. headerAlign: "center",
  823. align: "center",
  824. columnLabel: '检测值类型',
  825. columnHidden: false,
  826. columnImage: false,
  827. columnSortable: false,
  828. sortLv: 0,
  829. status: true,
  830. fixed: '',
  831. columnWidth: 70,
  832. },
  833. {
  834. userId: this.$store.state.user.name,
  835. functionId: 101003002,
  836. serialNumber: '101003002Table2DefaultValue',
  837. tableId: "101003002Table2",
  838. tableName: "维保项目表",
  839. columnProp: 'defaultValue',
  840. headerAlign: "center",
  841. align: "right",
  842. columnLabel: '参照值',
  843. columnHidden: false,
  844. columnImage: false,
  845. columnSortable: false,
  846. sortLv: 0,
  847. status: true,
  848. fixed: '',
  849. columnWidth: 65,
  850. },
  851. {
  852. userId: this.$store.state.user.name,
  853. functionId: 101003002,
  854. serialNumber: '101003002Table2MaxValue',
  855. tableId: "101003002Table2",
  856. tableName: "维保项目表",
  857. columnProp: 'maxValue',
  858. headerAlign: "center",
  859. align: "right",
  860. columnLabel: '最大值',
  861. columnHidden: false,
  862. columnImage: false,
  863. columnSortable: false,
  864. sortLv: 0,
  865. status: true,
  866. fixed: '',
  867. columnWidth: 65,
  868. },
  869. {
  870. userId: this.$store.state.user.name,
  871. functionId: 101003002,
  872. serialNumber: '101003002Table2MinValue',
  873. tableId: "101003002Table2",
  874. tableName: "维保项目表",
  875. columnProp: 'minValue',
  876. headerAlign: "center",
  877. align: "right",
  878. columnLabel: '最小值',
  879. columnHidden: false,
  880. columnImage: false,
  881. columnSortable: false,
  882. sortLv: 0,
  883. status: true,
  884. fixed: '',
  885. columnWidth: 65,
  886. },
  887. {
  888. userId: this.$store.state.user.name,
  889. functionId: 101003002,
  890. serialNumber: '101003002Table2ValueChooseFlag',
  891. tableId: "101003002Table2",
  892. tableName: "维保项目表",
  893. columnProp: 'valueChooseFlag',
  894. headerAlign: "center",
  895. align: "center",
  896. columnLabel: '是否值可选',
  897. columnHidden: false,
  898. columnImage: false,
  899. columnSortable: false,
  900. sortLv: 0,
  901. status: true,
  902. fixed: '',
  903. columnWidth: 70,
  904. },
  905. ],
  906. columnExport: [
  907. {
  908. userId: this.$store.state.user.name,
  909. functionId: 101003002,
  910. serialNumber: '101003002Table1BuDesc',
  911. tableId: "101003002Table1",
  912. tableName: "维保模板表",
  913. columnProp: 'buDesc',
  914. headerAlign: "center",
  915. align: "center",
  916. columnLabel: 'BU',
  917. columnHidden: false,
  918. columnImage: false,
  919. columnSortable: false,
  920. sortLv: 0,
  921. status: true,
  922. fixed: '',
  923. columnWidth: 100,
  924. },
  925. {
  926. userId: this.$store.state.user.name,
  927. functionId: 101003002,
  928. serialNumber: '101003002Table1CodeNo',
  929. tableId: "101003002Table1",
  930. tableName: "维保模板表",
  931. columnProp: 'codeNo',
  932. headerAlign: "center",
  933. align: "center",
  934. columnLabel: '维保模板编码',
  935. columnHidden: false,
  936. columnImage: false,
  937. columnSortable: false,
  938. sortLv: 0,
  939. status: true,
  940. fixed: '',
  941. columnWidth: 120,
  942. },
  943. {
  944. userId: this.$store.state.user.name,
  945. functionId: 101003002,
  946. serialNumber: '101003002Table1CodeDesc',
  947. tableId: "101003002Table1",
  948. tableName: "维保模板表",
  949. columnProp: 'codeDesc',
  950. headerAlign: "center",
  951. align: "left",
  952. columnLabel: '维保模板名称',
  953. columnHidden: false,
  954. columnImage: false,
  955. columnSortable: false,
  956. sortLv: 0,
  957. status: true,
  958. fixed: '',
  959. columnWidth: 200,
  960. },
  961. {
  962. userId: this.$store.state.user.name,
  963. functionId: 101003002,
  964. serialNumber: '101003002Table1Active',
  965. tableId: "101003002Table1",
  966. tableName: "维保模板表",
  967. columnProp: 'active',
  968. headerAlign: "center",
  969. align: "center",
  970. columnLabel: '在用',
  971. columnHidden: false,
  972. columnImage: false,
  973. columnSortable: false,
  974. sortLv: 0,
  975. status: true,
  976. fixed: '',
  977. columnWidth: 100,
  978. },
  979. {
  980. userId: this.$store.state.user.name,
  981. functionId: 101003002,
  982. serialNumber: '101003002Table1IsUse',
  983. tableId: "101003002Table1",
  984. tableName: "维保模板表",
  985. columnProp: 'isUse',
  986. headerAlign: "center",
  987. align: "center",
  988. columnLabel: '是否被用',
  989. columnHidden: false,
  990. columnImage: false,
  991. columnSortable: false,
  992. sortLv: 0,
  993. status: true,
  994. fixed: '',
  995. columnWidth: 100,
  996. },
  997. {
  998. userId: this.$store.state.user.name,
  999. functionId: 101003002,
  1000. serialNumber: '101003002Table1CreatedDate',
  1001. tableId: "101003002Table1",
  1002. tableName: "维保模板表",
  1003. columnProp: 'createdDate',
  1004. headerAlign: "center",
  1005. align: "center",
  1006. columnLabel: '创建时间',
  1007. columnHidden: false,
  1008. columnImage: false,
  1009. columnSortable: false,
  1010. sortLv: 0,
  1011. status: true,
  1012. fixed: '',
  1013. columnWidth: 170,
  1014. },
  1015. {
  1016. userId: this.$store.state.user.name,
  1017. functionId: 101003002,
  1018. serialNumber: '101003002Table1CreatedBy',
  1019. tableId: "101003002Table1",
  1020. tableName: "维保模板表",
  1021. columnProp: 'createdBy',
  1022. headerAlign: "center",
  1023. align: "center",
  1024. columnLabel: '创建人',
  1025. columnHidden: false,
  1026. columnImage: false,
  1027. columnSortable: false,
  1028. sortLv: 0,
  1029. status: true,
  1030. fixed: '',
  1031. columnWidth: 100,
  1032. },
  1033. {
  1034. userId: this.$store.state.user.name,
  1035. functionId: 101003002,
  1036. serialNumber: '101003002Table1UpdateDate',
  1037. tableId: "101003002Table1",
  1038. tableName: "维保模板表",
  1039. columnProp: 'updateDate',
  1040. headerAlign: "center",
  1041. align: "center",
  1042. columnLabel: '更新时间',
  1043. columnHidden: false,
  1044. columnImage: false,
  1045. columnSortable: false,
  1046. sortLv: 0,
  1047. status: true,
  1048. fixed: '',
  1049. columnWidth: 170,
  1050. },
  1051. {
  1052. userId: this.$store.state.user.name,
  1053. functionId: 101003002,
  1054. serialNumber: '101003002Table1UpdateBy',
  1055. tableId: "101003002Table1",
  1056. tableName: "维保模板表",
  1057. columnProp: 'updateBy',
  1058. headerAlign: "center",
  1059. align: "center",
  1060. columnLabel: '更新人',
  1061. columnHidden: false,
  1062. columnImage: false,
  1063. columnSortable: false,
  1064. sortLv: 0,
  1065. status: true,
  1066. fixed: '',
  1067. columnWidth: 100,
  1068. },
  1069. {
  1070. userId: this.$store.state.user.name,
  1071. functionId: 101003002,
  1072. serialNumber: '101003002Table2ItemNo',
  1073. tableId: "101003002Table2",
  1074. tableName: "维保项目表",
  1075. columnProp: 'itemNo',
  1076. headerAlign: "center",
  1077. align: "left",
  1078. columnLabel: '维保项目编码',
  1079. columnHidden: false,
  1080. columnImage: false,
  1081. columnSortable: false,
  1082. sortLv: 0,
  1083. status: true,
  1084. fixed: '',
  1085. columnWidth: 82,
  1086. },
  1087. {
  1088. userId: this.$store.state.user.name,
  1089. functionId: 101003002,
  1090. serialNumber: '101003002Table2ItemDesc',
  1091. tableId: "101003002Table2",
  1092. tableName: "维保项目表",
  1093. columnProp: 'itemDesc',
  1094. headerAlign: "center",
  1095. align: "left",
  1096. columnLabel: '维保项目名称',
  1097. columnHidden: false,
  1098. columnImage: false,
  1099. columnSortable: false,
  1100. sortLv: 0,
  1101. status: true,
  1102. fixed: '',
  1103. columnWidth:106,
  1104. },
  1105. {
  1106. userId: this.$store.state.user.name,
  1107. functionId: 101003002,
  1108. serialNumber: '101003002Table2ItemRemark',
  1109. tableId: "101003002Table2",
  1110. tableName: "维保项目表",
  1111. columnProp: 'itemRemark',
  1112. headerAlign: "center",
  1113. align: "left",
  1114. columnLabel: '维保方法说明',
  1115. columnHidden: false,
  1116. columnImage: false,
  1117. columnSortable: false,
  1118. sortLv: 0,
  1119. status: true,
  1120. fixed: '',
  1121. columnWidth: 298,
  1122. },
  1123. {
  1124. userId: this.$store.state.user.name,
  1125. functionId: 101003002,
  1126. serialNumber: '101003002Table2ValueType',
  1127. tableId: "101003002Table2",
  1128. tableName: "维保项目表",
  1129. columnProp: 'valueType',
  1130. headerAlign: "center",
  1131. align: "center",
  1132. columnLabel: '检测值类型',
  1133. columnHidden: false,
  1134. columnImage: false,
  1135. columnSortable: false,
  1136. sortLv: 0,
  1137. status: true,
  1138. fixed: '',
  1139. columnWidth: 70,
  1140. },
  1141. {
  1142. userId: this.$store.state.user.name,
  1143. functionId: 101003002,
  1144. serialNumber: '101003002Table2DefaultValue',
  1145. tableId: "101003002Table2",
  1146. tableName: "维保项目表",
  1147. columnProp: 'defaultValue',
  1148. headerAlign: "center",
  1149. align: "right",
  1150. columnLabel: '参照值',
  1151. columnHidden: false,
  1152. columnImage: false,
  1153. columnSortable: false,
  1154. sortLv: 0,
  1155. status: true,
  1156. fixed: '',
  1157. columnWidth: 65,
  1158. },
  1159. {
  1160. userId: this.$store.state.user.name,
  1161. functionId: 101003002,
  1162. serialNumber: '101003002Table2MaxValue',
  1163. tableId: "101003002Table2",
  1164. tableName: "维保项目表",
  1165. columnProp: 'maxValue',
  1166. headerAlign: "center",
  1167. align: "right",
  1168. columnLabel: '最大值',
  1169. columnHidden: false,
  1170. columnImage: false,
  1171. columnSortable: false,
  1172. sortLv: 0,
  1173. status: true,
  1174. fixed: '',
  1175. columnWidth: 65,
  1176. },
  1177. {
  1178. userId: this.$store.state.user.name,
  1179. functionId: 101003002,
  1180. serialNumber: '101003002Table2MinValue',
  1181. tableId: "101003002Table2",
  1182. tableName: "维保项目表",
  1183. columnProp: 'minValue',
  1184. headerAlign: "center",
  1185. align: "right",
  1186. columnLabel: '最小值',
  1187. columnHidden: false,
  1188. columnImage: false,
  1189. columnSortable: false,
  1190. sortLv: 0,
  1191. status: true,
  1192. fixed: '',
  1193. columnWidth: 65,
  1194. },
  1195. {
  1196. userId: this.$store.state.user.name,
  1197. functionId: 101003002,
  1198. serialNumber: '101003002Table2ValueChooseFlag',
  1199. tableId: "101003002Table2",
  1200. tableName: "维保项目表",
  1201. columnProp: 'valueChooseFlag',
  1202. headerAlign: "center",
  1203. align: "center",
  1204. columnLabel: '是否值可选',
  1205. columnHidden: false,
  1206. columnImage: false,
  1207. columnSortable: false,
  1208. sortLv: 0,
  1209. status: true,
  1210. fixed: '',
  1211. columnWidth: 70,
  1212. }
  1213. ],
  1214. levelList: [],
  1215. chooseModalData: {
  1216. site: '',
  1217. buNo: '',
  1218. itemNo: '',
  1219. itemDesc: '',
  1220. itemType: 'B',
  1221. valueTypeDb: '',
  1222. },
  1223. currentRow:{
  1224. },
  1225. //---------快速添加----------
  1226. fastAddFlag: false,
  1227. itemList1: [],
  1228. itemList2: [],
  1229. itemListRow1: {},
  1230. itemListRow2: {},
  1231. itemSelections1: [],
  1232. itemSelections2: [],
  1233. rules: {
  1234. codeNoType: [
  1235. {
  1236. required: true,
  1237. message: ' ',
  1238. trigger: ['blur','change']
  1239. }
  1240. ],
  1241. codeDescType: [
  1242. {
  1243. required: true,
  1244. message: ' ',
  1245. trigger: ['blur','change']
  1246. }
  1247. ],
  1248. activeType: [
  1249. {
  1250. required: true,
  1251. message: ' ',
  1252. trigger: ['blur','change']
  1253. }
  1254. ],
  1255. bu: [
  1256. {
  1257. required: true,
  1258. message: ' ',
  1259. trigger: ['blur','change']
  1260. }
  1261. ],
  1262. checkType: [
  1263. {
  1264. required: true,
  1265. message: ' ',
  1266. trigger: ['blur','change']
  1267. }
  1268. ]
  1269. },
  1270. userBuList: [],
  1271. userRoleList: [],
  1272. chooseTableData: [],
  1273. authSearch: false,
  1274. authSave: false,
  1275. authUpdate: false,
  1276. authDelete: false,
  1277. menuId: this.$route.meta.menuId,
  1278. // 上传相关
  1279. uploadDialogVisible: false,
  1280. uploadFileName: '',
  1281. uploadFile: null,
  1282. uploadBu: '', // 上传时选择的BU
  1283. uploadSubmitting: false, // 防止重复提交
  1284. // 导入维保项目相关
  1285. uploadItemDialogVisible: false,
  1286. uploadItemFileName: '',
  1287. uploadItemFile: null,
  1288. uploadItemSubmitting: false, // 防止重复提交
  1289. }
  1290. },
  1291. mounted () {
  1292. this.$nextTick(() => {
  1293. this.height = window.innerHeight - 180
  1294. })
  1295. },
  1296. created () {
  1297. // 按钮控制
  1298. this.getButtonAuthData()
  1299. // 获取用户的 site 和 bu
  1300. this.getSiteAndBuByUserName()
  1301. // 获取用户的 role
  1302. this.getRoleByUserName()
  1303. // 校验用户是否收藏
  1304. this.favoriteIsOk()
  1305. // 动态列
  1306. this.getTableUserColumn(this.$route.meta.menuId+'table1',1)
  1307. this.getTableUserColumn(this.$route.meta.menuId+'table2',2)
  1308. if (!this.authSearch) {
  1309. // 获取数据列表
  1310. this.getDataList()
  1311. }
  1312. },
  1313. methods: {
  1314. // 获取用户的bu
  1315. getSiteAndBuByUserName () {
  1316. let tempData = {
  1317. username: this.$store.state.user.name,
  1318. }
  1319. getSiteAndBuByUserName(tempData).then(({data}) => {
  1320. if (data.code === 0) {
  1321. this.userBuList = data.rows
  1322. }
  1323. })
  1324. },
  1325. // 获取用户的 role
  1326. getRoleByUserName () {
  1327. let tempData = {
  1328. username: this.$store.state.user.name,
  1329. }
  1330. getRoleByUserName(tempData).then(({data}) => {
  1331. if (data.code === 0) {
  1332. this.userRoleList = data.rows
  1333. }
  1334. })
  1335. },
  1336. // 校验用户是否收藏
  1337. favoriteIsOk () {
  1338. let userFavorite = {
  1339. userId: this.$store.state.user.id,
  1340. languageCode: this.$i18n.locale
  1341. }
  1342. userFavoriteList(userFavorite).then(({data}) => {
  1343. for (let i = 0; i < data.list.length; i++) {
  1344. if(this.$route.meta.menuId === data.list[i].menuId){
  1345. this.favorite = true
  1346. }
  1347. }
  1348. })
  1349. },
  1350. // 收藏 OR 取消收藏
  1351. favoriteFunction () {
  1352. let userFavorite = {
  1353. userId: this.$store.state.user.id,
  1354. functionId: this.$route.meta.menuId,
  1355. }
  1356. if (this.favorite) {
  1357. removeUserFavorite(userFavorite).then(({data}) => {
  1358. this.$message.success(data.msg)
  1359. this.favorite = false
  1360. })
  1361. } else {
  1362. // 收藏
  1363. saveUserFavorite(userFavorite).then(({data}) => {
  1364. this.$message.success(data.msg)
  1365. this.favorite = true
  1366. })
  1367. }
  1368. },
  1369. // 获取基础数据列表S
  1370. getBaseList (val,type) {
  1371. this.tagNo = val
  1372. this.$nextTick(() => {
  1373. let strVal = ''
  1374. if (val === 1025) {
  1375. strVal = this.detailData.itemNo
  1376. }
  1377. this.$refs.baseList.init(val, strVal)
  1378. })
  1379. },
  1380. // 列表方法的回调
  1381. getBaseData (val) {
  1382. if (this.tagNo === 1025) {
  1383. this.detailData.itemNo = val.ItemNo
  1384. this.detailData.itemDesc = val.ItemDesc
  1385. }
  1386. },
  1387. async exportExcel() {
  1388. this.searchData.limit = -1
  1389. this.searchData.page = 1
  1390. excel.exportTable({
  1391. url: "/pms/eam/eamPropertiesModelSearch",
  1392. columnMapping: this.columnList,//可以直接用table,不需要的列就剔除
  1393. mergeSetting: [],//需要合并的列
  1394. params: this.searchData,
  1395. fileName: this.exportName+".xlsx",
  1396. rowFetcher: res => res.data,
  1397. columnFormatter: [],
  1398. dropColumns: [],//需要剔除的列,例如dropColumns: ["netWeight"],即剔除净重列
  1399. });
  1400. },
  1401. async exportDetailExcel() {
  1402. this.searchData.limit = -1
  1403. this.searchData.page = 1
  1404. excel.exportTable({
  1405. url: "/pms/eam/exportEamPropertiesTemplateAndItem",
  1406. columnMapping: this.columnExport,//可以直接用table,不需要的列就剔除
  1407. mergeSetting: [],//需要合并的列
  1408. params: this.searchData,
  1409. fileName: this.exportName+".xlsx",
  1410. rowFetcher: res => res.data,
  1411. columnFormatter: [],
  1412. dropColumns: [],//需要剔除的列,例如dropColumns: ["netWeight"],即剔除净重列
  1413. });
  1414. },
  1415. //导出excel
  1416. // async createExportData () {
  1417. // this.searchData.limit = -1
  1418. // this.searchData.page = 1
  1419. // await eamPropertiesModelSearch(this.searchData).then(({data}) => {
  1420. // this.exportList= data.page.list
  1421. // })
  1422. // return this.exportList
  1423. // },
  1424. //
  1425. // startDownload() {},
  1426. //
  1427. // finishDownload() {},
  1428. //
  1429. // fields () {
  1430. // let json = "{"
  1431. // this.columnList.forEach((item, index) => {
  1432. // if (index == this.columnList.length - 1) {
  1433. // json += "\"" + item.columnLabel + "\"" + ":" + "\"" + item.columnProp + "\""
  1434. // } else {
  1435. // json += "\"" + item.columnLabel + "\"" + ":" + "\"" + item.columnProp + "\"" + ","
  1436. // }
  1437. // })
  1438. // json += "}"
  1439. // let s = eval("(" + json + ")")
  1440. // return s
  1441. // },
  1442. // 获取数据列表
  1443. getDataList () {
  1444. this.searchData.limit = this.pageSize
  1445. this.searchData.page = this.pageIndex
  1446. eamPropertiesModelSearch(this.searchData).then(({data}) => {
  1447. if (data.code === 0) {
  1448. this.dataList = data.page.list
  1449. this.pageIndex = data.page.currPage
  1450. this.pageSize = data.page.pageSize
  1451. this.totalPage = data.page.totalCount
  1452. }
  1453. this.dataListLoading = false
  1454. })
  1455. },
  1456. // 每页数
  1457. sizeChangeHandle (val) {
  1458. this.pageSize = val
  1459. this.pageIndex = 1
  1460. this.getDataList()
  1461. },
  1462. // 当前页
  1463. currentChangeHandle (val) {
  1464. this.pageIndex = val
  1465. this.getDataList()
  1466. },
  1467. addModal () {
  1468. this.modalData = {
  1469. site: '',
  1470. bu: this.userBuList[0].buNo,
  1471. flag: '1',
  1472. codeNo: '',
  1473. codeDesc: '',
  1474. active: 'Y',
  1475. functionType: 'B',
  1476. userId: this.$store.state.user.name,
  1477. createdBy: this.$store.state.user.name,
  1478. updateBy: this.$store.state.user.name,
  1479. checkType: this.userRoleList.length > 0 ? this.userRoleList[0].roleNo : 'R022',
  1480. }
  1481. this.modalDisableFlag = false
  1482. this.modalFlag = true
  1483. },
  1484. updateModal (row) {
  1485. this.modalData = {
  1486. site: this.$store.state.user.site,
  1487. flag: '2',
  1488. bu: row.site + '_' + row.buNo,
  1489. codeNo: row.codeNo,
  1490. codeDesc: row.codeDesc,
  1491. active: row.active,
  1492. functionType: 'B',
  1493. userId: this.$store.state.user.name,
  1494. createdBy: this.$store.state.user.name,
  1495. updateBy: this.$store.state.user.name,
  1496. checkType: row.checkType
  1497. }
  1498. this.modalDisableFlag = true
  1499. this.modalFlag = true
  1500. },
  1501. // 删除
  1502. deletePropertiesModel (row) {
  1503. this.$confirm(`是否删除这个维保模板?`, '提示', {
  1504. confirmButtonText: '确定',
  1505. cancelButtonText: '取消',
  1506. type: 'warning'
  1507. }).then(() => {
  1508. eamPropertiesModelDelete(row).then(({data}) => {
  1509. if (data && data.code === 0) {
  1510. this.getDataList()
  1511. this.$message({
  1512. message: '操作成功',
  1513. type: 'success',
  1514. duration: 1500,
  1515. onClose: () => {}
  1516. })
  1517. } else {
  1518. this.$alert(data.msg, '错误', {
  1519. confirmButtonText: '确定'
  1520. })
  1521. }
  1522. })
  1523. })
  1524. },
  1525. saveData () {
  1526. if (this.modalData.bu === '' || this.modalData.bu == null) {
  1527. this.$message.warning('请选择BU!')
  1528. return
  1529. }
  1530. if (this.modalData.checkType === '' || this.modalData.checkType == null) {
  1531. this.$message.warning('请选择部门!')
  1532. return
  1533. }
  1534. if (this.modalData.codeNo === '' || this.modalData.codeNo == null) {
  1535. this.$message.warning('请输入维保模板编码!')
  1536. return
  1537. }
  1538. if (this.modalData.codeDesc === '' || this.modalData.codeDesc == null) {
  1539. this.$message.warning('请输入维保模板名称!')
  1540. return
  1541. }
  1542. if (this.modalData.active === '' || this.modalData.active == null) {
  1543. this.$message.warning('选择是否在用!')
  1544. return
  1545. }
  1546. if (this.modalData.flag === '1') {
  1547. eamPropertiesModelSave(this.modalData).then(({data}) => {
  1548. if (data && data.code === 0) {
  1549. this.getDataList()
  1550. this.modalFlag = false
  1551. this.$message({
  1552. message: '操作成功',
  1553. type: 'success',
  1554. duration: 1500,
  1555. onClose: () => {}
  1556. })
  1557. } else {
  1558. this.$alert(data.msg, '错误', {
  1559. confirmButtonText: '确定'
  1560. })
  1561. }
  1562. })
  1563. } else {
  1564. eamPropertiesModelEdit(this.modalData).then(({data}) => {
  1565. if (data && data.code === 0) {
  1566. this.getDataList()
  1567. this.modalFlag = false
  1568. this.$message({
  1569. message: '操作成功',
  1570. type: 'success',
  1571. duration: 1500,
  1572. onClose: () => {}
  1573. })
  1574. } else {
  1575. this.$alert(data.msg, '错误', {
  1576. confirmButtonText: '确定'
  1577. })
  1578. }
  1579. })
  1580. }
  1581. },
  1582. // 打开项目清单
  1583. detailModal (row) {
  1584. this.detailData.site = row.site
  1585. this.detailData.buNo = row.buNo
  1586. this.detailData.codeNo = row.codeNo
  1587. this.detailData.codeDesc = row.codeDesc
  1588. this.detailData.checkType = row.checkType
  1589. searchModalDetails(this.detailData).then(({data}) => {
  1590. this.detailList = data.rows
  1591. })
  1592. this.detailModelFlag = true
  1593. },
  1594. // 保存项目明细
  1595. saveModalDetails () {
  1596. if (this.detailData.itemNo === '' || this.detailData.itemNo == null) {
  1597. this.$alert('请选择维保项目编码!', '错误', {
  1598. confirmButtonText: '确定'
  1599. })
  1600. return false
  1601. }
  1602. saveModalDetails(this.detailData).then(({data}) => {
  1603. if (data && data.code === 0) {
  1604. searchModalDetails(this.detailData).then(({data}) => {
  1605. this.detailList = data.rows
  1606. })
  1607. this.addDetailModalFlag = false
  1608. this.$message({
  1609. message: '操作成功',
  1610. type: 'success',
  1611. duration: 1500,
  1612. onClose: () => {}
  1613. })
  1614. } else {
  1615. this.$alert(data.msg, '错误', {
  1616. confirmButtonText: '确定'
  1617. })
  1618. }
  1619. })
  1620. },
  1621. itemNoBlur () {
  1622. let inData = {
  1623. site: this.$store.state.user.site,
  1624. itemType: 'B',
  1625. itemNo: this.detailData.itemNo
  1626. }
  1627. eamPropertiesItemSearch(inData).then(({data}) => {
  1628. if(data.rows.length>0){
  1629. this.detailData.itemDesc=data.rows[0].itemDesc
  1630. }
  1631. })
  1632. },
  1633. deleteModalDetails (row) {
  1634. this.$confirm(`是否删除这个维保项目?`, '提示', {
  1635. confirmButtonText: '确定',
  1636. cancelButtonText: '取消',
  1637. type: 'warning'
  1638. }).then(() => {
  1639. deleteModalDetail(row).then(({data}) => {
  1640. if (data && data.code === 0) {
  1641. searchModalDetails(this.detailData).then(({data}) => {
  1642. this.detailList = data.rows
  1643. })
  1644. this.$message({
  1645. message: '操作成功',
  1646. type: 'success',
  1647. duration: 1500,
  1648. onClose: () => {}
  1649. })
  1650. } else {
  1651. this.$alert(data.msg, '错误', {
  1652. confirmButtonText: '确定'
  1653. })
  1654. }
  1655. })
  1656. })
  1657. },
  1658. chooseModal (row) {
  1659. this.chooseModalData.site = row.site
  1660. this.chooseModalData.buNo = row.buNo
  1661. this.chooseModalData.itemNo = row.itemNo
  1662. this.chooseModalData.itemDesc = row.itemDesc
  1663. this.chooseModalData.valueTypeDb = row.valueTypeDb
  1664. searchItemAvailable(this.chooseModalData).then(({data}) => {
  1665. this.chooseTableData = data.rows
  1666. })
  1667. this.chooseModalFlag = true
  1668. },
  1669. //---------快速添加----------
  1670. queryTemplateItem () {
  1671. getItemLists(this.detailData).then(({data}) => {
  1672. this.itemList1 = data.row1
  1673. this.itemList2 = data.row2
  1674. })
  1675. },
  1676. addFastModal () {
  1677. this.itemListRow2 = null
  1678. this.itemListRow1 = null
  1679. getItemLists(this.detailData).then(({data}) => {
  1680. this.itemList1 = data.row1
  1681. this.itemList2 = data.row2
  1682. })
  1683. this.fastAddFlag = true
  1684. },
  1685. // 可选项目
  1686. itemClickRow1 (row) {
  1687. this.$refs.itemTable1.toggleRowSelection(row)
  1688. },
  1689. itemClickRow(row){
  1690. this.currentRow= JSON.parse(JSON.stringify(row))
  1691. },
  1692. // 已有项目
  1693. itemClickRow2 (row) {
  1694. this.$refs.itemTable2.toggleRowSelection(row)
  1695. },
  1696. selectionItem1 (val) {
  1697. this.itemSelections1 = val
  1698. },
  1699. selectionItem2 (val) {
  1700. this.itemSelections2 = val
  1701. },
  1702. addItem () {
  1703. if (this.itemSelections1 == null || this.itemSelections1.length === 0) {
  1704. this.$alert("请选择可选项目!", '错误', {
  1705. confirmButtonText: '确定'
  1706. })
  1707. return false
  1708. }
  1709. let inData = {
  1710. site: this.detailData.site,
  1711. buNo: this.detailData.buNo,
  1712. codeNo: this.detailData.codeNo,
  1713. codeDesc: this.detailData.codeDesc,
  1714. functionType: this.detailData.functionType,
  1715. itemList: this.itemSelections1,
  1716. itemType: this.detailData.itemType,
  1717. userId: this.$store.state.user.name,
  1718. checkType: this.detailData.checkType,
  1719. }
  1720. saveModalDetails(inData).then(({data}) => {
  1721. if (data && data.code === 0) {
  1722. getItemLists(this.detailData).then(({data}) => {
  1723. this.itemList1 = data.row1
  1724. this.itemList2 = data.row2
  1725. })
  1726. this.itemSelections1 = []
  1727. } else {
  1728. this.$alert(data.msg, '错误', {
  1729. confirmButtonText: '确定'
  1730. })
  1731. }
  1732. })
  1733. },
  1734. deleteItem () {
  1735. if (this.itemSelections2 == null || this.itemSelections2.length === 0) {
  1736. this.$alert("请选择已有项目!", '错误', {
  1737. confirmButtonText: '确定'
  1738. })
  1739. return false
  1740. }
  1741. let inData = {
  1742. site: this.detailData.site,
  1743. buNo: this.detailData.buNo,
  1744. codeNo: this.detailData.codeNo,
  1745. codeDesc: this.detailData.codeDesc,
  1746. functionType: this.detailData.functionType,
  1747. itemList: this.itemSelections2,
  1748. itemType: this.detailData.itemType,
  1749. userId: this.$store.state.user.name
  1750. }
  1751. deleteModalDetails(inData).then(({data}) => {
  1752. if (data && data.code === 0) {
  1753. getItemLists(this.detailData).then(({data}) => {
  1754. this.itemList1 = data.row1
  1755. this.itemList2 = data.row2
  1756. })
  1757. this.itemSelections2 = []
  1758. } else {
  1759. this.$alert(data.msg, '错误', {
  1760. confirmButtonText: '确定'
  1761. })
  1762. }
  1763. })
  1764. },
  1765. refreshDetailList () {
  1766. searchModalDetails(this.detailData).then(({data}) => {
  1767. this.detailList = data.rows
  1768. })
  1769. },
  1770. goUp() {
  1771. goUpItemEam(this.currentRow).then(({data}) => {
  1772. if (data && data.code === 0) {
  1773. searchModalDetails(this.detailData).then(({data}) => {
  1774. this.detailList = data.rows
  1775. for (let i = 0; i <this.detailList.length ; i++) {
  1776. if(this.detailList[i].itemNo===this.currentRow.itemNo){
  1777. this.$refs.detailTable.setCurrentRow(this.detailList[i]);
  1778. this.currentRow=JSON.parse(JSON.stringify(this.detailList[i]))
  1779. this.$message.success('操作成功')
  1780. }
  1781. }
  1782. //this.objectSearch()
  1783. })
  1784. }
  1785. })
  1786. },
  1787. goDown() {
  1788. goDownItemEam(this.currentRow).then(({data}) => {
  1789. if (data && data.code === 0) {
  1790. searchModalDetails(this.detailData).then(({data}) => {
  1791. this.detailList = data.rows
  1792. for (let i = 0; i <this.detailList.length ; i++) {
  1793. if(this.detailList[i].itemNo===this.currentRow.itemNo){
  1794. this.$refs.detailTable.setCurrentRow(this.detailList[i]);
  1795. this.currentRow=JSON.parse(JSON.stringify(this.detailList[i]))
  1796. this.$message.success('操作成功')
  1797. }
  1798. }
  1799. })
  1800. }
  1801. })
  1802. },
  1803. // 动态列开始 获取 用户保存的 格式列
  1804. async getTableUserColumn (tableId, columnId) {
  1805. let queryTableUser = {
  1806. userId: this.$store.state.user.name,
  1807. functionId: this.$route.meta.menuId,
  1808. tableId: tableId,
  1809. status: true,
  1810. languageCode: this.$i18n.locale
  1811. }
  1812. await getTableUserListLanguage(queryTableUser).then(({data}) => {
  1813. if (data.rows.length > 0) {
  1814. switch (columnId) {
  1815. case 1:
  1816. this.columnList = data.rows
  1817. break;
  1818. case 2:
  1819. this.columnDetailList = data.rows
  1820. break;
  1821. }
  1822. } else {
  1823. this.getColumnList(tableId, columnId)
  1824. }
  1825. })
  1826. },
  1827. // 获取 tableDefault 列
  1828. async getColumnList (tableId, columnId) {
  1829. let queryTable = {
  1830. functionId: this.$route.meta.menuId,
  1831. tableId: tableId,
  1832. languageCode: this.$i18n.locale
  1833. }
  1834. await getTableDefaultListLanguage(queryTable).then(({data}) => {
  1835. if (!data.rows.length == 0) {
  1836. switch (columnId) {
  1837. case 1:
  1838. this.columnList = data.rows
  1839. break;
  1840. case 2:
  1841. this.columnDetailList = data.rows
  1842. break;
  1843. }
  1844. }
  1845. })
  1846. },
  1847. //获取按钮的权限数据
  1848. getButtonAuthData () {
  1849. let searchFlag = this.isAuth(this.menuId+":search")
  1850. let saveFlag = this.isAuth(this.menuId+":save")
  1851. let updateFlag = this.isAuth(this.menuId+":update")
  1852. let deleteFlag = this.isAuth(this.menuId+":delete")
  1853. //处理页面的权限数据
  1854. this.authSearch = !searchFlag
  1855. this.authSave = !saveFlag
  1856. this.authUpdate = !updateFlag
  1857. this.authDelete = !deleteFlag
  1858. },
  1859. // Excel导入
  1860. importExcel () {
  1861. this.uploadDialogVisible = true
  1862. this.uploadFileName = ''
  1863. this.uploadFile = null
  1864. this.uploadBu = '' // 清空BU选择
  1865. // 清空el-upload组件的文件列表
  1866. if (this.$refs.uploadFile) {
  1867. this.$refs.uploadFile.clearFiles()
  1868. }
  1869. },
  1870. // 文件选择变化
  1871. handleFileChange (file) {
  1872. this.uploadFile = file.raw
  1873. this.uploadFileName = file.name
  1874. },
  1875. // 确认上传
  1876. confirmUpload () {
  1877. // 防止重复提交
  1878. if (this.uploadSubmitting) {
  1879. return
  1880. }
  1881. // 验证BU是否选择
  1882. if (!this.uploadBu || this.uploadBu === '') {
  1883. this.$message.warning('请先选择BU')
  1884. return
  1885. }
  1886. if (!this.uploadFile) {
  1887. this.$message.warning('请先选择文件')
  1888. return
  1889. }
  1890. const formData = new FormData()
  1891. formData.append('file', this.uploadFile)
  1892. formData.append('createBy', this.$store.state.user.name)
  1893. formData.append('site', this.uploadBu.split('_')[0]) // 从BU中提取site
  1894. formData.append('buNo', this.uploadBu.split('_')[1]) // 从BU中提取buNo
  1895. // 设置提交状态
  1896. this.uploadSubmitting = true
  1897. // 调用后端导入接口
  1898. uploadEamMaintenanceModelExcel(formData).then(({data}) => {
  1899. if (data.code === 0) {
  1900. this.$message.success(data.msg || '导入成功')
  1901. this.uploadDialogVisible = false
  1902. // 清空文件信息
  1903. this.uploadFileName = ''
  1904. this.uploadFile = null
  1905. this.uploadBu = ''
  1906. if (this.$refs.uploadFile) {
  1907. this.$refs.uploadFile.clearFiles()
  1908. }
  1909. this.getDataList()
  1910. } else {
  1911. this.$alert(
  1912. (data.msg || '导入失败').replace(/\n/g, '<br>'),
  1913. '导入结果',
  1914. {
  1915. confirmButtonText: '确定',
  1916. dangerouslyUseHTMLString: true
  1917. }
  1918. )
  1919. }
  1920. }).catch((error) => {
  1921. console.error('导入失败:', error)
  1922. const errorMsg = (error.response && error.response.data && error.response.data.msg) || error.message || '未知错误'
  1923. this.$alert(
  1924. ('导入失败: ' + errorMsg).replace(/\n/g, '<br>'),
  1925. '导入结果',
  1926. {
  1927. confirmButtonText: '确定',
  1928. dangerouslyUseHTMLString: true
  1929. }
  1930. )
  1931. }).finally(() => {
  1932. // 恢复提交状态
  1933. this.uploadSubmitting = false
  1934. })
  1935. },
  1936. // 导入维保项目
  1937. importItemExcel () {
  1938. this.uploadItemDialogVisible = true
  1939. this.uploadItemFileName = ''
  1940. this.uploadItemFile = null
  1941. // 清空el-upload组件的文件列表
  1942. if (this.$refs.uploadItemFile) {
  1943. this.$refs.uploadItemFile.clearFiles()
  1944. }
  1945. },
  1946. // 维保项目文件选择变化
  1947. handleItemFileChange (file) {
  1948. this.uploadItemFile = file.raw
  1949. this.uploadItemFileName = file.name
  1950. },
  1951. // 确认导入维保项目
  1952. confirmItemUpload () {
  1953. // 防止重复提交
  1954. if (this.uploadItemSubmitting) {
  1955. return
  1956. }
  1957. if (!this.uploadItemFile) {
  1958. this.$message.warning('请先选择文件')
  1959. return
  1960. }
  1961. const formData = new FormData()
  1962. formData.append('file', this.uploadItemFile)
  1963. formData.append('userId', this.$store.state.user.name)
  1964. // 设置提交状态
  1965. this.uploadItemSubmitting = true
  1966. // 调用后端导入接口
  1967. uploadEamMaintenanceItemDetailExcel(formData).then(({data}) => {
  1968. if (data.code === 0) {
  1969. this.$message.success(data.msg || '导入成功')
  1970. this.uploadItemDialogVisible = false
  1971. // 清空文件信息
  1972. this.uploadItemFileName = ''
  1973. this.uploadItemFile = null
  1974. if (this.$refs.uploadItemFile) {
  1975. this.$refs.uploadItemFile.clearFiles()
  1976. }
  1977. this.getDataList()
  1978. } else {
  1979. this.$alert(
  1980. (data.msg || '导入失败').replace(/\n/g, '<br>'),
  1981. '导入结果',
  1982. {
  1983. confirmButtonText: '确定',
  1984. dangerouslyUseHTMLString: true
  1985. }
  1986. )
  1987. }
  1988. }).catch((error) => {
  1989. console.error('导入失败:', error)
  1990. const errorMsg = (error.response && error.response.data && error.response.data.msg) || error.message || '未知错误'
  1991. this.$alert(
  1992. ('导入失败: ' + errorMsg).replace(/\n/g, '<br>'),
  1993. '导入结果',
  1994. {
  1995. confirmButtonText: '确定',
  1996. dangerouslyUseHTMLString: true
  1997. }
  1998. )
  1999. }).finally(() => {
  2000. // 恢复提交状态
  2001. this.uploadItemSubmitting = false
  2002. })
  2003. },
  2004. // 下载模板
  2005. downloadTemplate () {
  2006. const loading = this.$loading({
  2007. lock: true,
  2008. text: '正在下载模板...',
  2009. spinner: 'el-icon-loading',
  2010. background: 'rgba(0, 0, 0, 0.7)'
  2011. })
  2012. // 使用原生XMLHttpRequest处理文件下载,避免axios拦截器干扰
  2013. const xhr = new XMLHttpRequest()
  2014. xhr.open('GET', this.$http.adornUrl('/pms/eam/downloadEamMaintenanceModelTemplate'), true)
  2015. xhr.responseType = 'blob'
  2016. // 添加token
  2017. const token = this.$cookie.get('token')
  2018. if (token) {
  2019. xhr.setRequestHeader('token', token)
  2020. }
  2021. xhr.onload = () => {
  2022. loading.close()
  2023. if (xhr.status === 200) {
  2024. const blob = xhr.response
  2025. // 验证Blob大小
  2026. if (blob.size === 0) {
  2027. this.$message.error('模板文件为空,请联系管理员')
  2028. return
  2029. }
  2030. // 创建下载链接
  2031. const url = window.URL.createObjectURL(blob)
  2032. const link = document.createElement('a')
  2033. link.href = url
  2034. link.download = '维保模板导入模板.xlsx'
  2035. link.style.display = 'none'
  2036. document.body.appendChild(link)
  2037. link.click()
  2038. document.body.removeChild(link)
  2039. // 释放URL对象
  2040. setTimeout(() => {
  2041. window.URL.revokeObjectURL(url)
  2042. }, 100)
  2043. this.$message.success('模板下载成功')
  2044. } else {
  2045. console.error('模板下载失败,状态码:', xhr.status)
  2046. this.$message.error('模板下载失败:服务器错误')
  2047. }
  2048. }
  2049. xhr.onerror = () => {
  2050. loading.close()
  2051. console.error('网络错误')
  2052. this.$message.error('模板下载失败:网络错误')
  2053. }
  2054. xhr.send()
  2055. },
  2056. // 关闭上传对话框时清空文件
  2057. handleUploadDialogClose () {
  2058. this.uploadFileName = ''
  2059. this.uploadFile = null
  2060. this.uploadBu = '' // 清空BU选择
  2061. this.uploadSubmitting = false // 重置提交状态
  2062. if (this.$refs.uploadFile) {
  2063. this.$refs.uploadFile.clearFiles()
  2064. }
  2065. },
  2066. // 关闭维保项目上传对话框时清空文件
  2067. handleUploadItemDialogClose () {
  2068. this.uploadItemFileName = ''
  2069. this.uploadItemFile = null
  2070. this.uploadItemSubmitting = false // 重置提交状态
  2071. if (this.$refs.uploadItemFile) {
  2072. this.$refs.uploadItemFile.clearFiles()
  2073. }
  2074. },
  2075. // 下载点检项目模板
  2076. downloadItemTemplate () {
  2077. const loading = this.$loading({
  2078. lock: true,
  2079. text: '正在下载模板...',
  2080. spinner: 'el-icon-loading',
  2081. background: 'rgba(0, 0, 0, 0.7)'
  2082. })
  2083. // 使用原生XMLHttpRequest处理文件下载,避免axios拦截器干扰
  2084. const xhr = new XMLHttpRequest()
  2085. xhr.open('GET', this.$http.adornUrl('/pms/eam/downloadEamMaintenanceItemDetailTemplate'), true)
  2086. xhr.responseType = 'blob'
  2087. // 添加token
  2088. const token = this.$cookie.get('token')
  2089. if (token) {
  2090. xhr.setRequestHeader('token', token)
  2091. }
  2092. xhr.onload = () => {
  2093. loading.close()
  2094. if (xhr.status === 200) {
  2095. const blob = xhr.response
  2096. // 验证Blob大小
  2097. if (blob.size === 0) {
  2098. this.$message.error('模板文件为空,请联系管理员')
  2099. return
  2100. }
  2101. // 创建下载链接
  2102. const url = window.URL.createObjectURL(blob)
  2103. const link = document.createElement('a')
  2104. link.href = url
  2105. link.download = '维保项目清单导入模板.xlsx'
  2106. link.style.display = 'none'
  2107. document.body.appendChild(link)
  2108. link.click()
  2109. document.body.removeChild(link)
  2110. // 释放URL对象
  2111. setTimeout(() => {
  2112. window.URL.revokeObjectURL(url)
  2113. }, 100)
  2114. this.$message.success('模板下载成功')
  2115. } else {
  2116. console.error('模板下载失败,状态码:', xhr.status)
  2117. this.$message.error('模板下载失败:服务器错误')
  2118. }
  2119. }
  2120. xhr.onerror = () => {
  2121. loading.close()
  2122. console.error('网络错误')
  2123. this.$message.error('模板下载失败:网络错误')
  2124. }
  2125. xhr.send()
  2126. },
  2127. }
  2128. }
  2129. </script>
  2130. <style scoped>
  2131. .el-table /deep/ .cell{
  2132. height: auto;
  2133. line-height: 1.5;
  2134. }
  2135. .simple-dialog >>> .el-dialog {
  2136. border-radius: 8px;
  2137. }
  2138. /* body顶格 */
  2139. .simple-dialog >>> .el-dialog__body {
  2140. padding: 0px 20px 10px 20px !important;
  2141. }
  2142. /* 内容不要额外缩进 */
  2143. .simple-dialog >>> .el-dialog__body > div {
  2144. margin-left: 0 !important;
  2145. }
  2146. /* 下载区域 */
  2147. .download-area {
  2148. margin-top: 0;
  2149. margin-bottom: 0;
  2150. }
  2151. /* 下载按钮 */
  2152. .download-btn {
  2153. width: 40%;
  2154. }
  2155. /* BU区域 */
  2156. .bu-area {
  2157. margin-top: 0;
  2158. margin-bottom: 5px;
  2159. }
  2160. /* BU label */
  2161. .simple-dialog >>> .el-form-item__label {
  2162. padding-bottom: 0;
  2163. line-height: 22px;
  2164. }
  2165. /* 去掉form自带间距 */
  2166. .simple-dialog >>> .el-form-item {
  2167. margin-bottom: 0;
  2168. }
  2169. /* 上传区域 */
  2170. .upload-demo {
  2171. margin-top: 0;
  2172. }
  2173. /* 上传框 */
  2174. .upload-demo .el-upload-dragger {
  2175. width: 100%;
  2176. height: 150px;
  2177. }
  2178. .simple-dialog >>> .el-dialog__body {
  2179. padding-left: 10px !important;
  2180. padding-right: 0 !important;
  2181. }
  2182. </style>