index.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738
  1. <template>
  2. <div class="app-container">
  3. <el-form
  4. :model="queryParams"
  5. ref="queryForm"
  6. size="small"
  7. :inline="true"
  8. v-show="showSearch"
  9. label-width="100px"
  10. >
  11. <el-row>
  12. <el-form-item label="硬件编码" prop="hardwareCode">
  13. <el-input
  14. v-model="queryParams.hardwareCode"
  15. placeholder="请输入硬件编码"
  16. clearable
  17. @keyup.enter.native="handleQuery"
  18. />
  19. </el-form-item>
  20. <el-form-item label="硬件名称" prop="hardwareName">
  21. <el-input
  22. v-model="queryParams.hardwareName"
  23. placeholder="请输入硬件名称"
  24. clearable
  25. @keyup.enter.native="handleQuery"
  26. />
  27. </el-form-item>
  28. <el-form-item label="状态" prop="status">
  29. <el-select
  30. v-model="queryParams.status"
  31. placeholder="请选择硬件状态"
  32. clearable
  33. >
  34. <el-option label="在线" value="1"></el-option>
  35. <el-option label="离线" value="2"></el-option>
  36. <el-option label="异常" value="3"></el-option>
  37. <!-- <el-option-->
  38. <!-- v-for="dict in dict.type.mes_order_status"-->
  39. <!-- :key="dict.value"-->
  40. <!-- :label="dict.label"-->
  41. <!-- :value="dict.value"-->
  42. <!-- />-->
  43. </el-select>
  44. </el-form-item>
  45. <el-form-item label="硬件类型" prop="hardwareTypeName">
  46. <el-select
  47. v-model="queryParams.hardwareTypeName"
  48. placeholder="请选择硬件类型"
  49. clearable
  50. >
  51. <el-option
  52. v-for="dict in hardwareTypeOption"
  53. :key="dict.key"
  54. :label="dict.label"
  55. :value="dict.value"
  56. />
  57. </el-select>
  58. </el-form-item>
  59. </el-row>
  60. <el-form-item label="规格型号" prop="hardwareSpec">
  61. <el-input
  62. v-model="queryParams.hardwareSpec"
  63. placeholder="请输入规格型号"
  64. clearable
  65. @keyup.enter.native="handleQuery"
  66. />
  67. </el-form-item>
  68. <el-form-item label="创建时间" prop="createTime">
  69. <el-date-picker
  70. v-model="createTime"
  71. type="datetimerange"
  72. :picker-options="pickerOptions"
  73. range-separator="-"
  74. start-placeholder="开始日期"
  75. end-placeholder="结束日期"
  76. align="right"
  77. style="width: 540px"
  78. >
  79. </el-date-picker>
  80. </el-form-item>
  81. <el-form-item label="所属车间" prop="status">
  82. <el-select
  83. v-model="queryParams.workshopName"
  84. placeholder="请选择所属车间"
  85. clearable
  86. @change="workShopChangequery"
  87. >
  88. <el-option
  89. v-for="dict in this.workshopOption"
  90. :key="dict.key"
  91. :label="dict.label"
  92. :value="dict.value"
  93. />
  94. </el-select>
  95. </el-form-item>
  96. <el-form-item style="margin-left: 50px">
  97. <el-button
  98. type="primary"
  99. icon="el-icon-search"
  100. size="mini"
  101. @click="handleQuery"
  102. >搜索</el-button
  103. >
  104. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
  105. >重置</el-button
  106. >
  107. </el-form-item>
  108. </el-form>
  109. <el-row :gutter="10" class="mb8">
  110. <el-col :span="1.5">
  111. <el-button
  112. type="primary"
  113. plain
  114. icon="el-icon-plus"
  115. size="mini"
  116. @click="handleAdd"
  117. v-hasPermi="['mes:hw:information:add']"
  118. >新增</el-button
  119. >
  120. </el-col>
  121. <!-- <el-col :span="1.5">
  122. <el-button
  123. type="success"
  124. plain
  125. icon="el-icon-edit"
  126. size="mini"
  127. :disabled="single"
  128. @click="handleUpdate"
  129. v-hasPermi="['mes:dv:repair:edit']"
  130. >修改</el-button
  131. >
  132. </el-col> -->
  133. <el-col :span="1.5">
  134. <el-button
  135. type="danger"
  136. plain
  137. icon="el-icon-delete"
  138. size="mini"
  139. :disabled="multiple"
  140. @click="handleDelete"
  141. v-hasPermi="['mes:hw:information:batchremove']"
  142. >批量删除</el-button
  143. >
  144. </el-col>
  145. <right-toolbar
  146. :showSearch.sync="showSearch"
  147. @queryTable="getList"
  148. ></right-toolbar>
  149. </el-row>
  150. <el-table
  151. v-loading="loading"
  152. :data="repairList"
  153. @selection-change="handleSelectionChange"
  154. >
  155. <el-table-column type="selection" width="55" align="center" />
  156. <el-table-column
  157. label="硬件编码"
  158. width="120px"
  159. align="center"
  160. prop="hardwareCode"
  161. />
  162. <el-table-column
  163. label="硬件名称"
  164. width="150px"
  165. align="center"
  166. prop="hardwareName"
  167. :show-overflow-tooltip="true"
  168. />
  169. <el-table-column label="硬件类型" align="center" prop="hardwareTypeName" />
  170. <el-table-column label="规格型号" align="center" prop="hardwareSpec" />
  171. <el-table-column label="所属车间" align="center" prop="workshopName" />
  172. <el-table-column label="硬件状态" align="center" prop="status" />
  173. <el-table-column
  174. label="创建时间"
  175. align="center"
  176. prop="createTime"
  177. width="180"
  178. >
  179. <template slot-scope="scope">
  180. <span>{{ scope.row.createTime }}</span>
  181. </template>
  182. </el-table-column>
  183. <el-table-column
  184. label="启用时间"
  185. align="center"
  186. prop="activationTime"
  187. width="120"
  188. >
  189. <template slot-scope="scope">
  190. <span>{{ scope.row.activationTime }}</span>
  191. </template>
  192. </el-table-column>
  193. <el-table-column label="可用次数" align="center" prop="availableTimes" />
  194. <el-table-column label="可用寿命" align="center" prop="availableLife" />
  195. <el-table-column label="已用次数" align="center" prop="usedTimes" />
  196. <el-table-column label="已用寿命" align="center" prop="usedLife" />
  197. <el-table-column
  198. label="操作"
  199. align="center"
  200. class-name="small-padding fixed-width"
  201. fixed="right"
  202. >
  203. <template slot-scope="scope">
  204. <el-button
  205. size="mini"
  206. type="text"
  207. icon="el-icon-edit"
  208. @click="handleUpdate(scope.row)"
  209. v-hasPermi="['mes:hw:information:edit']"
  210. >编辑</el-button
  211. >
  212. <el-button
  213. size="mini"
  214. type="text"
  215. icon="el-icon-delete"
  216. @click="handleDelete(scope.row)"
  217. v-hasPermi="['mes:hw:information:remove']"
  218. >删除</el-button
  219. >
  220. <!-- <el-button size="mini" type="text">预览</el-button>-->
  221. </template>
  222. </el-table-column>
  223. </el-table>
  224. <pagination
  225. v-show="total > 0"
  226. :total="total"
  227. :page.sync="queryParams.current"
  228. :limit.sync="queryParams.size"
  229. @pagination="getList"
  230. />
  231. <!-- 添加或修改设备维修单对话框 -->
  232. <el-dialog
  233. :title="title"
  234. :visible.sync="open"
  235. width="1100px"
  236. append-to-body
  237. >
  238. <el-form ref="form" :model="form" :rules="rules" label-width="120px">
  239. <el-row>
  240. <el-col :span="11">
  241. <el-form-item label="硬件编码" prop="hardwareCode">
  242. <el-input
  243. v-model="form.hardwareCode"
  244. placeholder="请输入硬件编码"
  245. style="width: 100%"
  246. />
  247. </el-form-item>
  248. </el-col>
  249. <el-col :span="11">
  250. <el-form-item label="硬件类型" prop="hardwareTypeName">
  251. <el-select
  252. v-model="form.hardwareTypeName"
  253. placeholder="请选择硬件类型"
  254. clearable
  255. style="width: 100%"
  256. @change="hardTypeChange"
  257. >
  258. <el-option
  259. v-for="dict in this.hardwareTypeOption"
  260. :key="dict.value"
  261. :label="dict.label"
  262. :value="dict.value"
  263. />
  264. </el-select>
  265. </el-form-item>
  266. </el-col>
  267. </el-row>
  268. <el-row>
  269. <el-col :span="11">
  270. <el-form-item label="硬件名称" prop="hardwareName">
  271. <el-input
  272. v-model="form.hardwareName"
  273. placeholder="请输入硬件名称"
  274. />
  275. </el-form-item>
  276. </el-col>
  277. <el-col :span="11">
  278. <el-form-item label="规格型号" prop="hardwareSpec">
  279. <el-input
  280. v-model="form.hardwareSpec"
  281. placeholder="请输入规格型号"
  282. />
  283. </el-form-item>
  284. </el-col>
  285. </el-row>
  286. <el-row>
  287. <el-col :span="11">
  288. <el-form-item label="启用日期" prop="activationTime">
  289. <el-date-picker
  290. clearable
  291. v-model="form.activationTime"
  292. style="width: 100%"
  293. type="date"
  294. value-format="yyyy-MM-dd"
  295. placeholder="请选择启用日期"
  296. >
  297. </el-date-picker> </el-form-item
  298. ></el-col>
  299. <el-col :span="11">
  300. <el-form-item label="所属车间" prop="workshopName">
  301. <el-select
  302. v-model="form.workshopName"
  303. placeholder="请选择所属车间"
  304. clearable
  305. style="width: 100%"
  306. @change="workShopChange"
  307. >
  308. <el-option
  309. v-for="dict in this.workshopOption"
  310. :key="dict.key"
  311. :label="dict.label"
  312. :value="dict.value"
  313. />
  314. </el-select>
  315. </el-form-item>
  316. </el-col>
  317. </el-row>
  318. <el-row>
  319. <el-col :span="11">
  320. <el-form-item label="可用次数" prop="availableTimes">
  321. <el-input
  322. v-model="form.availableTimes"
  323. placeholder="请输入可用次数"
  324. />
  325. </el-form-item>
  326. </el-col>
  327. <el-col :span="11">
  328. <el-form-item label="已用次数" prop="usedTimes">
  329. <el-input
  330. v-model="form.usedTimes"
  331. placeholder="请输入已用次数"
  332. />
  333. </el-form-item>
  334. </el-col>
  335. </el-row>
  336. <el-row>
  337. <el-col :span="11">
  338. <el-form-item label="可用寿命" prop="availableLife">
  339. <el-input
  340. v-model="form.availableLife"
  341. placeholder="请输入可用寿命"
  342. />
  343. </el-form-item>
  344. </el-col>
  345. <el-col :span="11">
  346. <el-form-item label="已用寿命" prop="usedLife">
  347. <el-input
  348. v-model="form.usedLife"
  349. placeholder="请输入已用寿命"
  350. />
  351. </el-form-item>
  352. </el-col>
  353. </el-row>
  354. <el-form-item label="状态" prop="status">
  355. <el-radio v-model="form.status" label="1" v-removeAriaHidden
  356. ><img
  357. src="@/assets/images/success.png"
  358. alt=""
  359. class="imgstatus"
  360. />
  361. 在线</el-radio
  362. >
  363. <el-radio v-model="form.status" v-removeAriaHidden label="2" ><img src="@/assets/images/error.png" alt="" class="imgstatus" />
  364. 离线</el-radio
  365. >
  366. <el-radio v-model="form.status" v-removeAriaHidden label="3"
  367. ><img src="@/assets/images/warn.png" alt="" class="imgstatus" />
  368. 异常</el-radio
  369. >
  370. </el-form-item>
  371. </el-form>
  372. <div slot="footer" class="dialog-footer">
  373. <el-button
  374. type="primary"
  375. @click="submitForm"
  376. >确 定</el-button
  377. >
  378. <el-button @click="cancel">取 消</el-button>
  379. </div>
  380. </el-dialog>
  381. </div>
  382. </template>
  383. <script>
  384. import {
  385. listHardware,
  386. getHardwareTypeListAPI,
  387. addHardware,
  388. updateHardware,
  389. delHardware,
  390. getHardwareInfo,
  391. listAllWorkshop
  392. } from '@/api/mes/hw/hardwareinfo'
  393. export default {
  394. name: "hardwareinfo",
  395. dicts: ["mes_repair_result", "mes_order_status"],
  396. // components: { Repairline, MachinerySelectSingle },
  397. data() {
  398. return {
  399. autoGenFlag: false,
  400. optType: undefined,
  401. // 遮罩层
  402. loading: true,
  403. // 选中数组
  404. ids: [],
  405. // 非单个禁用
  406. single: true,
  407. // 非多个禁用
  408. multiple: true,
  409. // 显示搜索条件
  410. showSearch: true,
  411. // 总条数
  412. total: 0,
  413. // 设备维修单表格数据
  414. repairList: [],
  415. // 弹出层标题
  416. title: "",
  417. // 是否显示弹出层
  418. open: false,
  419. // 查询参数
  420. createTime:'',
  421. queryParams: {
  422. current: 1,
  423. size: 10,
  424. hardwareCode:'',
  425. hardwareName:'',
  426. status:'',
  427. hardwareTypeName:'',
  428. hardwareSpec:'',
  429. startTime:'',
  430. endTime:'',
  431. workshopName:'',
  432. workshopCode:'',
  433. workshopId:'',
  434. },
  435. workshopOption:[
  436. ],
  437. hardwareTypeOption:[],
  438. // 表单参数
  439. form: {
  440. hardwareTypeId:0,
  441. workshopCode:0,
  442. workshopId:0,
  443. },
  444. // 表单校验
  445. rules: {
  446. hardwareCode: [
  447. { required: true, message: "硬件编码不能为空", trigger: "blur" },
  448. ],
  449. hardwareName: [
  450. { required: true, message: "硬件名称不能为空", trigger: "blur" },
  451. ],
  452. },
  453. // 日期选择
  454. pickerOptions: {
  455. shortcuts: [
  456. {
  457. text: "最近一周",
  458. onClick(picker) {
  459. const end = new Date();
  460. const start = new Date();
  461. start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
  462. picker.$emit("pick", [start, end]);
  463. },
  464. },
  465. {
  466. text: "最近一个月",
  467. onClick(picker) {
  468. const end = new Date();
  469. const start = new Date();
  470. start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
  471. picker.$emit("pick", [start, end]);
  472. },
  473. },
  474. {
  475. text: "最近三个月",
  476. onClick(picker) {
  477. const end = new Date();
  478. const start = new Date();
  479. start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
  480. picker.$emit("pick", [start, end]);
  481. },
  482. },
  483. ],
  484. },
  485. value2: "",
  486. // 新增状态
  487. radio: 3,
  488. EditId:0,//修改判断
  489. };
  490. },
  491. created() {
  492. this.getList();
  493. this.getHardwareTypeList()
  494. },
  495. methods: {
  496. // 格式化日期查询数据
  497. formatDate(date) {
  498. if (date && date instanceof Date && !isNaN(date)) {
  499. // 使用本地时间
  500. return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;
  501. }
  502. return null;
  503. },
  504. /** 查询设备维修单列表 */
  505. getList() {
  506. this.loading = true;
  507. // 格式化日期并更新 queryParams
  508. if (Array.isArray(this.createTime) && this.createTime.length === 2){
  509. this.queryParams.startTime = this.formatDate(this.createTime[0]);
  510. this.queryParams.endTime = this.formatDate(this.createTime[1]);
  511. }
  512. listHardware(this.queryParams).then((response) => {
  513. this.repairList = response.data.records;
  514. this.total = response.data.total;
  515. this.loading = false;
  516. });
  517. // 车间数据
  518. listAllWorkshop().then((response) => {
  519. this.workshopOption = response.data.map((item)=>{
  520. return {
  521. label:item.workshopName,
  522. value:item.workshopId,
  523. key:item.workshopCode,
  524. }
  525. });
  526. })
  527. },
  528. // 获取硬件类型-所有
  529. getHardwareTypeList() {
  530. getHardwareTypeListAPI().then(response => {
  531. console.log(response,'Type')
  532. this.hardwareTypeOption=response.data.map((item) => {
  533. return{
  534. label:item.hardwareTypeName,
  535. value: item.hardwareTypeCode,
  536. key:item.id,
  537. }
  538. })
  539. })
  540. },
  541. // 硬件类型下拉
  542. hardTypeChange(val){
  543. console.log(val,'下拉类型')
  544. const TypeId=this.hardwareTypeOption.find((item)=>{
  545. return item.value==val?item.key:null;
  546. })
  547. this.form.hardwareTypeId=TypeId.key
  548. console.log(this.form.hardwareTypeId,'hardwareTypeId')
  549. },
  550. // 车间下拉 --新增表单
  551. workShopChange(val){
  552. console.log(val,'val')
  553. this.form.workshopId=val
  554. const item=this.workshopOption.find((item)=>{
  555. return item.value==val?item.key:null;
  556. })
  557. console.log(item,'item')
  558. this.form.workshopCode=item.key
  559. this.form.workshopName=item.label
  560. },
  561. workShopChangequery(val){
  562. console.log(val,'查询下拉')
  563. this.queryParams.workshopId=val
  564. const item=this.workshopOption.find((item)=>{
  565. return item.value==val?item.key:null;
  566. })
  567. this.queryParams.workshopCode=item.key
  568. this.queryParams.workshopName=item.label
  569. },
  570. // 取消按钮
  571. cancel() {
  572. this.open = false;
  573. this.reset();
  574. },
  575. // 表单重置
  576. reset() {
  577. this.form = {
  578. hardwareCode:'',
  579. hardwareName:'',
  580. status:'',
  581. hardwareTypeName:'',
  582. hardwareSpec:'',
  583. createTime:'',
  584. workshopName:'',
  585. workshopId: '',
  586. workshopCode: null,
  587. };
  588. this.autoGenFlag = false;
  589. this.resetForm("form");
  590. },
  591. /** 搜索按钮操作 */
  592. handleQuery() {
  593. this.queryParams.current = 1;
  594. this.getList();
  595. },
  596. /** 重置按钮操作 */
  597. resetQuery() {
  598. this.queryParams.workshopCode=""
  599. this.queryParams.workshopName=""
  600. this.queryParams.workshopId=""
  601. this.createTime="";//之所以不把这个值放到queryParams是因为会被携带到参数里create Time[0]这样的内容携带进去
  602. this.queryParams.startTime=""
  603. this.queryParams.endTime=""
  604. this.resetForm("queryForm");
  605. this.handleQuery();
  606. },
  607. // 多选框选中数据
  608. handleSelectionChange(selection) {
  609. this.ids = selection.map((item) => item.id);
  610. this.single = selection.length !== 1;
  611. this.multiple = !selection.length;
  612. },
  613. /** 新增按钮操作 */
  614. handleAdd() {
  615. this.reset();
  616. this.open = true;
  617. this.EditId=null
  618. this.title = "新增硬件信息";
  619. },
  620. /** 修改按钮操作 */
  621. handleUpdate(row) {
  622. this.reset();
  623. this.EditId = row.id || this.ids;
  624. getHardwareInfo(this.EditId).then((response) => {
  625. this.form = response.data;
  626. this.open = true;
  627. this.title = "编辑硬件信息";
  628. });
  629. },
  630. /** 提交按钮 */
  631. submitForm() {
  632. this.$refs["form"].validate((valid) => {
  633. if (valid) {
  634. if (this.EditId != null) {
  635. updateHardware(this.form).then((response) => {
  636. this.$modal.msgSuccess("修改成功");
  637. this.open = false;
  638. this.getList();
  639. });
  640. } else {
  641. console.log(this.form,'form')
  642. addHardware(this.form).then((response) => {
  643. this.$modal.msgSuccess("新增成功");
  644. this.open = false;
  645. this.EditId=null
  646. this.getList();
  647. });
  648. }
  649. }
  650. });
  651. },
  652. /** 删除按钮操作 */
  653. handleDelete(row) {
  654. const repairIds = row.id || this.ids;
  655. this.$modal
  656. .confirm('是否确认删除硬件编号为"' + repairIds + '"的数据项?')
  657. .then(function () {
  658. return delHardware(repairIds);
  659. })
  660. .then(() => {
  661. this.getList();
  662. this.$modal.msgSuccess("删除成功");
  663. })
  664. .catch(() => {
  665. });
  666. },
  667. /** 导出按钮操作 */
  668. handleExport() {
  669. this.download(
  670. "dv/repair/export",
  671. {
  672. ...this.queryParams,
  673. },
  674. `repair_${new Date().getTime()}.xlsx`
  675. );
  676. },
  677. //自动生成编码
  678. handleAutoGenChange(autoGenFlag) {
  679. if (autoGenFlag) {
  680. genCode("REPAIR_CODE").then((response) => {
  681. this.form.repairCode = response;
  682. });
  683. } else {
  684. this.form.repairCode = null;
  685. }
  686. },
  687. },
  688. };
  689. </script>
  690. <style scoped>
  691. .imgstatus {
  692. position: relative;
  693. top: 1px;
  694. left: 0px;
  695. }
  696. /deep/ .el-radio__inner {
  697. border-radius: 2px;
  698. }
  699. /deep/.el-radio__input.is-checked .el-radio__inner::after {
  700. content: "";
  701. width: 8px;
  702. height: 3px;
  703. border: 1px solid white;
  704. border-top: transparent;
  705. border-right: transparent;
  706. text-align: center;
  707. display: block;
  708. position: absolute;
  709. top: 3px;
  710. left: 2px;
  711. transform: rotate(-45deg);
  712. border-radius: 0pc;
  713. background: none;
  714. }
  715. </style>