index.vue 16 KB

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