statistic.blade.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. @extends('layouts.app')
  2. @section('title')二次加工单统计@endsection
  3. @section('content')
  4. <span id="nav2">
  5. @component('process.menu')@endcomponent
  6. </span>
  7. <div class="d-none container-fluid" id="statistics" style="width: 2070px">
  8. <form method="GET" action="{{url('process/statistic')}}" id="optionSubmit">
  9. <table class="table table-sm table-bordered text-nowrap mb-0">
  10. <tr v-if="isBeingFilterConditions">
  11. <td colspan="10"><div class="col" style="padding:0" >
  12. <a href="{{url('process/statistic')}}"><span class="btn btn-warning text-dark">清除筛选</span></a>
  13. </div></td>
  14. </tr>
  15. <tr>
  16. <td >
  17. <select name="paginate" v-model="filterData.paginate" class="tooltipTarget form-control form-control-sm" style="vertical-align: middle;max-width: 100px" @change="submit()">
  18. <option value="50">50行</option>
  19. <option value="100">100行</option>
  20. <option value="200">200行</option>
  21. <option value="500">500行</option>
  22. <option value="1000">1000行</option>
  23. </select></td>
  24. </tr>
  25. <tr>
  26. <td style="width: 400px">
  27. <input id="started_at" name="started_at" style="max-width: 200px" v-model="filterData.started_at" type="date" class="form-control form-control-sm ">
  28. </td>
  29. <td style="width: 300px">
  30. <div class="form-inline">
  31. <input type="text" class="form-control form-control-sm tooltipTarget" placeholder="客户"
  32. style="width:70px" @input="owner_seek"
  33. title="输入关键词快速定位下拉列表,回车确定">
  34. <select name="owner_id" v-model="filterData.owner_id" @change="submit" class="form-control form-control-sm tooltipTarget">
  35. <option > </option>
  36. <option v-for="owner in owners" :value="owner.id">@{{owner.name}}</option>
  37. </select></div>
  38. </td>
  39. <td >
  40. <div class="form-inline">
  41. <label>加工类型:</label>
  42. <select name="processMethod_id" v-model="filterData.processMethod_id" style="width: 80px" @change="submit" class="form-control form-control-sm tooltipTarget">
  43. <option > </option>
  44. <option v-for="processMethod in processMethods" :value="processMethod.id">@{{processMethod.name}}</option>
  45. </select></div>
  46. </td>
  47. <td colspan="6"></td>
  48. </tr>
  49. <tr>
  50. <td >
  51. <input id="ended_at" style="max-width: 200px" name="ended_at" v-model="filterData.ended_at" type="date" class="form-control form-control-sm ">
  52. </td>
  53. <td >
  54. <input id="code" style="max-width: 200px" placeholder="任务号" name="code" v-model="filterData.code" class="form-control form-control-sm">
  55. </td>
  56. <td >
  57. <div class="form-inline">
  58. <label for="status">&nbsp;状&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;态&nbsp;:</label>
  59. <select id="status" name="status" style="max-width: 100px" v-model="filterData.status" @change="submit" class="form-control form-control-sm tooltipTarget">
  60. <option > </option>
  61. <option value="待接单">待接单</option>
  62. <option value="待加工">待加工</option>
  63. <option value="已驳回">已驳回</option>
  64. <option value="加工中">加工中</option>
  65. <option value="待验收">待验收</option>
  66. <option value="已完成">已完成</option>
  67. </select></div>
  68. </td>
  69. <td colspan="6"><input hidden type="submit"></td>
  70. </tr>
  71. <tr>
  72. <td colspan="3">
  73. <span class="dropdown">
  74. <button class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget"
  75. data-toggle="dropdown" title="导出所有页将会以搜索条件得到的筛选结果,将其全部记录(每一页)导出">
  76. 导出Excel
  77. </button>
  78. <div class="dropdown-menu">
  79. <a class="dropdown-item" @click="processStatisticExport(false)" href="javascript:">导出勾选内容</a>
  80. <a class="dropdown-item" @click="processStatisticExport(true)" href="javascript:">导出所有页</a>
  81. </div>
  82. </span>
  83. </td>
  84. </tr>
  85. </table>
  86. </form>
  87. <table class="table table-striped text-nowrap table-hover" style="background: #fff;">
  88. <tr>
  89. <th>
  90. <label for="all">
  91. <input id="all" type="checkbox" @click="checkAll($event)">全选
  92. </label>
  93. </th>
  94. <th>序号</th>
  95. <th>任务号</th>
  96. <th>货主</th>
  97. <th>开始日期</th>
  98. <th>完成日期</th>
  99. <th>单价</th>
  100. <th>预期数量</th>
  101. <th>完成数量</th>
  102. <th>完成时间</th>
  103. <th>收入合计</th>
  104. <th>完成时间(天)</th>
  105. <th>总工时</th>
  106. <th>加工类型</th>
  107. <th>最高日产能</th>
  108. <th>最低日产能</th>
  109. <th>日均产能</th>
  110. <th>合计成本</th>
  111. <th>毛利润</th>
  112. <th>毛利率</th>
  113. <th>状态</th>
  114. </tr>
  115. <tr v-for="(processStatistic,i) in processStatistics" :class="processStatistic.gross_profit_rate?'text-success':''">
  116. <td><input class="checkItem" type="checkbox" :value="processStatistic.process_id" v-model="checkData"></td>
  117. <td>@{{ i+1 }}</td>
  118. <td><span v-if="processStatistic.process">@{{ processStatistic.process.code }}</span></td>
  119. <td><span v-if="processStatistic.process">@{{ processStatistic.process.owner_name }}</span></td>
  120. <td>@{{ processStatistic.started_at }}</td>
  121. <td>@{{ processStatistic.ended_at }}</td>
  122. <td><span v-if="processStatistic.process">@{{ processStatistic.process.unit_price }}</span></td>
  123. <td><span v-if="processStatistic.process">@{{ processStatistic.process.amount }}</span></td>
  124. <td><span v-if="processStatistic.process">@{{ processStatistic.process.completed_amount }}</span></td>
  125. <td>@{{ processStatistic.revenue }}</td>
  126. <td>@{{ processStatistic.duration_days }}</td>
  127. <td><span v-if="processStatistic.process">@{{ processStatistic.duration_man_hours }}</span></td>
  128. <td><span v-if="processStatistic.process">@{{ processStatistic.process.process_method_name }}</span></td>
  129. <td>@{{ processStatistic.top_capacity }}</td>
  130. <td>@{{ processStatistic.bottom_capacity }}</td>
  131. <td>@{{ processStatistic.average_capacity }}</td>
  132. <td>@{{ processStatistic.total_cost }}</td>
  133. <td>@{{ processStatistic.gross_profit }}</td>
  134. <td><b v-if="processStatistic.gross_profit_rate">@{{ (processStatistic.gross_profit_rate)*100 | money}}%</b></td>
  135. <td><span v-if="processStatistic.process">@{{ processStatistic.process.status }}</span></td>
  136. </tr>
  137. </table>
  138. </div>
  139. @endsection
  140. @section('lastScript')
  141. <script type="text/javascript" src="{{asset('js/queryForm/export200818a.js')}}"></script>
  142. <script>
  143. new Vue({
  144. el:"#statistics",
  145. data:{
  146. processStatistics:[
  147. @foreach($processStatistics as $processStatistic)
  148. {!! $processStatistic !!},
  149. @endforeach
  150. ],
  151. owners:[
  152. @foreach($owners as $owner)
  153. {!! $owner !!},
  154. @endforeach
  155. ],
  156. processMethods:[
  157. @foreach($processMethods as $processMethod)
  158. {!! $processMethod !!},
  159. @endforeach
  160. ],
  161. checkData:[],
  162. sum:{!! $processStatistics->total() !!},
  163. filterData:{paginate:'50',started_at:'',ended_at:'',owner_id:'',code:'',status:''},
  164. },
  165. computed:{
  166. isBeingFilterConditions:function(){
  167. for(let key in this.filterData){
  168. if(this.filterData[key]){
  169. if(key==='paginate')continue;
  170. return true
  171. }
  172. }
  173. return false;
  174. },
  175. },
  176. watch:{
  177. checkData:{
  178. handler(){
  179. if (this.checkData.length === this.processStatistics.length){
  180. document.querySelector('#all').checked = true;
  181. }else {
  182. document.querySelector('#all').checked = false;
  183. }
  184. },
  185. deep:true
  186. }
  187. },
  188. mounted:function(){
  189. this.initInputs();
  190. $(".tooltipTarget").tooltip({'trigger':'hover'});
  191. $('#statistics').removeClass('d-none');
  192. },
  193. methods: {
  194. initInputs:function(){
  195. let data=this;
  196. let uriParts =decodeURI(location.href).split("?");
  197. if(uriParts.length>1){
  198. let params = uriParts[1].split('&');
  199. params.forEach(function(paramPair){
  200. let pair=paramPair.split('=');
  201. let key = pair[0], val = pair[1];
  202. $('input[name="'+key+'"]').val(val);
  203. $('select[name="'+key+'"]').val(val);
  204. decodeURI(data.filterData[key]=val);
  205. });
  206. }
  207. },
  208. checkAll(e){
  209. if (e.target.checked){
  210. this.processStatistics.forEach(el=>{
  211. if (this.checkData.indexOf(el.process_id) == '-1'){
  212. this.checkData.push(el.process_id);
  213. }
  214. });
  215. }else {
  216. this.checkData = [];
  217. }
  218. },
  219. //提交表单
  220. submit:function(){
  221. let form = $("#optionSubmit");
  222. form.submit();
  223. },
  224. //定位客户
  225. owner_seek:function (e) {
  226. let _this=this;
  227. let $val=e.target.value;
  228. if($val==='')_this.filterData.owner_id='';
  229. else
  230. _this.owners.forEach(function (owner) {
  231. if (owner.name.includes($val)){
  232. _this.filterData.owner_id=owner.id;
  233. }
  234. });
  235. },
  236. //导出excel
  237. processStatisticExport(checkAllSign){
  238. let url = '{{url('process/statistic/export')}}';
  239. let token='{{ csrf_token() }}';
  240. //excelExport 定义在 js/queryForm/export200818a.js
  241. excelExport(checkAllSign,this.checkData,url,this.sum,token);
  242. },
  243. },
  244. filters:{
  245. money:function(value){
  246. return _.round(value,2);
  247. }
  248. }
  249. });
  250. </script>
  251. @endsection