ANG YU 5 лет назад
Родитель
Сommit
adfdabf609

+ 47 - 1
app/Http/Controllers/OrderIssueController.php

@@ -20,6 +20,7 @@ use App\Services\OwnerService;
 use App\Shop;
 use App\UserWorkgroup;
 use Exception;
+use Illuminate\Database\QueryException;
 use Illuminate\Http\Request;
 use Illuminate\Support\Arr;
 use Illuminate\Support\Facades\Auth;
@@ -766,7 +767,7 @@ class OrderIssueController extends Controller
             return ['success'=>false,'error'=>'没有对应权限'];
         }
         try {
-            $bool = OrderIssue::query()->whereIn('id', $request['ids'])->update(['finance_confirm' => '是']);
+            $bool = OrderIssue::query()->whereIn('id', $request['ids'])->update(['finance_confirm' => $request->flag]);
             if($bool==false)return ['success'=>false,'error'=>'财务确认失败'];
             app('LogService')->log(__METHOD__, __FUNCTION__,'财务确认'. json_encode($request->getContent()), Auth::user()['id']);
             return ['success'=>true];
@@ -794,4 +795,49 @@ class OrderIssueController extends Controller
         return ['success' =>true];
     }
 
+    public function addUserWorkgroup(Request $request)
+    {
+        $orderIssueId = $request->orderIssueId;
+        $userWorkgroupId = $request->userWorkgroupId;
+        try {
+            OrderIssue::query()->find($orderIssueId)->userWorkgroups()->attach($userWorkgroupId);
+        } catch (QueryException $e) {
+            return ['success' => false,'data' =>'事故责任方已存在'];
+        }
+        return ['success' => true,'data' =>UserWorkgroup::find($userWorkgroupId)];
+    }
+    public function destroyUserWorkgroup(Request $request)
+    {
+        $orderIssueId = $request->orderIssueId;
+        $userWorkgroupId = $request->userWorkgroupId;
+        OrderIssue::query()->find($orderIssueId)->userWorkgroups()->detach($userWorkgroupId);
+        return ['success' => true,'data' =>UserWorkgroup::find($userWorkgroupId)];
+    }
+
+    public function batchOthers(Request $request)
+    {
+        $orderIssueIds = $request->input("orderIssueIds");
+        $data = [];
+        if ($request->input("logistic_indemnity_money")) {
+            $data['logistic_indemnity_money'] = $request->input("logistic_indemnity_money");
+        }
+        if ($request->input("logistic_express_remission")) {
+            $data['logistic_express_remission'] = $request->input("logistic_express_remission");
+        }
+        if ($request->input("baoshi_indemnity_money")) {
+            $data['baoshi_indemnity_money'] = $request->input("baoshi_indemnity_money");
+        }
+        if ($request->input("baoshi_express_remission")) {
+            $data['baoshi_express_remission'] = $request->input("baoshi_express_remission");
+        }
+        OrderIssue::query()->whereIn('id',$orderIssueIds)->update($data);
+        $userWorkGroupIds = $request->input("userWorkGroupIds");
+        if (isset($userWorkGroupIds)) {
+            $orderIssues = OrderIssue::query()->whereIn('id', $orderIssueIds)->get();
+            foreach ($orderIssues as $orderIssue) {
+                $orderIssue->userWorkGroups()->sync($userWorkGroupIds);
+            }
+        }
+        return ['success' => true];
+    }
 }

+ 6 - 0
app/OrderIssue.php

@@ -4,6 +4,7 @@ namespace App;
 
 use App\Traits\ModelTimeFormat;
 use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\Relations\BelongsToMany;
 use Illuminate\Database\Eloquent\SoftDeletes;
 
 use App\Traits\LogModelChanging;
@@ -368,4 +369,9 @@ class OrderIssue extends Model
     {
         return $this->rejectedBills()->updateExistingPivot($logistic_number,['logistic_number_return'=>$logistic_number_update]);
     }
+
+    public function userWorkgroups(): BelongsToMany
+    {
+        return $this->belongsToMany(UserWorkgroup::class);
+    }
 }

+ 13 - 1
app/Services/OrderIssueService.php

@@ -45,7 +45,7 @@ class OrderIssueService
         if ($condition['owner_id'] ?? false) {
             $owner_ids = explode(',', $condition['owner_id']);
         }
-        $query = OrderIssue::with(['top', 'userWorkGroup', 'issueType', 'logs' => function ($query) use ($arr) {
+        $query = OrderIssue::with(['top', 'userWorkgroups', 'issueType', 'logs' => function ($query) use ($arr) {
             $query->with('user')->orderByDesc('created_at');
         }, 'order' => function ($query) {
             $query->with(['shop', 'logistic', 'owner', 'packages.commodities.commodity' => function ($query) {
@@ -235,6 +235,18 @@ class OrderIssueService
             });
             $query->orWhere('second_logistic_number',$condition['sendOrderLogisticNumber']);
         }
+        if (isset($condition['finance_confirm'])) {
+            $query->where('finance_confirm', $condition['finance_confirm']);
+        }
+        if (isset($condition['user_workgroups'])) {
+
+            if (is_string($condition['user_workgroups'])) {
+                $userWorkgroupIds = explode(',', $condition['user_workgroups']);
+            }
+            $query->whereHas('userWorkgroups', function ($query) use ($userWorkgroupIds) {
+                $query->whereIn('id', $userWorkgroupIds);
+            });
+        }
         return $query;
     }
 

+ 6 - 0
app/UserWorkgroup.php

@@ -6,6 +6,7 @@ use Carbon\Carbon;
 use Illuminate\Database\Eloquent\Model;
 
 use App\Traits\LogModelChanging;
+use Illuminate\Database\Eloquent\Relations\BelongsToMany;
 
 class UserWorkgroup extends Model
 {
@@ -35,4 +36,9 @@ class UserWorkgroup extends Model
             return $this['signs']['mark'] == '是' ? true : false;
         }
     }
+
+    public function orderIssues(): BelongsToMany
+    {
+        return $this->belongsToMany(OrderIssue::class);
+    }
 }

+ 32 - 0
database/migrations/2021_01_14_174209_create_order_issue_user_workgroup_table.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateOrderIssueUserWorkgroupTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('order_issue_user_workgroup', function (Blueprint $table) {
+            $table->bigInteger('order_issue_id');
+            $table->bigInteger('user_workgroup_id')->index();
+            $table->unique(['order_issue_id', 'user_workgroup_id'],'order_issue_user_workgroup_unique');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('order_issue_user_work_group');
+    }
+}

+ 32 - 0
database/migrations/2021_01_15_175210_sync_order_issue_user_workgroup.php

@@ -0,0 +1,32 @@
+<?php
+
+use App\OrderIssue;
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class SyncOrderIssueUserWorkgroup extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        $orderIssues = OrderIssue::query()->whereNotNull('user_workgroup_id')->get();
+        foreach ($orderIssues as $orderIssue) {
+            $orderIssue->userWorkgroups()->attach($orderIssue->user_workgroup_id);
+        }
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        //
+    }
+}

+ 166 - 9
resources/views/order/issue/index.blade.php

@@ -38,6 +38,10 @@
                         <button type="button" class="btn btn-outline-dark btn-sm form-control-sm  tooltipTarget" @click="batchStoreLogsModel">
                             批量处理说明
                         </button>
+                        <span class="ml-1">
+                        <button type="button" class="btn btn-outline-dark btn-sm form-control-sm  tooltipTarget" @click="batchOthersModel">
+                            批量处理赔偿金额与事故责任方
+                        </button>
                     </span>
                     @endcan
                     <span class="ml-1">
@@ -54,9 +58,14 @@
                     @cannot('订单管理-问题件-客户不可见')
                         @can('订单管理-问题件-财务确认')
                         <span class="ml-1">
-                            <button type="button" class="btn btn-outline-dark btn-sm form-control-sm  tooltipTarget" @click="financeConfirm">
+                            <button type="button" class="btn btn-outline-dark btn-sm form-control-sm  tooltipTarget" @click="financeConfirm('是')">
                                 批量财务确认
                             </button>
+                        </span>
+                            <span class="ml-1">
+                            <button type="button" class="btn btn-outline-dark btn-sm form-control-sm  tooltipTarget" @click="financeConfirm('否')">
+                                批量财务确认取消
+                            </button>
                         </span>
                         @endcan
                         @can('订单管理-问题件-批量归档')
@@ -151,7 +160,7 @@
                         <th class="three-layer  align-middle" rowspan="2" style="min-width: 120px">宝时赔偿金额</th>
                         <th class="three-layer  align-middle" rowspan="2" style="min-width: 120px">宝时快递减免</th>
                         @cannot('订单管理-问题件-客户不可见')
-                        <th class="three-layer  align-middle" rowspan="2" style="min-width: 120px">事故责任方</th>
+                        <th class="three-layer  align-middle" rowspan="2" style="min-width: 200px">事故责任方</th>
                         <th class="align-middle" rowspan="2" style="min-width: 120px">操作</th>
                         @endcannot
                     </tr>
@@ -533,10 +542,38 @@
                         </td>
                         @cannot('订单管理-问题件-客户不可见')
                             <td class="child-layer-3">
-                                <select class="form-control form-control-sm" :value="orderIssue.user_workgroup_id" @change="updateOrderIssue(orderIssue,'user_workgroup_id',$event)">
-                                    <option value></option>
-                                    <option v-for="item in userWorkGroup" :value="item.name">@{{ item.value }}</option>
-                                </select>
+                                <table class="table table-sm">
+                                    <tr colspan="2">
+                                        <td colspan="2">
+                                            <select class="form-control form-control-sm" @change="addUserWorkgroup(orderIssue,'user_workgroup_id',$event)">
+                                                <option value></option>
+                                                <option v-for="item in userWorkGroup" :value="item.name">@{{ item.value }}</option>
+                                            </select>
+                                        </td>
+                                    </tr>
+                                    <tr v-for="(user_workgroup,j) in orderIssue.user_workgroups" v-if="j<2 || orderIssue.is_show_user_workgroup">
+                                        <td>@{{ user_workgroup.name }}</td>
+                                        <td>
+                                            <button class="btn btn-sm btn-outline-danger"
+                                                    @click="deleteUserWorkgroup(user_workgroup,j,orderIssue)">
+                                                删除
+                                            </button>
+                                        </td>
+                                    </tr>
+                                    <tr>
+                                        <td colspan="2" v-if="orderIssue.user_workgroups.length > 2">
+                                            <div class="row" @click="showUserWorkgroup(orderIssue)" v-if="orderIssue.user_workgroups.length > 2">
+                                                <label class="text-center mt-0 p-0 cursor-pointer offset-5">
+                                        <span class="fa"
+                                              :class="orderIssue.is_show_user_workgroup ? 'fa-angle-double-down' : 'fa-angle-double-right'"></span>
+                                                    &nbsp;<span v-if="orderIssue.is_show_user_workgroup">收起</span><span
+                                                        v-if="!orderIssue.is_show_user_workgroup">展开</span>共@{{ orderIssue.user_workgroups.length }} 条
+                                                </label>
+                                            </div>
+                                        </td>
+                                    </tr>
+                                </table>
+
                             </td>
                             <td>
                                 @can('订单管理-问题件-编辑')
@@ -574,6 +611,46 @@
                 </div>
             </div>
         </div>
+        <div class="modal fade" id="batchOthersModel" tabindex="-1" role="dialog" aria-labelledby="othersLabel" aria-hidden="true">
+            <div class="modal-dialog  modal-dialog-centered">
+                <div class="modal-content">
+                    <div class="modal-body">
+                        <h5 class="modal-title" id="othersLabel">承运商赔偿金额</h5>
+                        <input type="number" v-model="edit.batchOthers.logistic_indemnity_money" class="form-control form-control-sm">
+                    </div>
+                    <div class="modal-body">
+                        <h5 class="modal-title" id="othersLabel">承运商快递减免</h5>
+                        <select class="form-control form-control-sm" v-model="edit.batchOthers.logistic_express_remission">
+                            <option disabled value="">请选择</option>
+                            <option v-for="item in expressRemission" :value="item">@{{ item }}</option>
+                        </select>
+                    </div>
+                    <div class="modal-body">
+                        <h5 class="modal-title" id="othersLabel">宝时赔偿金额</h5>
+                        <input type="number" v-model="edit.batchOthers.baoshi_indemnity_money" class="form-control form-control-sm">
+                    </div>
+                    <div class="modal-body">
+                        <h5 class="modal-title" id="othersLabel">宝时快递减免</h5>
+                        <select class="form-control form-control-sm" v-model="edit.batchOthers.baoshi_express_remission">
+                            <option disabled value="">请选择</option>
+                            <option v-for="item in expressRemission" :value="item">@{{ item }}</option>
+                        </select>
+                    </div>
+
+                    <div class="modal-body" >
+                        <h5 class="modal-title" id="logsLabel">事故责任方</h5>
+                        <span v-for="item in userWorkGroup">
+                             <input v-model="edit.batchOthers.userWorkGroupIds" type="checkbox" name="vehicle" :value="item.name" /> @{{ item.value }}
+                        </span>
+                    </div>
+
+                    <div class="modal-footer">
+                        <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                        <button type="button" class="btn btn-primary" data-dismiss="modal" @click="batchOthers()">确认</button>
+                    </div>
+                </div>
+            </div>
+        </div>
 
         {{--delete OrderIssue--}}
         <div class="modal fade" id="alertModal" tabindex="-1" role="dialog" aria-labelledby="alertModalLabel"
@@ -723,6 +800,13 @@
                 message:{},
                 edit:{
                     batchStoreLogs:'',
+                    batchOthers:{
+                        logistic_indemnity_money: null ,
+                        logistic_express_remission: null,
+                        baoshi_indemnity_money: null,
+                        baoshi_express_remission: null,
+                        userWorkGroupIds: []
+                    },
                     isShow:[],
                     addSendOrderIssueID:'',
                     orderIssue: {id: null,showId:''},
@@ -735,6 +819,7 @@
                     _this.regroupOrder(orderIssue.second_order);
                     _this.regroupRejectedBill(orderIssue);
                     _this.regroupLogs(orderIssue);
+                    _this.regroupUserGroup(orderIssue);
                 });
             },
             mounted: function () {
@@ -777,6 +862,7 @@
                     },
                     {name: 'logistic_number_return', type: 'input', tip: '退回单号:前或后加百分号为单个模糊搜索,否则为多条件精确搜索', placeholder: '退回单号'},
                     {name: 'send_client_code', type: 'input', tip: '二次订单号:前或后加百分号为单个模糊搜索,否则为多条件精确搜索', placeholder: '二次订单号'},
+                    {name: 'finance_confirm', type: 'select', tip: '财务却认', placeholder: '财务却认是/否', data:[{name: '是',value:'是'},{name: '否',value:'否'}]},
                 ], [
                     {name: 'created_at_end', type: 'dateTime', tip: '登记结束日期'},
                     {name: 'consignee_name', type: 'input', tip: '收货人名称:前或后加百分号为单个模糊搜索,否则为多条件精确搜索', placeholder: '收货人名称'},
@@ -785,6 +871,7 @@
                     {name: 'good_name', type: 'input', tip: '商品名:前或后加 百分号为单个模糊搜索,否则为多条件精确搜索', placeholder: '商品名'},
                     {name: 'id_quality_label', type: 'select', tip: '是否正品', placeholder: '是否正品', data: this.qualityLabel},
                     {name: 'is_imported', type: 'select', tip: '是否导入处理', placeholder: '是否导入处理', data: imported_status},
+                    {name: 'user_workgroups', type: 'select_multiple_select', tip: ['事故责任方',''], placeholder: ['事故责任方',''], data: this.userWorkGroup},
                 ],[
                     @cannot('订单管理-问题件-客户不可见')
                     {name: 'logistic_indemnity_money', type: 'select', tip: '承运商赔偿金额', placeholder: '承运商赔偿金额',data:[{name: '是',value:'是'},{name: '否',value:'否'}]},
@@ -893,6 +980,9 @@
                         orderIssue.log_is_show = false;
                     }
                 },
+                regroupUserGroup(orderIssue){
+                    orderIssue.is_show_user_workgroup = false;
+                },
                 displayDelBtn(bool,e){
                     if(bool)$(e.target).next().removeClass('d-none');
                     else {
@@ -1332,6 +1422,14 @@
                     }
                     $("#batchStoreLogsModel").modal('show');
                 },
+                batchOthersModel(){
+                    if(this.checkData.length === 0){
+                        tempTip.setDuration(2000)
+                        tempTip.show('没有勾选内容')
+                        return;
+                    }
+                    $("#batchOthersModel").modal('show');
+                },
                 batchStoreLogs(){
                     let _this = this;
                     let data = {orderIssueIds:this.checkData,content:this.edit.batchStoreLogs};
@@ -1358,6 +1456,32 @@
                         tempTip.show('处理结果添加异常:'+error)
                     })
                 },
+                batchOthers(){
+                    let _this = this;
+                    let data = {
+                        orderIssueIds:this.checkData,
+                        logistic_indemnity_money: this.edit.batchOthers.logistic_indemnity_money,
+                        logistic_express_remission: this.edit.batchOthers.logistic_express_remission,
+                        baoshi_indemnity_money: this.edit.batchOthers.baoshi_indemnity_money,
+                        baoshi_express_remission: this.edit.batchOthers.baoshi_express_remission,
+                        userWorkGroupIds: this.edit.batchOthers.userWorkGroupIds,
+                    };
+                    window.tempTip.postBasicRequest('{{url("apiLocal/order/issue/batchOthers")}}', data, res => {
+                        if (_this.edit.batchOthers.logistic_indemnity_money) {
+                            _this.orderIssuesEdit(_this.checkData, "logistic_indemnity_money", _this.edit.batchOthers.logistic_indemnity_money);
+                        }
+                        if (_this.edit.batchOthers.logistic_express_remission) {
+                            _this.orderIssuesEdit(_this.checkData, "logistic_express_remission", _this.edit.batchOthers.logistic_express_remission);
+                        }
+                        if (_this.edit.batchOthers.baoshi_indemnity_money) {
+                            _this.orderIssuesEdit(_this.checkData, "baoshi_indemnity_money", _this.edit.batchOthers.baoshi_indemnity_money);
+                        }
+                        if (_this.edit.batchOthers.baoshi_express_remission) {
+                            _this.orderIssuesEdit(_this.checkData, "baoshi_express_remission", _this.edit.batchOthers.baoshi_express_remission);
+                        }
+                        return "批量修改完成";
+                    });
+                },
                 editSecondClientNo(orderIssue,e){
                     let value = $(e.target).val()
                     let data = {id:orderIssue.id,secondClientNo:value}
@@ -1464,23 +1588,32 @@
                         tempTip.show('处理导入出现异常'+error)
                     })
                 },
-                financeConfirm(){
+                financeConfirm(flag){
                     let _this= this
                     if(this.checkData.length === 0){
                         tempTip.setDuration(2000)
                         tempTip.show('没有勾选内容')
                         return;
                     }
-                    if(!confirm('是否进行财务确认'))return;
+                    if (flag=='是') {
+                        if (!confirm('是否进行财务确认')) return;
+                    }else{
+                        if (!confirm('是否取消财务确认')) return;
+                    }
                     let data = {ids:this.checkData};
                     tempTip.setDuration(9999);
                     tempTip.waitingTip('处理中.......');
+                    data.flag = flag;
                     axios.post('{{url('apiLocal/order/issue/financeConfirm')}}',data)
                         .then(function(response){
                             tempTip.cancelWaitingTip();
                             if(response.data.success){
                                 tempTip.setDuration(2000);
-                                tempTip.showSuccess('确认成功');
+                                if (flag=='是') {
+                                    tempTip.showSuccess('确认成功');
+                                }else{
+                                    tempTip.showSuccess('取消成功');
+                                }
                                 _this.orderIssuesEdit(data.ids,'finance_confirm','是');
                                 return;
                             }
@@ -1626,6 +1759,30 @@
                             tempTip.setDuration(2000);
                             tempTip.show(error);
                         });
+                },
+                addUserWorkgroup(orderIssue,user_workgroup_id,e) {
+                    let value = $(e.target).val()
+                    window.tempTip.postBasicRequest("{{url('apiLocal/order/issue/userWorkgroups/add')}}", {
+                        orderIssueId: orderIssue.id,
+                        userWorkgroupId: value
+                    }, res => {
+                        orderIssue.user_workgroups.unshift(res);
+                        return "添加事故责任方成功!";
+                    });
+                },
+                deleteUserWorkgroup(user_workgroup,index,orderIssue) {
+                    window.tempTip.postBasicRequest("{{url('apiLocal/order/issue/userWorkgroups/delete')}}", {
+                        orderIssueId: orderIssue.id,
+                        userWorkgroupId: user_workgroup.id
+                    }, res => {
+                        orderIssue.user_workgroups.splice(index, 1);
+                        this.$forceUpdate();
+                        return "删除事故责任方成功!";
+                    });
+                },
+                showUserWorkgroup(orderIssue) {
+                    orderIssue.is_show_user_workgroup = !orderIssue.is_show_user_workgroup;
+                    this.$forceUpdate();
                 }
             }
         })

+ 3 - 0
routes/apiLocal.php

@@ -76,6 +76,9 @@ Route::group(['prefix' => 'order'], function () {
         Route::group(['prefix'=>'recycle'],function(){
             Route::post('recover','OrderIssueController@recoverOrderIssueApi');
         });
+        Route::post('userWorkgroups/add','OrderIssueController@addUserWorkgroup');
+        Route::post('userWorkgroups/delete','OrderIssueController@destroyUserWorkgroup');
+        Route::post('batchOthers','OrderIssueController@batchOthers');
     });
 
     Route::group(['prefix'=>'tracking'],function (){

+ 21 - 0
tests/Unit/Services/OrderIssueWorkGroupSync.php

@@ -0,0 +1,21 @@
+<?php
+
+namespace Services;
+
+
+use App\OrderIssue;
+use Tests\TestCase;
+
+class OrderIssueWorkGroupSync extends TestCase
+{
+    /**
+     * @test
+     */
+    public function testSync()
+    {
+        $orderIssues = OrderIssue::query()->whereNotNull('user_workgroup_id')->get();
+        foreach ($orderIssues as $orderIssue) {
+            $orderIssue->userWorkgroups()->attach($orderIssue->user_workgroup_id);
+        }
+    }
+}