area.blade.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  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. <div id="form_div"></div>
  10. <div>
  11. <button type="button" class="btn btn-outline-dark btn-sm dropdown-toggle tooltipTarget" :class="[checkData.length>0?'btn-dark text-light':'']"
  12. data-toggle="dropdown" title="导出所有页将会以搜索条件得到的筛选结果,将其全部记录(每一页)导出">
  13. 导出Excel
  14. </button>
  15. <div class="dropdown-menu">
  16. <a class="dropdown-item" @click="areaExport(false)" href="javascript:">导出勾选内容</a>
  17. <a class="dropdown-item" @click="areaExport(true)" href="javascript:">导出所有页</a>
  18. </div>
  19. <button class="ml-1 btn btn-sm btn-outline-primary" data-toggle="modal" data-target="#selectedOwner">新 增</button>
  20. </div>
  21. <div>
  22. <label for="all" id="cloneCheckAll" class="d-none">
  23. <input id="all" type="checkbox" @click="checkAll($event)">全选
  24. </label>
  25. <table class="d-none" id="headerRoll"></table>
  26. <table class="table table-sm table-striped table-hover" id="headerParent">
  27. <tr class="text-nowrap" id="header"></tr>
  28. <tr v-for="(area,i) in areas">
  29. <td>
  30. <label><input type="checkbox" :value="area.id" v-model="checkData"></label>
  31. </td>
  32. <td>@{{ i+1 }}</td>
  33. <td>
  34. <span v-if="area.status=='已完成'" class="text-success">@{{ area.status }}</span>
  35. <span v-if="area.status!='已完成' && editIndex!=i"><button class="btn btn-sm btn-outline-info" @click="edit(area,i)">编辑</button></span>
  36. <span v-if="editIndex==i">
  37. <button class="btn btn-sm btn-success" @click="submitArea()">确定</button>
  38. <button class="btn btn-sm btn-danger" @click="editIndex='-1'">取消</button>
  39. </span>
  40. </td>
  41. <td>
  42. <label><select @change="thisArea.user_owner_group_id = $event.target.value" :disabled="editIndex==i ? false : true"
  43. :value="area.ownerGroupId" class="form-control form-control-sm">
  44. <option v-for="ownerGroup in ownerGroups" :value="ownerGroup.name">@{{ ownerGroup.value }}</option>
  45. </select></label>
  46. </td>
  47. <td>@{{ area.customerName }}</td>
  48. <td>@{{ area.ownerName }}</td>
  49. <td>@{{ area.countingMonth }}</td>
  50. <td>@{{ area.updatedAt }}</td>
  51. <td>@{{ area.ownerStoragePriceModel }}</td>
  52. <td>@{{ area.unitName }}</td>
  53. <td>
  54. <label><input :readonly="editIndex==i && area.unitName=='m²' ? false : true" @change="thisArea.area_on_tray = $event.target.value"
  55. type="number" min="0" class="form-control form-control-sm" :value="area.areaOnTray"></label>
  56. </td>
  57. <td>
  58. <label><input :readonly="editIndex==i && area.unitName=='m²' ? false : true" @change="thisArea.area_on_half_tray = $event.target.value"
  59. type="number" min="0" class="form-control form-control-sm" :value=area.areaOnHalfTray></label>
  60. </td>
  61. <td>
  62. <label><input :readonly="editIndex==i && area.unitName=='m²' ? false : true" @change="thisArea.area_on_flat = $event.target.value"
  63. type="number" min="0" class="form-control form-control-sm" :value="area.areaOnFlat"></label>
  64. </td>
  65. <td>
  66. <label class="form-inline"><input :readonly="editIndex==i && area.unitName!='m²' ? false : true" @change="thisArea.accounting_area = $event.target.value"
  67. type="number" min="0" class="form-control form-control-sm" :value="area.accountingArea">
  68. <label> / @{{ area.unitName }}</label>
  69. </label>
  70. </td>
  71. </tr>
  72. </table>
  73. {{$areas->appends($params)->links()}}
  74. </div>
  75. </div>
  76. @stop
  77. @section('lastScript')
  78. <script type="text/javascript" src="{{mix('js/queryForm/queryForm.js')}}"></script>
  79. <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>
  80. <script type="text/javascript" src="{{mix('js/queryForm/export.js')}}"></script>
  81. <script>
  82. let vue = new Vue({
  83. el:"#container",
  84. data:{
  85. areas : [
  86. @foreach($areas as $area)
  87. {
  88. id : "{{$area->id}}",
  89. ownerGroupId : "{{$area->user_owner_group_id}}",
  90. ownerName : "{{$area->owner ? $area->owner->name : ''}}",
  91. customerName : "{{$area->owner ? ($area->owner->customer ? $area->owner->customer->name : '') : ''}}",
  92. countingMonth : "{{$area->counting_month}}",
  93. areaOnTray : "{{$area->area_on_tray}}",
  94. areaOnHalfTray : "{{$area->area_on_half_tray}}",
  95. areaOnFlat : "{{$area->area_on_flat}}",
  96. accountingArea : "{{$area->accounting_area}}",
  97. status : "{{$area->status}}",
  98. updatedAt : "{{$area->updated_at}}",
  99. ownerStoragePriceModel:"{{ $area->ownerStoragePriceModel ? $area->ownerStoragePriceModel->using_type : '' }}",
  100. unitName:"{{ $area->ownerStoragePriceModel ? ($area->ownerStoragePriceModel->unit ? $area->ownerStoragePriceModel->unit->name : '') : '' }}",
  101. },
  102. @endforeach
  103. ],
  104. thisArea : {
  105. user_owner_group_id : "",
  106. area_on_tray : "",
  107. area_on_half_tray : "",
  108. area_on_flat : "",
  109. },
  110. ownerGroups : [
  111. @foreach($ownerGroups as $ownerGroup)
  112. {name:"{{$ownerGroup->id}}",value:"{{$ownerGroup->name}}"},
  113. @endforeach
  114. ],
  115. customers : [
  116. @foreach($customers as $customer)
  117. {name:"{{$customer->id}}",value:"{{$customer->name}}"},
  118. @endforeach
  119. ],
  120. owners : [
  121. @foreach($owners as $owner)
  122. {name:"{{$owner->id}}",value:"{{$owner->name}}"},
  123. @endforeach
  124. ],
  125. status : [{name:"编辑中",value:"编辑中"},{name:"已完成",value:"已完成"}],
  126. checkData : [],
  127. editIndex : "-1",
  128. sum : Number("{{ $areas->total() }}"),
  129. errors:[],
  130. },
  131. watch:{
  132. checkData:{
  133. handler(){
  134. if (this.checkData.length === this.areas.length){
  135. document.querySelector('#all').checked = true;
  136. document.querySelector('#all_temp').checked = true;
  137. }else {
  138. document.querySelector('#all').checked = false;
  139. document.querySelector('#all_temp').checked = false;
  140. }
  141. },
  142. deep:true
  143. }
  144. },
  145. mounted(){
  146. $('#container').removeClass('d-none');
  147. let data=[
  148. [
  149. {name:'owner_group_id',type:'select',tip:'项目小组',placeholder: '项目小组',data:this.ownerGroups},
  150. {name:'counting_month_start',type:'dateMonth',tip:'起始结算月'},
  151. {name:'owner_id',type:'select_multiple_select',tip:['输入关键词快速定位下拉列表,回车确定','选择要显示的项目'],
  152. placeholder:['项目','定位或多选项目'],data:this.owners},
  153. ],[
  154. {name:'customer_id',type:'select',tip:'客户',placeholder: '客户',data:this.customers},
  155. {name:'counting_month_end',type:'dateMonth',tip:'结束结算月'},
  156. {name:'status',type:'select',tip:'状态',placeholder: '状态',data:this.status},
  157. ],
  158. ];
  159. this.form = new query({
  160. el:"#form_div",
  161. condition:data,
  162. });
  163. this.form.init();
  164. let column = [
  165. {name:'cloneCheckAll',customization:true,type:'checkAll',column:'id',
  166. dom:$('#cloneCheckAll').removeClass('d-none'), neglect: true},
  167. {name:'index',value: '序号', neglect: true},
  168. {name:'status',value: '状态'},
  169. {name:'ownerGroupId',value: '项目组', neglect : true},
  170. {name:'customerName',value: '客户'},
  171. {name:'ownerName',value: '子项目'},
  172. {name:'countingMonth',value: '结算月'},
  173. {name:'createdAt',value: '录入时间'},
  174. {name:'ownerStoragePriceModel',value: '用仓类型'},
  175. {name:'unitName',value: '单位'},
  176. {name:'areaOnTray',value: '货物整托', neglect: true},
  177. {name:'areaOnHalfTray',value: '货物半托', neglect: true},
  178. {name:'areaOnFlat',value: '平面区', neglect: true},
  179. {name:'accountingArea',value: '结算', neglect: true},
  180. ];
  181. let _this=this;
  182. setTimeout(function () {
  183. let header = new Header({
  184. el: "#header",
  185. column: column,
  186. data: _this.reports,
  187. restorationColumn: 'id',
  188. fixedTop:($('#form_div').height())+2,
  189. offset:0.5,
  190. vue:vue
  191. });
  192. header.init();
  193. },0);
  194. },
  195. methods:{
  196. areaExport(isAll){
  197. let url = '{{url('customer/project/area/export')}}';
  198. let token='{{ csrf_token() }}';
  199. //excelExport 定义在 js/queryForm/export.js
  200. excelExport(isAll,this.checkData,url,this.sum,token);
  201. },
  202. //全选事件
  203. checkAll(e){
  204. if (e.target.checked){
  205. this.areas.forEach((el)=>{
  206. if (this.checkData.indexOf(el.id) === '-1'){
  207. this.checkData.push(el.id);
  208. }
  209. });
  210. }else {
  211. this.checkData = [];
  212. }
  213. },
  214. edit(area,index){
  215. this.editIndex = index;
  216. this.thisArea.user_owner_group_id = area.ownerGroupId;
  217. this.thisArea.area_on_tray = area.areaOnTray;
  218. this.thisArea.area_on_half_tray = area.areaOnHalfTray;
  219. this.thisArea.area_on_flat = area.areaOnFlat;
  220. this.thisArea.accounting_area = area.accountingArea;
  221. },
  222. submitArea(){
  223. window.tempTip.confirm("确认要提交该面积的更新吗?",()=>{
  224. axios.post("{{url('customer/project/updateArea')}}",{
  225. id:this.areas[this.editIndex].id,area:this.thisArea
  226. }).then(res=>{
  227. if (res.data.success){
  228. this.areas[this.editIndex].ownerGroupId = res.data.data["user_owner_group_id"];
  229. this.areas[this.editIndex].areaOnTray = res.data.data["area_on_tray"];
  230. this.areas[this.editIndex].areaOnHalfTray = res.data.data["area_on_half_tray"];
  231. this.areas[this.editIndex].areaOnFlat = res.data.data["area_on_flat"];
  232. this.areas[this.editIndex].accountingArea = res.data.data["accounting_area"];
  233. this.editIndex = '-1';
  234. this.thisArea = {
  235. user_owner_group_id : "",
  236. area_on_tray : "",
  237. area_on_half_tray : "",
  238. area_on_flat : "",
  239. };
  240. window.tempTip.setDuration(2000);
  241. window.tempTip.showSuccess("修改成功");
  242. return;
  243. }
  244. window.tempTip.setDuration(3000);
  245. window.tempTip.show(res.data.data);
  246. }).catch(err=>{
  247. window.tempTip.setDuration(3000);
  248. window.tempTip.show("网络错误:"+err);
  249. })
  250. });
  251. },
  252. createReport(isAll = false){
  253. let dom = $("#owners");
  254. let val = dom.selectpicker('val');
  255. if (isAll){
  256. val = [];
  257. this.owners.forEach(owner=>{
  258. val.push(owner.name);
  259. });
  260. }
  261. window.tempTip.setDuration(3000);
  262. window.tempTip.setIndex(1099);
  263. if (val.length<1){
  264. window.tempTip.show("未选择");
  265. return;
  266. }
  267. let url="{{url('customer/project/createAreaReport')}}";
  268. let params = {val:val};
  269. window.tempTip.postBasicRequest(url,params,res=>{
  270. res.forEach(data =>{
  271. if (this.areas.every(area=>{
  272. if (area.id == data.id)return false;
  273. else return true;
  274. }))this.areas.unshift(data);
  275. });
  276. dom.selectpicker('val',[]);
  277. return "已生成报表";
  278. },true)
  279. },
  280. },
  281. });
  282. </script>
  283. @stop