|
|
@@ -4,12 +4,12 @@
|
|
|
@section('content')
|
|
|
|
|
|
<div id="nav2">
|
|
|
- @component('rejected.menu')
|
|
|
- @can('退货管理-录入')
|
|
|
- <li class="nav-item">
|
|
|
- <a class="nav-link" href="javascript:;" :class="{active:isActive('edit',3)}">修改</a>
|
|
|
- </li> @endcan
|
|
|
- @endcomponent
|
|
|
+{{-- @component('rejected.menu')--}}
|
|
|
+{{-- @can('退货管理-录入')--}}
|
|
|
+{{-- <li class="nav-item">--}}
|
|
|
+{{-- <a class="nav-link" href="javascript:;" :class="{active:isActive('edit',3)}">修改</a>--}}
|
|
|
+{{-- </li> @endcan--}}
|
|
|
+{{-- @endcomponent--}}
|
|
|
</div>
|
|
|
<div class="container-fluid d-none" id="editPanel">
|
|
|
<div class="card mb-2">
|
|
|
@@ -28,17 +28,17 @@
|
|
|
<div class="list-group" style="max-height: 415px;overflow-y: scroll">
|
|
|
<table class="table table-sm table-striped table-info table-hover table-bordered">
|
|
|
<tr>
|
|
|
- <th>创建时间</th>
|
|
|
- <th>客户名称</th>
|
|
|
- <th>退回单号</th>
|
|
|
- <th>退回公司</th>
|
|
|
- <th>姓名</th>
|
|
|
- <th>电话</th>
|
|
|
- <th>到付费用</th>
|
|
|
- <th>订单号</th>
|
|
|
- <th>原单号</th>
|
|
|
- <th>是否入库</th>
|
|
|
- <th>备注</th>
|
|
|
+ <th class="text-center">创建时间</th>
|
|
|
+ <th class="text-center">客户名称</th>
|
|
|
+ <th class="text-center">退回单号</th>
|
|
|
+ <th class="text-center">退回公司</th>
|
|
|
+ <th class="text-center">姓名</th>
|
|
|
+ <th class="text-center">电话</th>
|
|
|
+ <th class="text-center">到付费用</th>
|
|
|
+ <th class="text-center">订单号</th>
|
|
|
+ <th class="text-center">原单号</th>
|
|
|
+ <th class="text-center">是否入库</th>
|
|
|
+ <th class="text-center">备注</th>
|
|
|
</tr>
|
|
|
<tr :class="[rejectedBill.isEditing?'bg-info':'']"
|
|
|
:data-id="rejectedBill.id" @click="editBill">
|
|
|
@@ -231,16 +231,17 @@
|
|
|
<div class="list-group">
|
|
|
<table class="table table-sm table-striped table-warning table-hover table-bordered">
|
|
|
<tr>
|
|
|
- <th>序号</th>
|
|
|
- <th>商品条码</th>
|
|
|
- <th>商品名称</th>
|
|
|
- <th>数量</th>
|
|
|
- <th>是否正品</th>
|
|
|
- <th>生产日期</th>
|
|
|
- <th>效期</th>
|
|
|
- <th>批次号</th>
|
|
|
- <th>备注</th>
|
|
|
- @can('退货管理-删除')<th></th>@endcan
|
|
|
+ <th class="text-center">序号</th>
|
|
|
+ <th class="text-center">商品条码</th>
|
|
|
+ <th class="text-center">商品名称</th>
|
|
|
+ <th class="text-center">数量</th>
|
|
|
+ <th class="text-center">是否正品</th>
|
|
|
+ <th class="text-center">生产日期</th>
|
|
|
+ <th class="text-center">效期</th>
|
|
|
+ <th class="text-center">批次号</th>
|
|
|
+ <th class="text-center">备注</th>
|
|
|
+ <th class="text-center">照片</th>
|
|
|
+ @can('退货管理-删除')<th class="text-center">操作</th>@endcan
|
|
|
</tr>
|
|
|
<tr :class="[item.isEditing?'bg-warning':'']"
|
|
|
v-for="(item,i) in items" :data-id="item.id" @click="editItem">
|
|
|
@@ -253,6 +254,14 @@
|
|
|
<td>@{{item.validity_at}}</td>
|
|
|
<td>@{{item.batch_number}}</td>
|
|
|
<td>@{{item.remark}}</td>
|
|
|
+ <td>
|
|
|
+ <div align="center" @mouseleave="removeCommonImg('common_img_'+item.id)" @mouseenter="commonImg('img_'+item.id,item.upload_files)">
|
|
|
+ <button class="btn btn-outline-secondary" @click="takePhoto(item.id,i)">拍照上传</button>
|
|
|
+ <div :id="'img_'+item.id">
|
|
|
+ <img v-for="uploadFile in item.upload_files" :src="imgPrefix+uploadFile.url+'-thumbnail.'+uploadFile.type">
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </td>
|
|
|
@can('退货管理-删除')<td><button class="btn btn-outline-danger" @click="deleteItem">删</button></td>@endcan
|
|
|
</tr>
|
|
|
</table>
|
|
|
@@ -382,14 +391,107 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
+ <div id="drag" class="col-4 p-0 " style="position:fixed;bottom: 30px;left: 10px;">
|
|
|
+ <video id="photo" width="50%" height="auto" controls></video>
|
|
|
+ <canvas id='canvas'width='400' height='300' hidden></canvas>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
@endsection
|
|
|
|
|
|
@section('lastScript')
|
|
|
<script>
|
|
|
+ //鼠标拖动 drag
|
|
|
+ $(function() {
|
|
|
+ let posX,posY;
|
|
|
+ let drag = document.getElementById("drag");
|
|
|
+ drag.onmousedown = function(e) {
|
|
|
+ posX = event.x - drag.offsetLeft; //获得横坐标x
|
|
|
+ posY = event.y - drag.offsetTop; //获得纵坐标y
|
|
|
+ document.onmousemove = mousemove; //调用函数,只要一直按着按钮就能一直调用
|
|
|
+ }
|
|
|
+ document.onmouseup = function() {
|
|
|
+ document.onmousemove = null; //鼠标举起,停止
|
|
|
+ }
|
|
|
+ function mousemove(ev) {
|
|
|
+ if (ev == null) ev = window.event;
|
|
|
+ let left= (ev.clientX - posX);
|
|
|
+ let top= (ev.clientY - posY);
|
|
|
+ let pageWidth=document.body.scrollWidth;//网页正文宽度
|
|
|
+ let pageHeight=window.screen.availHeight;//屏幕工作区高度
|
|
|
+ //限定拖动区域
|
|
|
+ if (left <0)left=0;
|
|
|
+ if (left >pageWidth)left=pageWidth;
|
|
|
+ if (top <0)top=0;
|
|
|
+ if (top >pageHeight)top=pageHeight;
|
|
|
+ drag.style.left = left + "px";
|
|
|
+ drag.style.top = top + "px";
|
|
|
+ }
|
|
|
+ })
|
|
|
+ let MediaUtils = {
|
|
|
+ /**
|
|
|
+ * 获取用户媒体设备(处理兼容的问题)
|
|
|
+ * @param videoEnable {boolean} - 是否启用摄像头
|
|
|
+ * @param audioEnable {boolean} - 是否启用麦克风
|
|
|
+ * @param callback {Function} - 处理回调
|
|
|
+ */
|
|
|
+ getUserMedia: function (videoEnable, audioEnable, callback) {
|
|
|
+ navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia
|
|
|
+ || navigator.msGetUserMedia || window.getUserMedia;
|
|
|
+ let constraints = {video: videoEnable, audio: audioEnable};
|
|
|
+ if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
|
|
|
+ navigator.mediaDevices.getUserMedia(constraints).then(function (stream) {
|
|
|
+ callback(false, stream);
|
|
|
+ })['catch'](function (err) {
|
|
|
+ callback(err);
|
|
|
+ });
|
|
|
+ } else if (navigator.getUserMedia) {
|
|
|
+ navigator.getUserMedia(constraints, function (stream) {
|
|
|
+ callback(false, stream);
|
|
|
+ }, function (err) {
|
|
|
+ callback(err);
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ callback(new Error('Not support userMedia'));
|
|
|
+ }
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ * 关闭媒体流
|
|
|
+ * @param stream {MediaStream} - 需要关闭的流
|
|
|
+ */
|
|
|
+ closeStream: function (stream) {
|
|
|
+ if (typeof stream.stop === 'function') {
|
|
|
+ stream.stop();
|
|
|
+ } else {
|
|
|
+ let trackList = [stream.getAudioTracks(), stream.getVideoTracks()];
|
|
|
+
|
|
|
+ for (let i = 0; i < trackList.length; i++) {
|
|
|
+ let tracks = trackList[i];
|
|
|
+ if (tracks && tracks.length > 0) {
|
|
|
+ for (let j = 0; j < tracks.length; j++) {
|
|
|
+ let track = tracks[j];
|
|
|
+ if (typeof track.stop === 'function') {
|
|
|
+ track.stop();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
let vueList=new Vue({
|
|
|
el: "#editPanel",
|
|
|
data:{
|
|
|
+ imgPrefix:"{{asset("/storage")}}",
|
|
|
+ // 用于存放 MediaRecorder 对象和音频Track,关闭录制和关闭媒体设备需要用到
|
|
|
+ recorder:'',
|
|
|
+ mediaStream:'',
|
|
|
+ // 用于存放录制后的音频文件对象和录制结束回调
|
|
|
+ recorderFile:'',
|
|
|
+ stopRecordCallback:'',
|
|
|
+ // 用于存放是否开启了视频录制
|
|
|
+ videoEnabled:false,
|
|
|
+
|
|
|
status: {billCreating:true,billEditing:false,itemCreating:true,itemEditing:false
|
|
|
,editingBill:null,editingBillId:'',editingItem:null,editingItemId:''
|
|
|
,inputtingId_owner:'',endAndPackCommitEdited:false,lockingBillPanel:false,lockingIsLoadedInput:false,
|
|
|
@@ -922,6 +1024,107 @@
|
|
|
}
|
|
|
});
|
|
|
},
|
|
|
+ // 开启摄像头
|
|
|
+ enableCamera(enableVideo) {
|
|
|
+ this.videoEnabled = enableVideo;
|
|
|
+ MediaUtils.getUserMedia(enableVideo, false, function (err, stream) {
|
|
|
+ if (err) {
|
|
|
+ throw err;
|
|
|
+ } else {
|
|
|
+ let photo=document.getElementById('photo');
|
|
|
+ photo.srcObject = stream;
|
|
|
+ photo.play();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ // 关闭摄像头
|
|
|
+ closeCamera() {
|
|
|
+ let stream = document.getElementById('photo').srcObject;
|
|
|
+ let tracks = stream.getTracks();
|
|
|
+ tracks.forEach(function(track) {
|
|
|
+ track.stop();
|
|
|
+ });
|
|
|
+ document.getElementById('photo').srcObject = null;
|
|
|
+ },
|
|
|
+ //拍照
|
|
|
+ takePhoto(id,index){
|
|
|
+ this.enableCamera(true);
|
|
|
+ setTimeout(()=>{
|
|
|
+ let photo=document.getElementById('photo');
|
|
|
+ let canvas=document.getElementById('canvas');
|
|
|
+ //绘制canvas图形
|
|
|
+ canvas.getContext('2d').drawImage(photo, 0, 0, 400, 300);
|
|
|
+ let img = document.getElementById('canvas').toDataURL();
|
|
|
+ // 这里的img就是得到的图片
|
|
|
+ this.closeCamera();
|
|
|
+ let blob=this.dataUrlToBlob(img);
|
|
|
+ this.submitFile(blob,id,index);
|
|
|
+ // photo.style.display='none';
|
|
|
+ },2000)
|
|
|
+ },
|
|
|
+ dataUrlToBlob(imgDataUrl) {
|
|
|
+ let imgUrl = window.atob(imgDataUrl.split(',')[1])
|
|
|
+ let ab = new ArrayBuffer(imgUrl.length)
|
|
|
+ let ia = new Uint8Array(ab)
|
|
|
+ for (let i = 0; i < imgUrl.length; i++) {
|
|
|
+ ia[i] = imgUrl.charCodeAt(i)
|
|
|
+ }
|
|
|
+ return new Blob([ab],{type:'image/jpeg'})
|
|
|
+ },
|
|
|
+ submitFile(blob,id,index){
|
|
|
+ window.tempTip.setDuration(3000);
|
|
|
+ let formData=new FormData();
|
|
|
+ formData.append('files[]', blob,'rejected_bill_item'+id+'.jpg')
|
|
|
+ formData.append("id",id);
|
|
|
+ window.tempTip.postBasicRequest('{{url('apiLocal/rejectedBillItem/apiUpload')}}',formData,res=>{
|
|
|
+ if (this.items[index].upload_files.length===0) this.$set(this.items[index],'upload_files',res);
|
|
|
+ else this.$set(this.items[index],'upload_files',this.items[index].upload_files.concat(res));
|
|
|
+ return "上传成功";
|
|
|
+ },false,true);
|
|
|
+ },
|
|
|
+ removeCommonImg(id){
|
|
|
+ $('#'+id).remove();
|
|
|
+ },
|
|
|
+ commonImg(id,uploadFiles){
|
|
|
+ let div = "";
|
|
|
+ let isBtn = '@can('运输管理-运单-图片删除') true @endcan ';
|
|
|
+ for(let i=0;i<uploadFiles.length;i++){
|
|
|
+ let btn = isBtn ? "<button type='button' class='btn btn-sm btn-danger' onclick='vueList.btnDeleteImg(this)' data-url='"+uploadFiles[i].url+"' value='"+id+"' style='position: relative;float: right;margin-top: -30px;' >删除</button>" : "";
|
|
|
+ let href = this.imgPrefix+uploadFiles[i].url+'-bulky.'+uploadFiles[i].type;
|
|
|
+ let src = this.imgPrefix+uploadFiles[i].url+'-common.'+uploadFiles[i].type;
|
|
|
+ div += "<div><a target='_blank' href='"+href+"'><img alt='#' src='"+src+"' style='position: relative;' ></a>"+btn+"</div>"
|
|
|
+ }
|
|
|
+ $('#'+id).after(
|
|
|
+ "<div id=\"common_"+id+"\" style='position: absolute;padding-bottom: 2px;z-index: 99'>" +
|
|
|
+ "<div style='position:absolute;left: -50px' class='overflow-y-scrollbar-200'>"+div+
|
|
|
+ "</div></div>");
|
|
|
+ },
|
|
|
+ btnDeleteImg(e){
|
|
|
+ let idstr = $(e).val();
|
|
|
+ let id = idstr.substr( idstr.indexOf('_')+1);
|
|
|
+ let url = e.getAttribute("data-url");
|
|
|
+ if (!confirm('确定要删除所选图片吗?'))return;
|
|
|
+ this.destroyImg(id,url);
|
|
|
+ },
|
|
|
+ destroyImg(id,url = null){
|
|
|
+ window.tempTip.postBasicRequest('{{url('apiLocal/rejectedBillItem/apiDeleteImg')}}',{id:id,url:url},()=>{
|
|
|
+ if (url){
|
|
|
+ this.items.some((item,i)=>{
|
|
|
+ if (item.id==id){
|
|
|
+ item.upload_files.some((file,j)=>{
|
|
|
+ if (file.url === url){this.$delete(this.items[i].upload_files,j);return true;}
|
|
|
+ });
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }else{
|
|
|
+ this.items.forEach((item,i)=>{
|
|
|
+ if (id.includes(item.id))this.$set(this.items[i],'upload_files',[]);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ return "删除成功";
|
|
|
+ });
|
|
|
+ },
|
|
|
},
|
|
|
filters:{
|
|
|
isLoaded:function (value) {
|