index.vue 17 KB

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