index.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. <!--使用记录-->
  2. <template>
  3. <div class="app-container usageRecord">
  4. <div class="usageRecord-page" v-if="pageType == 1">
  5. <advanced-search :searchData="searchData"></advanced-search>
  6. <div class="usageRecord-min">
  7. <el-table border :data="tableList" @selection-change="handleSelectionChange" ref="multipleTable" :row-key="getRowKeys">
  8. <el-table-column type="selection" width="50" align="center" :reserve-selection="true"/>
  9. <el-table-column label="化学品编号" align="center" prop="joinNum" width="130"/>
  10. <el-table-column label="化学品名" align="center" prop="chemicalName" width="180"/>
  11. <el-table-column label="CAS号" align="center" prop="casNum" width="180"/>
  12. <!--<el-table-column label="形态" align="center" prop="chemicalShape" width="121"/>-->
  13. <!--<el-table-column label="规格" align="center" prop="chemicalAmountUnit" width="121"/>-->
  14. <el-table-column label="分类" align="center" prop="classifyName" width="181"/>
  15. <!--<el-table-column label="属性" align="center" prop="classifyAttribute" width="220" show-overflow-tooltip/>-->
  16. <!--<el-table-column label="标签类型" align="center" prop="labelContent" width="121"/>-->
  17. <!--<el-table-column label="标签编号" align="center" prop="tagCode" width="130"/>-->
  18. <el-table-column label="化学品柜" align="center" prop="cabinetName" width="200" show-overflow-tooltip/>
  19. <el-table-column label="位置" align="center" prop="posi" width="300" show-overflow-tooltip/>
  20. <el-table-column label="领用时间" align="center" prop="collectTime" width="170"/>
  21. <el-table-column label="归还时间" align="center" prop="returnTime" width="170"/>
  22. <!--<el-table-column label="归还方式" align="center" prop="returnTypeContent" width="130"/>-->
  23. <el-table-column label="领用时库存" align="center" prop="collectStockNum" width="120"/>
  24. <el-table-column label="领用净重" align="center" prop="collectWeigh" width="120"/>
  25. <el-table-column label="损耗量" align="center" prop="lossAmount" width="120"/>
  26. <el-table-column label="使用量" align="center" prop="useStockNum" width="120"/>
  27. <el-table-column label="剩余库存" align="center" prop="returnStockNum" width="120"/>
  28. <el-table-column label="状态" align="center" prop="useStatus" width="120">
  29. <template slot-scope="scope"><span :class="scope.row.useStatus == '使用中'?'table-color-1':(scope.row.useStatus == '超时未归还'?'table-color-2':'')">{{scope.row.useStatus}}</span></template>
  30. </el-table-column>
  31. <el-table-column label="操作人" align="center" prop="operator" width="220" show-overflow-tooltip/>
  32. <!--<el-table-column label="双人验证" align="center" prop="verify" width="220" show-overflow-tooltip>-->
  33. <!--<template slot-scope="scope">-->
  34. <!--{{scope.row.verify?scope.row.verify:'无'}}-->
  35. <!--</template>-->
  36. <!--</el-table-column>-->
  37. <el-table-column label="操作" align="center" prop="operator" width="100">
  38. <template slot-scope="scope">
  39. <div class="table-button-box">
  40. <p class="table-button-null"></p>
  41. <p class="table-button-p"
  42. @click="goPageInfo(2,scope.row)"
  43. >详情</p>
  44. <p class="table-button-null"></p>
  45. </div>
  46. </template>
  47. </el-table-column>
  48. </el-table>
  49. <div style="display: flex;height:32px;margin-top:15px;">
  50. <!--<p style="flex:4;"></p>-->
  51. <p style="text-align: left;margin:0;line-height:32px;margin-right:20px;font-size:14px;color:#999;">
  52. <i class="el-icon-warning" style="color:#0183FA;"></i>
  53. 已选择 {{selectedNum}} 项
  54. </p>
  55. <div style="flex:5;">
  56. <pagination :page-sizes="[20, 30, 40, 50]"
  57. v-show="total>0"
  58. :total="total"
  59. style="margin:0;"
  60. :page.sync="queryParams.pageNum"
  61. :limit.sync="queryParams.pageSize"
  62. @pagination="getList"
  63. />
  64. </div>
  65. </div>
  66. </div>
  67. </div>
  68. <info-page :infoData="infoData" v-if="pageType == 2"></info-page>
  69. </div>
  70. </template>
  71. <script>
  72. import { classifyList,getNoauthList,getHxpUserecordList,getQueryDetail } from "@/api/medicUniversity-3_1/index";
  73. import { listDepartments } from "@/api/system/dept";
  74. import advancedSearch from "@/components/ZDcomponents/advancedSearch.vue"
  75. import infoPage from "./infoPage.vue"
  76. export default {
  77. name: "usageRecord",
  78. components: {
  79. advancedSearch,
  80. infoPage
  81. },
  82. data() {
  83. return {
  84. pageType:1,
  85. searchData:{
  86. buttonList:[//按钮数组没有则为空
  87. {
  88. type:"3", //按钮类型 1.按钮 2.导入 3.导出
  89. parameter:"export",//按钮字符用于返回方法时的判断
  90. hasPermi:['chemical:hxpUserecord:export'] // 权限字段 如果没有则传空字符 hasPermi:"",
  91. },
  92. ],
  93. searchList:[//搜索数组
  94. {
  95. name:"关键字",//描述名称
  96. key:"searchValue",//键名 用于返回数据
  97. value:"",//内容 用于组件内绑定数据
  98. placeholder:"化学品名/别名/CAS号/编号/实验室",//输入提示
  99. level:"1",//1.普通搜索 2.高级搜索 普通搜索默认会在高级搜索时显示
  100. type:"1",//类型 1.input 2.select 3.TimePicker
  101. universal:'20',//通用参数 input时为最大长度 //TimePicker时可不传
  102. labelWidth:'68px',//label-width宽度 可传可不传 不传时为默认宽度
  103. width:'260',//el-form-item 长度 可传可不传 不传时input/select默认180长度 TimePicker默认240长度
  104. },
  105. {
  106. name:"化学品分类",//描述名称
  107. key:"chemicalClassify",//键名 用于返回数据
  108. value:"",//内容 用于组件内绑定数据
  109. placeholder:"请选择化学品分类",//输入提示
  110. level:"2",//1.普通搜索 2.高级搜索 普通搜索默认会在高级搜索时显示
  111. type:"2",//类型 1.input 2.select 3.TimePicker
  112. universal:[],
  113. width:'200',//el-form-item 长度 可传可不传 不传时input/select默认180长度 TimePicker默认240长度
  114. },
  115. {
  116. name:"学院",//描述名称
  117. key:"deptId",//键名 用于返回数据
  118. value:"",//内容 用于组件内绑定数据
  119. placeholder:"请选择学院",//输入提示
  120. level:"2",//1.普通搜索 2.高级搜索 普通搜索默认会在高级搜索时显示
  121. type:"2",//类型 1.input 2.select 3.TimePicker
  122. universal:[],
  123. width:'175',//el-form-item 长度 可传可不传 不传时input/select默认180长度 TimePicker默认240长度
  124. },
  125. {
  126. name:"化学品柜",//描述名称
  127. key:"cabinetId",//键名 用于返回数据
  128. value:"",//内容 用于组件内绑定数据
  129. placeholder:"请选择化学品柜",//输入提示
  130. level:"1",//1.普通搜索 2.高级搜索 普通搜索默认会在高级搜索时显示
  131. type:"2",//类型 1.input 2.select 3.TimePicker
  132. universal:[],
  133. width:'175',//el-form-item 长度 可传可不传 不传时input/select默认180长度 TimePicker默认240长度
  134. },
  135. {
  136. name:"属性",//描述名称
  137. key:"classifyAttribute",//键名 用于返回数据
  138. value:"",//内容 用于组件内绑定数据
  139. placeholder:"请选择属性",//输入提示
  140. level:"2",//1.普通搜索 2.高级搜索 普通搜索默认会在高级搜索时显示
  141. type:"2",//类型 1.input 2.select 3.TimePicker
  142. universal:[],
  143. width:'175',//el-form-item 长度 可传可不传 不传时input/select默认180长度 TimePicker默认240长度
  144. },
  145. {
  146. name:"状态",//描述名称
  147. key:"useStatus",//键名 用于返回数据
  148. value:"",//内容 用于组件内绑定数据
  149. placeholder:"请选择状态",//输入提示
  150. level:"1",//1.普通搜索 2.高级搜索 普通搜索默认会在高级搜索时显示
  151. type:"2",//类型 1.input 2.select 3.TimePicker
  152. universal:[ //通用参数 select时为列表数据 //TimePicker时可不传
  153. {label:"使用中",value:"1"},{label:"超时未归还",value:"2"},{label:"已归还",value:"0"},
  154. ],
  155. width:'175',//el-form-item 长度 可传可不传 不传时input/select默认180长度 TimePicker默认240长度
  156. },
  157. {
  158. name:"标签类型",//描述名称
  159. key:"labelType",//键名 用于返回数据
  160. value:"",//内容 用于组件内绑定数据
  161. placeholder:"请选择标签类型",//输入提示
  162. level:"2",//1.普通搜索 2.高级搜索 普通搜索默认会在高级搜索时显示
  163. type:"2",//类型 1.input 2.select 3.TimePicker
  164. universal:[ //通用参数 select时为列表数据 //TimePicker时可不传
  165. {label:"RFID",value:"1"},{label:"二维码",value:"2"}
  166. ],
  167. labelWidth:'68px',//label-width宽度 可传可不传 不传时为默认宽度
  168. width:'260',//el-form-item 长度 可传可不传 不传时input/select默认180长度 TimePicker默认240长度
  169. },
  170. {
  171. name:"领用时间",//描述名称
  172. key:"timeOne",//键名 用于返回数据
  173. value:"",//内容 用于组件内绑定数据
  174. placeholder:"请选择领用时间",//输入提示
  175. level:"2",//1.普通搜索 2.高级搜索 普通搜索默认会在高级搜索时显示
  176. type:"3",//类型 1.input 2.select 3.TimePicker
  177. labelWidth:'82px',//label-width宽度 可传可不传 不传时为默认宽度
  178. width:'240',//el-form-item 长度 可传可不传 不传时input/select默认180长度 TimePicker默认240长度
  179. },
  180. {
  181. name:"归还时间",//描述名称
  182. key:"timeTwo",//键名 用于返回数据
  183. value:"",//内容 用于组件内绑定数据
  184. placeholder:"请选择归还时间",//输入提示
  185. level:"2",//1.普通搜索 2.高级搜索 普通搜索默认会在高级搜索时显示
  186. type:"3",//类型 1.input 2.select 3.TimePicker
  187. labelWidth:'82px',//label-width宽度 可传可不传 不传时为默认宽度
  188. width:'240',//el-form-item 长度 可传可不传 不传时input/select默认180长度 TimePicker默认240长度
  189. },
  190. ],
  191. },
  192. // 搜索实际发送数据
  193. queryParams:{
  194. pageNum:1,
  195. pageSize:20,
  196. },
  197. //数据数量
  198. total:0,
  199. //数据数组
  200. tableList:[],
  201. //表格扩展选择器---需要在@selection-change绑定的方法内监控selection数组长度
  202. selectedNum:0,
  203. // 选中数组
  204. ids: [],
  205. // 非单个禁用
  206. single: true,
  207. // 非多个禁用
  208. multiple: true,
  209. //详情组件传参
  210. infoData:{},
  211. };
  212. },
  213. created() {
  214. },
  215. mounted(){
  216. this.classifyList();
  217. this.listDepartments();
  218. this.getNoauthList();
  219. this.getHxpClassifyattribute();
  220. this.getList();
  221. },
  222. methods: {
  223. //操作按钮
  224. goPageInfo(type,row){
  225. if(type == 1){
  226. this.$set(this,'pageType',1);
  227. this.$set(this,'infoData',{});
  228. }else if(type == 2){
  229. this.getQueryDetail(row);
  230. }
  231. },
  232. getQueryDetail(row){
  233. getQueryDetail(row.id).then(response => {
  234. this.$set(this,'infoData',response.data);
  235. this.$set(this.infoData,'useStatus',row.useStatus);
  236. this.$set(this.infoData,'collectTime',row.collectTime);
  237. this.$set(this.infoData,'returnTime',row.returnTime);
  238. this.$set(this.infoData,'operator',row.operator);
  239. this.$set(this,'pageType',2);
  240. });
  241. },
  242. //获取属性列表
  243. getHxpClassifyattribute(){
  244. this.getDicts("hxp_classifyattribute").then(response => {
  245. let list = [];
  246. for(let i=0;i<response.data.length;i++){
  247. let obj ={
  248. value:response.data[i].dictValue,
  249. label:response.data[i].dictLabel,
  250. }
  251. list.push(obj);
  252. }
  253. this.$set(this.searchData.searchList[4],'universal',list);
  254. })
  255. },
  256. //获取化学品柜列表
  257. getNoauthList(){
  258. getNoauthList({}).then(response => {
  259. let list = [];
  260. for(let i=0;i<response.data.length;i++){
  261. let obj ={
  262. value:response.data[i].id,
  263. label:response.data[i].cabinetName,
  264. }
  265. list.push(obj);
  266. }
  267. this.$set(this.searchData.searchList[3],'universal',list);
  268. });
  269. },
  270. //获取学院列表
  271. listDepartments(){
  272. listDepartments().then(response => {
  273. let list = [];
  274. for(let i=0;i<response.data.length;i++){
  275. let obj ={
  276. value:response.data[i].deptId,
  277. label:response.data[i].deptName,
  278. }
  279. list.push(obj);
  280. }
  281. this.$set(this.searchData.searchList[2],'universal',list);
  282. });
  283. },
  284. //获取化学品分类列表
  285. classifyList(){
  286. classifyList().then(response => {
  287. let list = [];
  288. for(let i=0;i<response.rows.length;i++){
  289. let obj ={
  290. value:response.rows[i].id,
  291. label:response.rows[i].classifyName,
  292. }
  293. list.push(obj);
  294. }
  295. this.$set(this.searchData.searchList[1],'universal',list);
  296. });
  297. },
  298. getList(){
  299. getHxpUserecordList(this.queryParams).then(response => {
  300. this.total = response.total;
  301. this.tableList = response.rows;
  302. });
  303. },
  304. //父组件必要此方法用于接收参数
  305. searchClick(type,data){
  306. let self = this;
  307. if(type == 1){ //type 1.查询
  308. this.queryParams = JSON.parse(JSON.stringify(data));
  309. if(data.timeOne){
  310. this.queryParams.collectTimeBegin = data.timeOne[0];
  311. this.queryParams.collectTimeEnd = data.timeOne[1];
  312. delete this.queryParams.timeOne
  313. }else{
  314. delete this.queryParams.timeOne
  315. }
  316. if(data.timeTwo){
  317. this.queryParams.returnTimeBegin = data.timeTwo[0];
  318. this.queryParams.returnTimeEnd = data.timeTwo[1];
  319. delete this.queryParams.timeTwo
  320. }else{
  321. delete this.queryParams.timeTwo
  322. }
  323. this.queryParams.pageNum = 1;
  324. this.queryParams.pageSize = 20;
  325. this.getList();
  326. }else if(type == 2){ //type 1.重置
  327. this.queryParams = {
  328. pageNum : 1,
  329. pageSize:20,
  330. };
  331. this.getList();
  332. }else if(type == 'export'){ //type 其他 自定义按钮
  333. let currentDate = this.getCurrentTime()
  334. if(data == 1){
  335. //导出全部
  336. self.$confirm(`确认导出全部数据?`, "提示", {
  337. confirmButtonText: "确定",
  338. cancelButtonText: "取消",
  339. type: "warning"
  340. }).then(async () => {
  341. self.download('/chemical/hxpUserecord/export/', {...self.queryParams}, '使用记录-'+currentDate+'.xlsx')
  342. }).catch(() => {})
  343. }else if(data == 2){
  344. //导出选中
  345. if(self.ids.length>0) {
  346. self.$confirm(`确认导出选中数据?`, "提示", {
  347. confirmButtonText: "确定",
  348. cancelButtonText: "取消",
  349. type: "warning"
  350. }).then(async () => {
  351. let ids = self.ids.join(',');
  352. let obj = {
  353. ids :ids
  354. }
  355. self.download(`/chemical/hxpUserecord/export/`,obj, '使用记录-'+currentDate+'.xlsx')
  356. }).catch(() => {})
  357. }else {
  358. this.msgError('请选择要导出的数据')
  359. }
  360. }
  361. }
  362. },
  363. /** 当前时间 */
  364. getCurrentTime () {
  365. const yy = new Date().getFullYear()
  366. const mm = new Date().getMonth() + 1
  367. const dd = new Date().getDate()
  368. const hh = new Date().getHours()
  369. const mf = new Date().getMinutes() < 10 ? '0' + new Date().getMinutes() : new Date().getMinutes()
  370. const ss = new Date().getSeconds() < 10 ? '0' + new Date().getSeconds() : new Date().getSeconds()
  371. return yy + '-' + mm + '-' + dd
  372. },
  373. // 多选框选中数据
  374. handleSelectionChange(selection) {
  375. this.selectedNum = selection.length;
  376. this.ids = selection.map(item => item.id);
  377. this.single = selection.length != 1;
  378. this.multiple = !selection.length;
  379. },
  380. /*===记录勾选数据===
  381. 需要再el-table 添加 :row-key="getRowKeys"
  382. 需要在selection 添加 :reserve-selection="true"
  383. */
  384. getRowKeys(row) {
  385. return row.id
  386. },
  387. }
  388. }
  389. </script>
  390. <style scoped lang="scss">
  391. .usageRecord{
  392. flex:1;
  393. display: flex;
  394. flex-direction: column;
  395. overflow: hidden!important;
  396. p{
  397. margin:0;
  398. padding:0;
  399. }
  400. .usageRecord-page{
  401. flex:1;
  402. display: flex;
  403. flex-direction: column;
  404. overflow: hidden!important;
  405. padding-top:20px!important;
  406. .usageRecord-min{
  407. flex:1;
  408. display: flex;
  409. flex-direction: column;
  410. overflow: hidden!important;
  411. padding:0 20px 20px!important;
  412. .table-color-1{
  413. color:#0183FA;
  414. }
  415. .table-color-2{
  416. color:#FF4D4D;
  417. }
  418. }
  419. }
  420. }
  421. </style>