statistic.blade.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  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(1)" href="javascript:">导出勾选内容</a>
  80. <a class="dropdown-item" @click="processStatisticExport(2)" 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. </tr>
  114. <tr v-for="(processStatistic,i) in processStatistics" :class="processStatistic.gross_profit_rate?'text-success':''">
  115. <td><input class="checkItem" type="checkbox" :value="processStatistic.process_id" v-model="checkData"></td>
  116. <td>@{{ i+1 }}</td>
  117. <td v-if="processStatistic.process">@{{ processStatistic.process.code }}</td>
  118. <td v-if="processStatistic.process">@{{ processStatistic.process.owner_name }}</td>
  119. <td>@{{ processStatistic.started_at }}</td>
  120. <td>@{{ processStatistic.ended_at }}</td>
  121. <td v-if="processStatistic.process">@{{ processStatistic.process.unit_price }}</td>
  122. <td v-if="processStatistic.process">@{{ processStatistic.process.amount }}</td>
  123. <td v-if="processStatistic.process">@{{ processStatistic.process.completed_amount }}</td>
  124. <td>@{{ processStatistic.revenue }}</td>
  125. <td>@{{ processStatistic.duration_days }}</td>
  126. <td>@{{ processStatistic.duration_man_hours }}</td>
  127. <td v-if="processStatistic.process">@{{ processStatistic.process.process_method_name }}</td>
  128. <td>@{{ processStatistic.top_capacity }}</td>
  129. <td>@{{ processStatistic.bottom_capacity }}</td>
  130. <td>@{{ processStatistic.average_capacity }}</td>
  131. <td>@{{ processStatistic.total_cost }}</td>
  132. <td>@{{ processStatistic.gross_profit }}</td>
  133. <td><b v-if="processStatistic.gross_profit_rate">@{{ (processStatistic.gross_profit_rate)*100 | money}}%</b></td>
  134. <td v-if="processStatistic.process">@{{ processStatistic.process.status }}</td>
  135. </tr>
  136. </table>
  137. </div>
  138. @endsection
  139. @section('lastScript')
  140. <script>
  141. new Vue({
  142. el:"#statistics",
  143. data:{
  144. processStatistics:[
  145. @foreach($processStatistics as $processStatistic)
  146. {!! $processStatistic !!},
  147. @endforeach
  148. ],
  149. owners:[
  150. @foreach($owners as $owner)
  151. {!! $owner !!},
  152. @endforeach
  153. ],
  154. processMethods:[
  155. @foreach($processMethods as $processMethod)
  156. {!! $processMethod !!},
  157. @endforeach
  158. ],
  159. checkData:[],
  160. filterData:{paginate:'50',started_at:'',ended_at:'',owner_id:'',code:'',status:''},
  161. },
  162. computed:{
  163. isBeingFilterConditions:function(){
  164. for(let key in this.filterData){
  165. if(this.filterData[key]){
  166. if(key==='paginate')continue;
  167. return true
  168. }
  169. }
  170. return false;
  171. },
  172. },
  173. watch:{
  174. checkData:{
  175. handler(){
  176. if (this.checkData.length === this.processStatistics.length){
  177. document.querySelector('#all').checked = true;
  178. }else {
  179. document.querySelector('#all').checked = false;
  180. }
  181. },
  182. deep:true
  183. }
  184. },
  185. mounted:function(){
  186. this.initInputs();
  187. $(".tooltipTarget").tooltip({'trigger':'hover'});
  188. $('#statistics').removeClass('d-none');
  189. },
  190. methods: {
  191. initInputs:function(){
  192. let data=this;
  193. let uriParts =decodeURI(location.href).split("?");
  194. if(uriParts.length>1){
  195. let params = uriParts[1].split('&');
  196. params.forEach(function(paramPair){
  197. let pair=paramPair.split('=');
  198. let key = pair[0], val = pair[1];
  199. $('input[name="'+key+'"]').val(val);
  200. $('select[name="'+key+'"]').val(val);
  201. decodeURI(data.filterData[key]=val);
  202. });
  203. }
  204. },
  205. checkAll(e){
  206. if (e.target.checked){
  207. this.processStatistics.forEach(el=>{
  208. if (this.checkData.indexOf(el.process_id) == '-1'){
  209. this.checkData.push(el.process_id);
  210. }
  211. });
  212. }else {
  213. this.checkData = [];
  214. }
  215. },
  216. //提交表单
  217. submit:function(){
  218. let form = $("#optionSubmit");
  219. form.submit();
  220. },
  221. //定位客户
  222. owner_seek:function (e) {
  223. let _this=this;
  224. let $val=e.target.value;
  225. if($val==='')_this.filterData.owner_id='';
  226. else
  227. _this.owners.forEach(function (owner) {
  228. if (owner.name.includes($val)){
  229. _this.filterData.owner_id=owner.id;
  230. }
  231. });
  232. },
  233. //导出excel,因同步问题不使用formData
  234. processStatisticExport(e){
  235. let val=e;
  236. let data=this.filterData;
  237. if (val==1){
  238. if (this.checkData&&this.checkData.length<=0){
  239. tempTip.setDuration(4000);
  240. tempTip.showSuccess('没有勾选任何记录');
  241. }else{
  242. location.href="{{url('process/statistic?checkSign=')}}"+this.checkData;
  243. }
  244. } else {
  245. location.href="{{url('process/statistic?checkSign=-1&started_at=')}}"+
  246. data.started_at+"&ended_at="+data.ended_at+"&owner_id="+
  247. data.owner_id+"&code="+data.code+"&status="+data.status;
  248. }
  249. },
  250. },
  251. filters:{
  252. money:function(value){
  253. return _.round(value,2);
  254. }
  255. }
  256. });
  257. </script>
  258. @endsection