index.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. <!--出库记录-->
  2. <template>
  3. <div class="app-container OutboundRecord">
  4. <advanced-search :searchData="searchData"></advanced-search>
  5. <div class="OutboundRecord-min">
  6. <el-table border :data="tableList" @selection-change="handleSelectionChange" ref="multipleTable" :row-key="getRowKeys">
  7. <el-table-column type="selection" width="50" align="center" :reserve-selection="true"/>
  8. <el-table-column label="出库时间" align="center" prop="outTime" width="183"/>
  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="classifyAttribute" width="220" show-overflow-tooltip/>
  14. <el-table-column label="形态" align="center" prop="chemicalShape" width="120"/>
  15. <el-table-column label="容量规格" align="center" prop="chemicalAmountUnit" width="121"/>
  16. <el-table-column label="容器规格" align="center" prop="tareUnit" width="121"/>
  17. <el-table-column label="标签类型" align="center" prop="labelType" width="121"/>
  18. <el-table-column label="标签编号" align="center" prop="tagCode" width="130"/>
  19. <el-table-column label="化学品柜" align="center" prop="cabinetName" width="200" show-overflow-tooltip/>
  20. <el-table-column label="化学品柜位置" align="center" prop="posi" width="280" show-overflow-tooltip/>
  21. <el-table-column label="出库净重" align="center" prop="outUsages" width="120"/>
  22. <el-table-column label="出库方式" align="center" prop="stockStatus" width="120"/>
  23. <!--<el-table-column label="操作人" align="center" prop="operator" width="220" show-overflow-tooltip/>-->
  24. <el-table-column label="双人验证" align="center" prop="verify" width="220" show-overflow-tooltip>
  25. <template slot-scope="scope">
  26. {{scope.row.verify?scope.row.verify:'无'}}
  27. </template>
  28. </el-table-column>
  29. <el-table-column label="操作" align="center" prop="operator" width="114" >
  30. <template slot-scope="scope" v-if="scope.row.closeLockVideo">
  31. <div class="table-button-box">
  32. <p class="table-button-null"></p>
  33. <p class="table-button-p"
  34. @click="lockVideo(scope.row)"
  35. >开关锁视频</p>
  36. <p class="table-button-null"></p>
  37. </div>
  38. </template>
  39. </el-table-column>
  40. </el-table>
  41. <div style="display: flex;height:32px;margin-top:15px;">
  42. <!--<p style="flex:4;"></p>-->
  43. <p style="text-align: left;margin:0;line-height:32px;margin-right:20px;font-size:14px;color:#999;">
  44. <i class="el-icon-warning" style="color:#0183FA;"></i>
  45. 已选择 {{selectedNum}} 项
  46. </p>
  47. <div style="flex:5;">
  48. <pagination :page-sizes="[20, 30, 40, 50]"
  49. v-show="total>0"
  50. :total="total"
  51. style="margin:0;"
  52. :page.sync="queryParams.pageNum"
  53. :limit.sync="queryParams.pageSize"
  54. @pagination="getList"
  55. />
  56. </div>
  57. </div>
  58. </div>
  59. <el-dialog :title="videoTitle" :visible.sync="videoType" v-if="videoType" :close-on-click-modal="false"
  60. width="840px" append-to-body id="operationRecord-dialog-box">
  61. <video style="width:800px;height:450px;" controls="" autoplay="" name="media" :poster="videoCover">
  62. <source :src="videoData.url" type="video/mp4">
  63. </video>
  64. </el-dialog>
  65. </div>
  66. </template>
  67. <script>
  68. import { classifyList,getNoauthList } from "@/api/medicUniversity-3_1/index";
  69. import { getListOut } from "@/api/studentApi/chemicalManagement/index";
  70. import { listDepartments } from "@/api/system/dept";
  71. import advancedSearch from "@/components/ZDcomponents/advancedSearch.vue"
  72. export default {
  73. name: "OutboundRecord",
  74. components: {
  75. advancedSearch
  76. },
  77. data() {
  78. return {
  79. videoCover:window.location.href.split('://')[0]+'://' + this.judgmentNetworkReturnAddress() + "/admin/" + localStorage.getItem('videoCover'),
  80. searchData:{
  81. searchList:[//搜索数组
  82. {
  83. name:"关键字",//描述名称
  84. key:"searchValue",//键名 用于返回数据
  85. value:"",//内容 用于组件内绑定数据
  86. placeholder:"化学品名/别名/CAS号/编号/实验室",//输入提示
  87. level:"1",//1.普通搜索 2.高级搜索 普通搜索默认会在高级搜索时显示
  88. type:"1",//类型 1.input 2.select 3.TimePicker
  89. universal:'20',//通用参数 input时为最大长度 //TimePicker时可不传
  90. labelWidth:'68px',//label-width宽度 可传可不传 不传时为默认宽度
  91. width:'260',//el-form-item 长度 可传可不传 不传时input/select默认180长度 TimePicker默认240长度
  92. },
  93. {
  94. name:"化学品分类",//描述名称
  95. key:"chemicalClassify",//键名 用于返回数据
  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:"classifyAttribute",//键名 用于返回数据
  106. value:"",//内容 用于组件内绑定数据
  107. placeholder:"请选择属性",//输入提示
  108. level:"2",//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:"deptId",//键名 用于返回数据
  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:"cabinetId",//键名 用于返回数据
  126. value:"",//内容 用于组件内绑定数据
  127. placeholder:"请选择化学品柜",//输入提示
  128. level:"1",//1.普通搜索 2.高级搜索 普通搜索默认会在高级搜索时显示
  129. type:"2",//类型 1.input 2.select 3.TimePicker
  130. universal:[],
  131. width:'175',//el-form-item 长度 可传可不传 不传时input/select默认180长度 TimePicker默认240长度
  132. },
  133. {
  134. name:"出库方式",//描述名称
  135. key:"status",//键名 用于返回数据
  136. value:"",//内容 用于组件内绑定数据
  137. placeholder:"请选择出库方式",//输入提示
  138. level:"1",//1.普通搜索 2.高级搜索 普通搜索默认会在高级搜索时显示
  139. type:"2",//类型 1.input 2.select 3.TimePicker
  140. universal:[ //通用参数 select时为列表数据 //TimePicker时可不传
  141. {label:"用结",value:"2"},{label:"作废",value:"3"}
  142. ],
  143. width:'175',//el-form-item 长度 可传可不传 不传时input/select默认180长度 TimePicker默认240长度
  144. },
  145. {
  146. name:"标签类型",//描述名称
  147. key:"labelType",//键名 用于返回数据
  148. value:"",//内容 用于组件内绑定数据
  149. placeholder:"请选择标签类型",//输入提示
  150. level:"2",//1.普通搜索 2.高级搜索 普通搜索默认会在高级搜索时显示
  151. type:"2",//类型 1.input 2.select 3.TimePicker
  152. universal:[ //通用参数 select时为列表数据 //TimePicker时可不传
  153. {label:"RFID",value:"1"},{label:"二维码",value:"2"}
  154. ],
  155. labelWidth:'68px',//label-width宽度 可传可不传 不传时为默认宽度
  156. width:'260',//el-form-item 长度 可传可不传 不传时input/select默认180长度 TimePicker默认240长度
  157. },
  158. {
  159. name:"出库时间",//描述名称
  160. key:"timeOne",//键名 用于返回数据
  161. value:"",//内容 用于组件内绑定数据
  162. placeholder:"请选择出库时间",//输入提示
  163. level:"1",//1.普通搜索 2.高级搜索 普通搜索默认会在高级搜索时显示
  164. type:"3",//类型 1.input 2.select 3.TimePicker
  165. labelWidth:'82px',//label-width宽度 可传可不传 不传时为默认宽度
  166. width:'260',//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. videoType:false,
  189. videoData:{},
  190. videoTitle:"",
  191. };
  192. },
  193. created() {
  194. },
  195. mounted(){
  196. this.classifyList();
  197. this.listDepartments();
  198. this.getNoauthList();
  199. this.getHxpClassifyattribute();
  200. this.getList();
  201. },
  202. methods: {
  203. //视频按钮
  204. lockVideo(row){
  205. if(!row.closeLockVideo){
  206. this.msgError('开关锁视频异常无法观看');
  207. return
  208. }
  209. let obj = {
  210. url:window.location.href.split('://')[0]+'://' + this.judgmentNetworkReturnAddress() + "/admin/" + row.closeLockVideo
  211. }
  212. this.$set(this,'videoTitle','开关锁视频');
  213. this.$set(this,'videoData',obj);
  214. this.videoType = true;
  215. },
  216. //获取属性列表
  217. getHxpClassifyattribute(){
  218. this.getDicts("hxp_classifyattribute").then(response => {
  219. let list = [];
  220. for(let i=0;i<response.data.length;i++){
  221. let obj ={
  222. value:response.data[i].dictValue,
  223. label:response.data[i].dictLabel,
  224. }
  225. list.push(obj);
  226. }
  227. this.$set(this.searchData.searchList[2],'universal',list);
  228. })
  229. },
  230. //获取化学品柜列表
  231. getNoauthList(){
  232. getNoauthList({}).then(response => {
  233. let list = [];
  234. for(let i=0;i<response.data.length;i++){
  235. let obj ={
  236. value:response.data[i].id,
  237. label:response.data[i].cabinetName,
  238. }
  239. list.push(obj);
  240. }
  241. this.$set(this.searchData.searchList[4],'universal',list);
  242. });
  243. },
  244. //获取学院列表
  245. listDepartments(){
  246. listDepartments().then(response => {
  247. let list = [];
  248. for(let i=0;i<response.data.length;i++){
  249. let obj ={
  250. value:response.data[i].deptId,
  251. label:response.data[i].deptName,
  252. }
  253. list.push(obj);
  254. }
  255. this.$set(this.searchData.searchList[3],'universal',list);
  256. });
  257. },
  258. //获取化学品分类列表
  259. classifyList(){
  260. classifyList().then(response => {
  261. let list = [];
  262. for(let i=0;i<response.rows.length;i++){
  263. let obj ={
  264. value:response.rows[i].id,
  265. label:response.rows[i].classifyName,
  266. }
  267. list.push(obj);
  268. }
  269. this.$set(this.searchData.searchList[1],'universal',list);
  270. });
  271. },
  272. getList(){
  273. getListOut(this.queryParams).then(response => {
  274. this.total = response.total;
  275. this.tableList = response.rows;
  276. });
  277. },
  278. //父组件必要此方法用于接收参数
  279. searchClick(type,data){
  280. let self = this;
  281. if(type == 1){ //type 1.查询
  282. this.queryParams = JSON.parse(JSON.stringify(data));
  283. if(data.timeOne){
  284. this.queryParams.outTimeBegin = data.timeOne[0];
  285. this.queryParams.outTimeEnd = data.timeOne[1];
  286. delete this.queryParams.timeOne
  287. }else{
  288. delete this.queryParams.timeOne
  289. }
  290. this.queryParams.pageNum = 1;
  291. this.queryParams.pageSize = 20;
  292. this.getList();
  293. }else if(type == 2){ //type 1.重置
  294. this.queryParams = {
  295. pageNum : 1,
  296. pageSize:20,
  297. };
  298. this.getList();
  299. }else if(type == 'export'){ //type 其他 自定义按钮
  300. let currentDate = this.getCurrentTime()
  301. if(data == 1){
  302. //导出全部
  303. self.$confirm(`确认导出全部数据?`, "提示", {
  304. confirmButtonText: "确定",
  305. cancelButtonText: "取消",
  306. type: "warning"
  307. }).then(async () => {
  308. self.download('/chemical/hxpStock/exportOut/', {...self.queryParams}, '出库记录-'+currentDate+'.xlsx')
  309. }).catch(() => {})
  310. }else if(data == 2){
  311. //导出选中
  312. if(self.ids.length>0) {
  313. self.$confirm(`确认导出选中数据?`, "提示", {
  314. confirmButtonText: "确定",
  315. cancelButtonText: "取消",
  316. type: "warning"
  317. }).then(async () => {
  318. let ids = self.ids.join(',');
  319. let obj = {
  320. ids :ids
  321. }
  322. self.download(`/chemical/hxpStock/exportOut/`,obj, '出库记录-'+currentDate+'.xlsx')
  323. }).catch(() => {})
  324. }else {
  325. this.msgError('请选择要导出的数据')
  326. }
  327. }
  328. }
  329. },
  330. /** 当前时间 */
  331. getCurrentTime () {
  332. const yy = new Date().getFullYear()
  333. const mm = new Date().getMonth() + 1
  334. const dd = new Date().getDate()
  335. const hh = new Date().getHours()
  336. const mf = new Date().getMinutes() < 10 ? '0' + new Date().getMinutes() : new Date().getMinutes()
  337. const ss = new Date().getSeconds() < 10 ? '0' + new Date().getSeconds() : new Date().getSeconds()
  338. return yy + '-' + mm + '-' + dd
  339. },
  340. // 多选框选中数据
  341. handleSelectionChange(selection) {
  342. this.selectedNum = selection.length;
  343. this.ids = selection.map(item => item.id);
  344. this.single = selection.length != 1;
  345. this.multiple = !selection.length;
  346. },
  347. /*===记录勾选数据===
  348. 需要再el-table 添加 :row-key="getRowKeys"
  349. 需要在selection 添加 :reserve-selection="true"
  350. */
  351. getRowKeys(row) {
  352. return row.id
  353. },
  354. }
  355. }
  356. </script>
  357. <style scoped lang="scss">
  358. .OutboundRecord{
  359. flex:1;
  360. display: flex;
  361. flex-direction: column;
  362. overflow: hidden!important;
  363. padding-top:20px!important;
  364. p{
  365. margin:0;
  366. padding:0;
  367. }
  368. .OutboundRecord-min{
  369. flex:1;
  370. display: flex;
  371. flex-direction: column;
  372. overflow: hidden!important;
  373. padding:0 20px 20px!important;
  374. }
  375. }
  376. </style>