Bladeren bron

排序组件完善,录入允许单据号为空

Zhouzhendong 5 jaren geleden
bovenliggende
commit
25f930b2c1

+ 1 - 3
app/Http/Controllers/ProcessController.php

@@ -1004,7 +1004,7 @@ class ProcessController extends Controller
             if (!is_object($owner)){
                 $str = $owner;
                 if (!$str) throw new \Exception('未找到货主!');
-                $owner=Owner::where('code',$str)->orWhere('name',$str)->first();
+                $owner=Owner::query()->where('code',$str)->orWhere('name',$str)->first();
                 if (!$owner){
                     $owner = Owner::create([
                         'code' => $str,
@@ -1121,7 +1121,6 @@ class ProcessController extends Controller
 
     public function validatorProcessContent(array $processContent){
         $validator=Validator::make($processContent,[
-            'wms_code'=>['required'],
             'commodity_id'=>['required','integer'],
             'bill_type'=>['required'],
             'amount'=>['required','min:0','max:999999','integer']
@@ -1131,7 +1130,6 @@ class ProcessController extends Controller
             'integer'=>':attribute 必须为整数',
             'max'=>':attribute 输入值过大',
         ],[
-            'wms_code'=>'单据号',
             'commodity_id'=>'商品',
             'bill_type'=>'单据类型',
             'amount'=>'商品数量',

+ 2 - 2
database/migrations/2020_03_25_164101_create_processes_additional_bills_table.php

@@ -15,7 +15,7 @@ class CreateProcessesAdditionalBillsTable extends Migration
      */
     public function up()
     {
-        Schema::create('processes_additional_bills', function (Blueprint $table) {
+        Schema::create('processes_contents', function (Blueprint $table) {
             $table->bigIncrements('id');
             $table->bigInteger('process_id')->index()->comment('外键二次加工单');
             $table->string('wms_code')->index()->comment('单据号');
@@ -32,6 +32,6 @@ class CreateProcessesAdditionalBillsTable extends Migration
      */
     public function down()
     {
-        Schema::dropIfExists('processes_additional_bills');
+        Schema::dropIfExists('processes_contents');
     }
 }

+ 32 - 0
database/migrations/2020_08_12_143542_change_processes_contents_column_wms_code.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeProcessesContentsColumnWmsCode extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('processes_contents',function (Blueprint $table){
+            $table->string('wms_code')->nullable()->change();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('processes_contents',function (Blueprint $table){
+            $table->string('wms_code')->nullable(false)->change();
+        });
+    }
+}

+ 71 - 9
resources/js/queryForm/header.js

@@ -1,8 +1,10 @@
-require('../utilities/sort.js');
-const header = function (object) {
+window.sort=require('../utilities/sort');
+window.Header = function getHeader(object) {
+    this.object = object;
     this._header = object.el || '#header';
     this._column = object.column;
     this._data = object.data;
+    this._restorationColumn = object.restorationColumn;
 
     let _this = this;
     let _parentNode = $(_this._header);
@@ -37,26 +39,86 @@ const header = function (object) {
             if (column.customization){
                 _parentNode.append(column.dom);
             }else{
-                let _td = "<th";
-                if (column.style) _td += " style='"+column.style+"'"
-                _td += ">"+column.value;
+                let _td = "<th style='cursor: pointer;";
+                if (column.style) _td += column.style;
+                _td += "'>";
+                if(!column.neglect){
+                    _td += "<span class='fa fa-sort' id='sort_"+column.name+"'></span>";
+                }
+                _td += column.value;
                 _td += "</th>";
                 _parentNode.append(_td);
                 if (!column.neglect){
-                    $(_td).click(function () {
+                    $('#sort_'+column.name).on('click',function () {
                         if (!sortType[column.name]){
                             sortType[column.name] = 'asc';
                             columnArr.push(column.name);
+                            $('#sort_'+column.name).removeClass('fa-sort').addClass('fa-sort-asc');
+                            let columnArrTemp = [];
+                            columnArrTemp.push.apply(columnArrTemp,columnArr);
+                            window.sort.sort(_this._data,columnArrTemp,sortType);
+                            return ;
+                        }
+                        if (sortType[column.name] === 'asc'){
+                            sortType[column.name] = 'desc';
+                            $('#sort_'+column.name).removeClass('fa-sort-asc').addClass('fa-sort-desc');
+                            let columnArrTemp = [];
+                            columnArrTemp.push.apply(columnArrTemp,columnArr);
+                            window.sort.sort(_this._data,columnArrTemp,sortType);
+                            return ;
                         }
-                        if (sortType[column.name] === 'asc') sortType[column.name] = 'desc';
                         if (sortType[column.name] === 'desc'){
                             delete sortType[column.name];
-                            delete columnArr[column.name];
+                            columnArr.some(function (name, index) {
+                                if (name === column.name){
+                                    columnArr.splice(index,1);
+                                    return true;
+                                }
+                            });
+                            $('#sort_'+column.name).removeClass('fa-sort-desc').addClass('fa-sort');
+                            if (columnArr.length === 0){
+                                //希尔排序
+                                let arr = [];
+                                arr.push.apply(arr,_this._data);
+                                let len = arr.length;
+                                for(let gap = Math.floor(len / 2); gap > 0; gap = Math.floor(gap / 2)) {
+                                    for(let i = gap; i < len; i++) {
+                                        let j = i;
+                                        let current = arr[i];
+                                        while(j - gap >= 0 && current[_this._restorationColumn] < arr[j - gap][_this._restorationColumn]) {
+                                            arr[j] = arr[j - gap];
+                                            j = j - gap;
+                                        }
+                                        arr[j] = current;
+                                    }
+                                }
+                                //插入排序
+                                /*let preIndex, current;
+                                for(let i = 1; i < len; i++) {
+                                    preIndex = i - 1;
+                                    current = arr[i];
+                                    while(preIndex >= 0 && arr[preIndex][_this._restorationColumn] > current[_this._restorationColumn]) {
+                                        arr[preIndex + 1] = arr[preIndex];
+                                        preIndex--;
+                                    }
+                                    arr[preIndex + 1] = current;
+                                }*/
+                                _this._data.length = 0;
+                                _this._data.push.apply(_this._data,arr);
+                                return;
+                            }
+                            let columnArrTemp = [];
+                            columnArrTemp.push.apply(columnArrTemp,columnArr);
+                            window.sort.sort(_this._data,columnArrTemp,sortType);
+                            return ;
                         }
-                        sort(_this._data,columnArr,sortType);
                     });
                 }
             }
         });
     }
+    this.init = function() {
+        parentNodeFloat();
+        append();
+    }
 };

+ 61 - 57
resources/js/utilities/sort.js

@@ -1,62 +1,66 @@
-var result = [];
-var type = {};
-function parse(array , column , i) {
-    let data = {};
-    data['0']='';data['1']='';data['2']='';data['3']='';data['4']='';data['5']='';data['6']='';data['7']='';data['8']='';
-    data['9']='';data['a']='';data['b']='';data['c']='';data['d']='';data['e']='';data['f']='';data['g']='';data['h']='';
-    data['i']='';data['j']='';data['k']='';data['l']='';data['m']='';data['n']='';data['o']='';data['p']='';data['q']='';
-    data['r']='';data['s']='';data['t']='';data['u']='';data['v']='';data['w']='';data['x']='';data['y']='';data['z']='';
-    data['A']='';data['B']='';data['C']='';data['D']='';data['E']='';data['F']='';data['G']='';data['H']='';data['I']='';
-    data['J']='';data['K']='';data['L']='';data['M']='';data['N']='';data['O']='';data['P']='';data['Q']='';data['R']='';
-    data['S']='';data['T']='';data['U']='';data['V']='';data['W']='';data['X']='';data['Y']='';data['Z']='';
-    array.forEach(function (obj) {
-        if (!data[obj[column].charAt(i)])  data[obj[column].charAt(i)] = [obj];
-        else data[obj[column].charAt(i)].push(obj);
-    });
-    let recursion=[];
-    for (let key in data){
-        if (!data[key]){
-            delete data[key];
-            continue;
-        }
-        if (data[key].length > 1){
-            if ( !(!data[key].some(function (value, index) {
-                return value[column] !== data[key][0][column];
-            }))){
-                recursion.push(key);
+const  sortData = {
+    result : [],
+    type : {},
+    parse(array , column , i) {
+        let _this=this;
+        let data = {};
+        data['0']='';data['1']='';data['2']='';data['3']='';data['4']='';data['5']='';data['6']='';data['7']='';data['8']='';
+        data['9']='';data['a']='';data['b']='';data['c']='';data['d']='';data['e']='';data['f']='';data['g']='';data['h']='';
+        data['i']='';data['j']='';data['k']='';data['l']='';data['m']='';data['n']='';data['o']='';data['p']='';data['q']='';
+        data['r']='';data['s']='';data['t']='';data['u']='';data['v']='';data['w']='';data['x']='';data['y']='';data['z']='';
+        data['A']='';data['B']='';data['C']='';data['D']='';data['E']='';data['F']='';data['G']='';data['H']='';data['I']='';
+        data['J']='';data['K']='';data['L']='';data['M']='';data['N']='';data['O']='';data['P']='';data['Q']='';data['R']='';
+        data['S']='';data['T']='';data['U']='';data['V']='';data['W']='';data['X']='';data['Y']='';data['Z']='';
+        array.forEach(function (obj) {
+            if (!data[obj[column].charAt(i)])  data[obj[column].charAt(i)] = [obj];
+            else data[obj[column].charAt(i)].push(obj);
+        });
+        let recursion=[];
+        for (let key in data){
+            if (!data[key]){
+                delete data[key];
+                continue;
+            }
+            if (data[key].length > 1){
+                if ( !(!data[key].some(function (value, index) {
+                    return value[column] !== data[key][0][column];
+                }))){
+                    recursion.push(key);
+                }
             }
         }
-    }
-    if (recursion.length > 0){
-        i++;
-        recursion.forEach(function (key) {
-            data[key] = this.parse(data[key] ,column , i);
-        });
-    }
-    return data;
-}
+        if (recursion.length > 0){
+            i++;
+            recursion.forEach(function (key) {
+                data[key] = _this.parse(data[key] ,column , i);
+            });
+        }
+        return data;
+    },
 
-function sort(array, column ,type, i=0 ) {
-    result = [];
-    this.type = type;
-    if (!Array.isArray(column)) column = [column];
-    let columnName = column[0];
-    column.splice(0,1);
-    merge(parse(array, columnName, i), column, columnName);
-    array.length = 0;
-    array.push.apply(array,result);
-}
+    sort:function(array, column ,type, i=0 ) {
+        this.result = [];
+        this.type = type;
+        //if (!Array.isArray(column)) column = [column];
+        let columnName = column[0];
+        column.splice(0,1);
+        this.merge(this.parse(array, columnName, i), column, columnName);
+        array.length = 0;
+        array.push.apply(array,this.result);
+    },
 
-function merge(object, subordinate = [] ,columnName = '') {
-    for (let key in object){
-        if (Array.isArray(object[key])){
-            if (object[key].length > 1 && subordinate.length > 0){
-                let subordinateName = subordinate[0];
-                subordinate.splice(0,1);
-                object[key] = merge(parse(object[key], subordinateName, 0), subordinate, subordinateName);
-            }
-            if (this.type[columnName] === 'asc') result.push.apply(result,object[key]);
-            else result.unshift.apply(result,object[key]);
-        }else merge(object[key], [] ,columnName);
+    merge(object, subordinate = [] ,columnName = '') {
+        for (let key in object){
+            if (Array.isArray(object[key])){
+                if (object[key].length > 1 && subordinate.length > 0){
+                    let subordinateName = subordinate[0];
+                    subordinate.splice(0,1);
+                    object[key] = this.merge(this.parse(object[key], subordinateName, 0), subordinate, subordinateName);
+                }
+                if (this.type[columnName] === 'asc') this.result.push.apply(this.result,object[key]);
+                else this.result.unshift.apply(this.result,object[key]);
+            }else this.merge(object[key], [] ,columnName);
+        }
     }
-}
+};
+module.exports=sortData;

+ 0 - 7
resources/sass/text.scss

@@ -49,12 +49,5 @@
     user-select: none;
 }
 .fa-sort {
-    cursor: pointer;
     opacity: 0.3;
-}
-.fa-sort-up{
-    cursor: pointer;
-}
-.fa-sort-down{
-    cursor: pointer;
 }

+ 3 - 1
resources/views/process/create.blade.php

@@ -14,7 +14,7 @@
                                 <div class="row modal-title font-weight-bold w-100 text-nowrap ml-1 noselect" id="pasteDataTitle">
                                     <span v-for="(row,i) in rows" draggable="true"
                                           @drop="drop($event,i)" @dragover="dragover($event)" @dragstart="dragstart($event,i)"
-                                          :class="row=='货主' || row=='品名' || row=='数量' || row=='SKU' ? 'text-danger' : ''"
+                                          :class="row=='货主' || row=='单据' || row=='品名' || row=='数量' || row=='SKU' ? 'text-danger' : ''"
                                           class="col-2 border" style="cursor: move">@{{ row }}</span>
                                 </div>
                             </div>
@@ -621,6 +621,8 @@
                                         _this.processContents.push(processContent);
                                         _this.commodityIds.push(processContent.commodity_id+"_"+processContent.type);
                                         if (!processContent.type) sum += Number(processContent.amount);
+                                        if (processContent.owner_id && !_this.process.owner_id)
+                                            _this.process.owner_id = processContent.owner_id;
                                     }
                                 });
                                 _this.sum += sum;

+ 57 - 39
resources/views/process/index.blade.php

@@ -165,38 +165,15 @@
                             <input id="all" type="checkbox" @click="checkAll($event)">全选
                         </label>
                     </th>
-                    <th>序号</th>
-                    <th>操作</th>
-                    <th>状态</th>
-                    <th>
-                        <span class="fa" :class="sort.code ? (sort.code=='up' ? 'fa-sort-up' : 'fa-sort-down') : 'fa-sort'" @click="sortData('code')"></span>
-                        任务号
-                    </th>
-                    <th>经手人</th>
-                    <th>
-                        <span class="fa" :class="sort.owner_name ? (sort.owner_name=='up' ? 'fa-sort-up' : 'fa-sort-down') : 'fa-sort'" @click="sortData('owner_name')"></span>
-                        货主
-                    </th>
-                    <th>加工类型</th>
-                    <th>预期数量</th>
-                    <th class="text-center">教程</th>
-                    <th>单价</th>
-                    <th>完成数量</th>
-                    <th>提交日期</th>
-                    <th style="min-width: 200px">单据类型</th>
-                    <th style="min-width: 200px">单据号</th>
-                    <th style="min-width: 100px">本单数量</th>
-                    <th style="min-width: 200px">商品条码</th>
-                    <th style="min-width: 300px">商品名称 </th>
-                    <th>备注</th>
-                    <th></th>
                 </tr>
                 <template>
-                <tr v-for="(processOne,i) in processes" :class="processOne.serial_number%2==0?'row-even':''" :id="processOne.id?processOne.id:processes[i-1].id+'-2'" :name="'process_table_'+processOne.serial_number" @mouseover="changeStyle('process_table_'+processOne.serial_number,true)" @mouseout="changeStyle('process_table_'+processOne.serial_number,false)">
+                <tr v-for="(processOne,i) in processes" :class="count(i,processes)%2==0?'row-even':''" :id="processOne.id?processOne.id:processes[i-1].id+'-2'"
+                    :name="'process_table_'+count(i,processes)" @mouseover="changeStyle('process_table_'+count(i,processes),true)"
+                    @mouseout="changeStyle('process_table_'+count(i,processes),false)">
                     <td v-if="processOne.id" :rowspan="processOne.is_multi_row?2:''">
                         <input class="checkItem" type="checkbox" :value="processOne.id" v-model="checkData">
                     </td>
-                    <td v-if="processOne.id" class="text-muted" :rowspan="processOne.is_multi_row?2:''">@{{ processOne.serial_number }}</td>
+                    <td v-if="processOne.id" class="text-muted" :rowspan="processOne.is_multi_row?2:''" >@{{ count(i,processes) }}</td>
                     <td v-if="processOne.id" style="min-width:200px;" :rowspan="processOne.is_multi_row?2:''">
                         @can("二次加工管理-审核")
                         <button v-if="!processOne.openProcessHour && (processOne.status=='待审核' || processOne.status=='已驳回')"  @mouseenter="processOne.buttonTexts.审核='审核'" @mouseleave="processOne.buttonTexts.审核='审'" class="btn btn-sm btn-outline-success" @click="audit(processOne)"><span>@{{ processOne.buttonTexts.审核 }}</span></button>@endcan
@@ -483,7 +460,7 @@
 @section('lastScript')
     <script type="text/javascript" src="{{asset('js/queryForm/export200804.js')}}"></script>
     <script type="text/javascript" src="{{asset('js/queryForm/queryForm200804.js')}}"></script>
-    <script type="text/javascript" src="{{asset('js/utilities/sort200810.js')}}"></script>
+    <script type="text/javascript" src="{{asset('js/queryForm/header.js')}}"></script>
     <script>
         new Vue({
             el:"#process",
@@ -529,7 +506,6 @@
                 date:'',
                 dateTextMap:{'start_date':'起','end_date':'终'},
                 sum:{!! $processes->total() !!},
-                sort : {},
             },
             watch:{
                 checkData:{
@@ -578,9 +554,44 @@
                 this.form = new query({
                     el:"#form_div",
                     condition:data,
-                    test : this.test,
                 });
                 this.form.init();
+                /**
+                 * column :{customization : null || bool   --是否自定义
+                 *          dom : null || element           --自定义元素
+                 *          style :  null || string         --样式
+                 *          name : null || string           --字段名,英文
+                 *          value : string                  --列名
+                 *          neglect : null || bool          --是否忽略排序
+                 *         }
+                 * */
+                let header = new Header({
+                    el:"#header",
+                    column:[
+                        {value:'序号',neglect:true},
+                        {value:'操作',neglect:true},
+                        {name:'status',value:'状态'},
+                        {name:'code',value:'任务号'},
+                        {value:'经手人',neglect:true},
+                        {name:'owner_name',value:'货主'},
+                        {name:'process_method_name',value:'加工类型'},
+                        {name:'amount',value:'预期数量'},
+                        {value:'教程',neglect:true},
+                        {name:'unit_price',value:'单价'},
+                        {name:'completed_amount',value:'完成数量'},
+                        {name:'created_at',value:'提交日期'},
+                        {value:'单据类型',neglect:true,style:'min-width:200px;'},
+                        {value:'单据号',neglect:true,style:'min-width:200px;'},
+                        {value:'本单数量',neglect:true,style:'min-width:200px;'},
+                        {value:'商品条码',neglect:true,style:'min-width:200px;'},
+                        {value:'商品名称',neglect:true,style:'min-width:200px;'},
+                        {name:'remark',value:'备注'},
+                        {value:'',neglect:true},
+                    ],
+                    data:this.processes,
+                    restorationColumn:'serial_number',
+                });
+                header.init();
             },
             methods: {
                 arrayFilter: function (processesContents, process) {
@@ -597,26 +608,30 @@
                 resetProcessData: function () {
                     let _this = this;
                     let indexs = [];
+                    let count = 0;
                     for (let i = 0; i < this.processes.length; i++) {
                         let process = this.processes[i];
                         _this.$set(_this.signs,process.code,[]);
                         process.signs.forEach(function (sign) {
                             _this.$set(_this.signs[process.code],sign.mark,true);
                         });
-                        process.serial_number = i + 1;
+                        process.serial_number = count;
                         process.processesContents.every(function (processesContent) {
                             if (processesContent.type === '成品单') _this.$set(_this.processFullSum, process.code, _this.processFullSum[process.code] ? _this.processFullSum[process.code] + 1 : 1);
                             return true;
                         });
                         if (_this.processFullSum[process.code] && _this.processFullSum[process.code] !== 0 && _this.processFullSum[process.code] !== process.processesContents.length) {
                             indexs.unshift(i);
+                            count++;
                             process.is_multi_row = true;
                         }
+                        count++;
                     }
                     indexs.forEach(function (index) {
                         let processTemp = Object.assign({}, _this.processes[index]);
                         processTemp.id = '';
                         processTemp.is_multi_row = false;
+                        processTemp.serial_number = _this.processes[index].serial_number + 1;
                         _this.processes.splice(index + 1, 0, processTemp);
                     });
                 },
@@ -624,7 +639,8 @@
                 checkAll(e) {
                     if (e.target.checked) {
                         this.processes.forEach((el, i) => {
-                            if (this.checkData.indexOf(el.id) == '-1') {
+                            if (!el.id) this.checkData.push(el.id);
+                            if (el.id && this.checkData.indexOf(el.id) == '-1') {
                                 this.checkData.push(el.id);
                             }
                         });
@@ -1585,13 +1601,15 @@
                         processDailyParticipant.readonly=true;
                     }
                 },
-                //点击排序
-                sortData(column){
-                    let type = 'up';
-                    if (this.sort[column]==='up') type = 'down';
-                    this.$set(this.sort,column,type);
-                    this.processes = sortInit(this.processes, column, type);
-                },
+                count(value,processes){
+                    let count=0;
+                    processes.every(function (process,i) {
+                        if (process.id)count++;
+                        if (i == value) return false;
+                        return true;
+                    });
+                    return count;
+                }
             },
         });
     </script>

+ 2 - 2
webpack.mix.js

@@ -12,7 +12,7 @@ const mix = require('laravel-mix');
  */
 
 mix.js('resources/js/app.js', 'public/js')
-    .sass('resources/sass/app.scss', 'public/css/app200806.css');
+    .sass('resources/sass/app.scss', 'public/css/app200811.css');
 mix.copy('resources/sass/fonts/','public/fonts');
 mix.copy('resources/icon','public/icon');
 mix.copy('resources/images','public/images');
@@ -21,5 +21,5 @@ mix.js('resources/js/trix.js','public/js/trix.js');
 mix.copy('resources/sass/trix.css','public/css/trix.css');
 mix.copy('resources/js/queryForm/queryForm.js','public/js/queryForm/queryForm200804.js');
 mix.copy('resources/js/queryForm/export.js','public/js/queryForm/export200804.js');
-mix.copy('resources/js/utilities/sort.js','public/js/utilities/sort200810.js');
+mix.js('resources/js/queryForm/header.js','public/js/queryForm/header.js');