statistic.blade.php 14 KB

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