area.blade.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. @extends('layouts.app')
  2. @section('title')
  3. 用仓盘点-项目管理
  4. @endsection
  5. @section('content')
  6. @component('customer.project.menu')@endcomponent
  7. <div class="container-fluid d-none" id="container">
  8. @include("customer._selectedOwner")
  9. @include("customer.project._editArea")
  10. <!-- pc >544 -->
  11. <div class="d-none d-sm-block">
  12. <div id="form_div"></div>
  13. <div>
  14. <button type="button" class="btn btn-outline-dark btn-sm dropdown-toggle tooltipTarget" :class="[checkData.length>0?'btn-dark text-light':'']"
  15. data-toggle="dropdown" title="导出所有页将会以搜索条件得到的筛选结果,将其全部记录(每一页)导出">
  16. 导出Excel
  17. </button>
  18. <div class="dropdown-menu">
  19. <a class="dropdown-item" @click="areaExport(false)" href="javascript:">导出勾选内容</a>
  20. <a class="dropdown-item" @click="areaExport(true)" href="javascript:">导出所有页</a>
  21. </div>
  22. <button class="ml-1 btn btn-sm btn-outline-primary" data-toggle="modal" data-target="#selectedOwner">新 增</button>
  23. </div>
  24. <label for="all" id="cloneCheckAll" class="d-none">
  25. <input id="all" type="checkbox" @click="checkAll($event)">全选
  26. </label>
  27. <table class="d-none" id="headerRoll"></table>
  28. <table class="table table-sm table-striped table-hover" id="headerParent">
  29. <tr class="text-nowrap" id="header"></tr>
  30. <tr v-for="(area,i) in areas">
  31. <td>
  32. <label><input type="checkbox" :value="area.id" v-model="checkData"></label>
  33. </td>
  34. <td>@{{ i+1 }}</td>
  35. <td>
  36. <span v-if="area.status=='编辑中'">
  37. <button class="btn btn-sm btn-outline-info" @click="edit(area,i)">编辑</button>
  38. @can("项目管理-项目-用仓盘点-审核")<button class="btn btn-sm btn-outline-success" v-if="area.accountingArea" @click="audit(i)">审核</button>@endcan
  39. </span>
  40. <span v-if="area.status=='已完成'" class="text-success font-weight-bold">@{{ area.status }}</span>
  41. <span v-if="area.status=='已审核'" class="text-primary font-weight-bold">@{{ area.status }}</span>
  42. </td>
  43. <td>@{{ area.userOwnerGroupName }}</td>
  44. <td>@{{ area.customerName }}</td>
  45. <td>@{{ area.ownerName }}</td>
  46. <td>@{{ area.countingMonth }}</td>
  47. <td>@{{ area.updatedAt }}</td>
  48. <td>@{{ area.ownerStoragePriceModel }}</td>
  49. <td>@{{ area.unitName }}</td>
  50. <td>@{{ area.areaOnTray }}</td>
  51. <td>@{{ area.areaOnHalfTray }}</td>
  52. <td>@{{ area.areaOnFlat }}</td>
  53. <td>@{{ area.accountingArea }}</td>
  54. </tr>
  55. </table>
  56. </div>
  57. <!-- phone <544 -->
  58. <div class="d-xl-none">
  59. <div v-for="(area,i) in areas" class="mt-1 border border-1 rounded"
  60. @click="openAll(i)">
  61. <div class="row">
  62. <div class="col-4">
  63. <label class="text-muted">序号:</label>@{{ i+1 }}
  64. </div>
  65. <div class="col-4 text-center">
  66. <b :class="area.status=='编辑中' ? 'text-secondary' : (area.status=='已完成' ? 'text-success' : 'text-primary')">@{{ area.status }}</b>
  67. </div>
  68. <div class="col-4">
  69. <span class="pull-right mr-1 text-primary font-weight-bold small" v-if="area.unitName=='m²' && area.status=='编辑中'">点击展开编辑</span>
  70. </div>
  71. </div>
  72. <div class="row">
  73. <div class="col-6">
  74. <label class="text-muted">项目:</label>@{{ area.ownerName }}
  75. </div>
  76. <div class="col-6">
  77. <label class="text-muted">客户:</label>@{{ area.customerName }}
  78. </div>
  79. </div>
  80. <div class="row">
  81. <div class="col-6">
  82. <label class="text-muted">用仓:</label>@{{ area.ownerStoragePriceModel }}
  83. </div>
  84. <div class="col-6">
  85. <label class="text-muted">单位:</label>@{{ area.unitName }}
  86. </div>
  87. </div>
  88. <div class="row">
  89. <div class="col-6">
  90. <label class="text-muted">项目组:</label>@{{ area.userOwnerGroupName }}
  91. </div>
  92. <div class="col-6">
  93. <label class="text-muted">结算月:</label>@{{ area.countingMonth }}
  94. </div>
  95. </div>
  96. <div class="row font-weight-bold">
  97. <div class="col-6">
  98. <label class="text-dark">结算值:</label>@{{ area.accountingArea }}
  99. </div>
  100. <div class="col-6">
  101. <label class="text-dark">平面区:</label>@{{ area.areaOnFlat }}
  102. </div>
  103. </div>
  104. <div class="row font-weight-bold">
  105. <div class="col-6">
  106. <label class="text-dark">货物整托:</label>@{{ area.areaOnTray }}
  107. </div>
  108. <div class="col-6">
  109. <label class="text-dark">货物半托:</label>@{{ area.areaOnHalfTray }}
  110. </div>
  111. </div>
  112. <div :id="'area_'+i" class="up" v-if="area.unitName=='m²' && area.status=='编辑中'">
  113. <div class="row">
  114. <label class="text-dark col-4">平面区:</label>
  115. <label class="col-8">
  116. <input :id="'item-'+i+'-areaOnFlat'" class="form-control form-control-sm" type="number" step="0.01" min="0" :value="area.areaOnFlat" @click="$event.stopPropagation();">
  117. </label>
  118. </div>
  119. <div class="row">
  120. <label class="text-dark col-4">货物整托:</label>
  121. <label class="col-8">
  122. <input :id="'item-'+i+'-areaOnTray'" class="form-control form-control-sm" type="number" step="0.01" min="0" :value="area.areaOnTray" @click="$event.stopPropagation();">
  123. </label>
  124. </div>
  125. <div class="row">
  126. <label class="text-dark col-4">货物半托:</label>
  127. <label class="col-8">
  128. <input :id="'item-'+i+'-areaOnHalfTray'" class="form-control form-control-sm" type="number" step="0.01" min="0" :value="area.areaOnHalfTray" @click="$event.stopPropagation();">
  129. </label>
  130. </div>
  131. <div class="row">
  132. <div class="col-10 offset-1">
  133. @can('项目管理-项目-用仓盘点-审核')<button type="button" @click.stop="submitArea(i)" class="btn btn-sm btn-outline-primary w-100">提交编辑</button>@endcan
  134. </div>
  135. </div>
  136. </div>
  137. <div class="row mt-2" v-if="area.status=='编辑中'">
  138. <div class="col-10 offset-1">
  139. @can('项目管理-项目-用仓盘点-审核')<button type="button" @click.stop="audit(i)" class="btn btn-sm btn-outline-success w-100">审核</button>@endcan
  140. </div>
  141. </div>
  142. </div>
  143. </div>
  144. {{$areas->appends($params)->links()}}
  145. </div>
  146. @stop
  147. @section('lastScript')
  148. <script type="text/javascript" src="{{mix('js/queryForm/queryForm.js')}}"></script>
  149. <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>
  150. <script type="text/javascript" src="{{mix('js/queryForm/export.js')}}"></script>
  151. <script>
  152. let vue = new Vue({
  153. el:"#container",
  154. data:{
  155. areas : [
  156. @foreach($areas as $area)
  157. {
  158. id : "{{$area->id}}",
  159. ownerGroupId : "{{$area->user_owner_group_id}}",
  160. userOwnerGroupName : "{{$area->userOwnerGroup->name ?? ''}}",
  161. ownerName : "{{$area->owner ? $area->owner->name : ''}}",
  162. customerName : "{{$area->owner ? ($area->owner->customer ? $area->owner->customer->name : '') : ''}}",
  163. countingMonth : "{{$area->counting_month}}",
  164. areaOnTray : "{{$area->area_on_tray}}",
  165. areaOnHalfTray : "{{$area->area_on_half_tray}}",
  166. areaOnFlat : "{{$area->area_on_flat}}",
  167. accountingArea : "{{$area->accounting_area}}",
  168. status : "{{$area->status}}",
  169. updatedAt : "{{$area->updated_at}}",
  170. ownerStoragePriceModel:"{{ $area->ownerStoragePriceModel ? $area->ownerStoragePriceModel->using_type : '' }}",
  171. unitName:"{{ $area->ownerStoragePriceModel->unit->name ?? '' }}",
  172. },
  173. @endforeach
  174. ],
  175. ownerGroups : [
  176. @foreach($ownerGroups as $ownerGroup)
  177. {name:"{{$ownerGroup->id}}",value:"{{$ownerGroup->name}}"},
  178. @endforeach
  179. ],
  180. customers : [
  181. @foreach($customers as $customer)
  182. {name:"{{$customer->id}}",value:"{{$customer->name}}"},
  183. @endforeach
  184. ],
  185. owners : [
  186. @foreach($owners as $owner)
  187. {name:"{{$owner->id}}",value:"{{$owner->name}}"},
  188. @endforeach
  189. ],
  190. status : [{name:"编辑中",value:"编辑中"},{name:"已审核",value:"已审核"},{name:"已完成",value:"已完成"}],
  191. checkData : [],
  192. sum : Number("{{ $areas->total() }}"),
  193. errors:[],
  194. area:{},
  195. index:"",
  196. },
  197. watch:{
  198. checkData:{
  199. handler(){
  200. if (this.checkData.length === this.areas.length){
  201. document.querySelector('#all').checked = true;
  202. document.querySelector('#all_temp').checked = true;
  203. }else {
  204. document.querySelector('#all').checked = false;
  205. document.querySelector('#all_temp').checked = false;
  206. }
  207. },
  208. deep:true
  209. }
  210. },
  211. mounted(){
  212. $(".up").slideUp();
  213. $('#container').removeClass('d-none');
  214. let data=[
  215. [
  216. {name:'owner_group_id',type:'select',tip:'项目小组',placeholder: '项目小组',data:this.ownerGroups},
  217. {name:'counting_month_start',type:'dateMonth',tip:'起始结算月'},
  218. {name:'owner_id',type:'select_multiple_select',tip:['输入关键词快速定位下拉列表,回车确定','选择要显示的项目'],
  219. placeholder:['项目','定位或多选项目'],data:this.owners},
  220. ],[
  221. {name:'customer_id',type:'select',tip:'客户',placeholder: '客户',data:this.customers},
  222. {name:'counting_month_end',type:'dateMonth',tip:'结束结算月'},
  223. {name:'status',type:'select',tip:'状态',placeholder: '状态',data:this.status},
  224. ],
  225. ];
  226. this.form = new query({
  227. el:"#form_div",
  228. condition:data,
  229. });
  230. this.form.init();
  231. let column = [
  232. {name:'cloneCheckAll',customization:true,type:'checkAll',column:'id',
  233. dom:$('#cloneCheckAll').removeClass('d-none'), neglect: true},
  234. {name:'index',value: '序号', neglect: true},
  235. {name:'status',value: '状态'},
  236. {name:'userOwnerGroupName',value: '项目组'},
  237. {name:'customerName',value: '客户'},
  238. {name:'ownerName',value: '子项目'},
  239. {name:'countingMonth',value: '结算月'},
  240. {name:'createdAt',value: '录入时间'},
  241. {name:'ownerStoragePriceModel',value: '用仓类型'},
  242. {name:'unitName',value: '单位'},
  243. {name:'areaOnTray',value: '货物整托', neglect: true},
  244. {name:'areaOnHalfTray',value: '货物半托', neglect: true},
  245. {name:'areaOnFlat',value: '平面区', neglect: true},
  246. {name:'accountingArea',value: '结算', neglect: true},
  247. ];
  248. let _this=this;
  249. setTimeout(function () {
  250. let header = new Header({
  251. el: "#header",
  252. column: column,
  253. data: _this.reports,
  254. restorationColumn: 'id',
  255. fixedTop:($('#form_div').height())+2,
  256. offset:0.5,
  257. vue:vue
  258. });
  259. header.init();
  260. },0);
  261. },
  262. methods:{
  263. openAll(index){
  264. $("#area_"+index).slideToggle();
  265. },
  266. areaExport(isAll){
  267. let url = '{{url('customer/project/area/export')}}';
  268. let token='{{ csrf_token() }}';
  269. //excelExport 定义在 js/queryForm/export.js
  270. excelExport(isAll,this.checkData,url,this.sum,token);
  271. },
  272. //全选事件
  273. checkAll(e){
  274. if (e.target.checked){
  275. this.areas.forEach((el)=>{
  276. if (this.checkData.indexOf(el.id) === '-1'){
  277. this.checkData.push(el.id);
  278. }
  279. });
  280. }else {
  281. this.checkData = [];
  282. }
  283. },
  284. edit(area,index){
  285. $("#editArea").modal("show");
  286. this.area = Object.assign({},area);
  287. this.index = index;
  288. },
  289. submitArea(i = null){
  290. let url = "{{url('customer/project/updateArea')}}";
  291. let param = this.area;
  292. let index = this.index;
  293. if (i!==null){
  294. index = i;
  295. param = {id:this.areas[i].id,areaOnTray:document.getElementById("item-"+i+"-areaOnTray").value,
  296. areaOnHalfTray:document.getElementById("item-"+i+"-areaOnHalfTray").value,areaOnFlat:document.getElementById("item-"+i+"-areaOnFlat").value};
  297. }
  298. window.tempTip.postBasicRequest(url,param,res=>{
  299. if (this.areas[index].ownerGroupId !== res.user_owner_group_id){
  300. this.areas[index].ownerGroupId = res.user_owner_group_id;
  301. this.ownerGroups.some(group=>{
  302. if(group.name === res.user_owner_group_id){
  303. this.areas[index].userOwnerGroupName = group.value;
  304. return true;
  305. }
  306. });
  307. }
  308. this.areas[index].areaOnTray = res.area_on_tray;
  309. this.areas[index].areaOnHalfTray = res.area_on_half_tray;
  310. this.areas[index].areaOnFlat = res.area_on_flat;
  311. this.areas[index].accountingArea = res.accounting_area;
  312. $("#editArea").modal("hide");
  313. return "修改成功";
  314. },true);
  315. },
  316. createReport(isAll = false){
  317. let dom = $("#owners");
  318. let val = dom.selectpicker('val');
  319. if (isAll){
  320. val = [];
  321. this.owners.forEach(owner=>{
  322. val.push(owner.name);
  323. });
  324. }
  325. window.tempTip.setDuration(3000);
  326. window.tempTip.setIndex(1099);
  327. if (val.length<1){
  328. window.tempTip.show("未选择");
  329. return;
  330. }
  331. let url="{{url('customer/project/createAreaReport')}}";
  332. let params = {val:val};
  333. window.tempTip.postBasicRequest(url,params,res=>{
  334. res.forEach(data =>{
  335. if (this.areas.every(area=>{
  336. if (area.id == data.id)return false;
  337. else return true;
  338. }))this.areas.unshift(data);
  339. });
  340. dom.selectpicker('val',[]);
  341. return "已生成报表";
  342. },true)
  343. },
  344. audit(index){
  345. window.tempTip.confirm("确定要通过该盘点记录的审核吗?",()=>{
  346. let area = this.areas[index];
  347. let url = '{{url('customer/project/areaReportAudit')}}';
  348. window.tempTip.postBasicRequest(url,{id:area.id},()=>{
  349. this.areas[index].status = "已审核";
  350. return "审核通过";
  351. });
  352. })
  353. },
  354. },
  355. });
  356. </script>
  357. @stop