فهرست منبع

Merge branch 'master' of http://47.107.53.207:3000/ymy/oms

AlanWong 2 سال پیش
والد
کامیت
40ee5963df

+ 8 - 0
src/api/omsOrder.ts

@@ -112,4 +112,12 @@ export function cancelOrder(data:any){
 		method:'POST',
 		data:data
 	})
+}
+//反取消订单
+export function unCancel(data:any){
+	return request({
+		url:'/omsOrder/omsOrder/unCancel',
+		method:'POST',
+		params:data
+	})
 }

+ 49 - 0
src/api/question.ts

@@ -0,0 +1,49 @@
+import request from '@/benyun/utils/request'
+
+//异常查询
+export function queryAll(){
+	return request({
+		url: '/omsOrder/omsQuestionType/queryAll',
+		method: 'GET'
+	})
+}
+//新增
+export function save(data:any){
+	return request({
+		url: '/omsOrder/omsQuestionType/save',
+		method: 'POST',
+		params: data
+	})
+}
+//修改顺序
+export function updateOrdered(data:any){
+	return request({
+		url: '/omsOrder/omsQuestionType/updateOrdered',
+		method: 'POST',
+		params: data
+	})
+}
+//修改优先级
+export function updatePriority(data:any){
+	return request({
+		url: '/omsOrder/omsQuestionType/updatePriority',
+		method: 'POST',
+		params: data
+	})
+}
+//修改显示
+export function updateShow(data:any){
+	return request({
+		url: '/omsOrder/omsQuestionType/updateShow',
+		method: 'POST',
+		params: data
+	})
+}
+//删除
+export function del(data:any){
+	return request({
+		url: '/omsOrder/omsQuestionType/delete',
+		method: 'POST',
+		params: data
+	})
+}

+ 6 - 0
src/benyun/components/byInput/byInput.vue

@@ -95,4 +95,10 @@ export default class ByInput extends VueViews {
 
 <style lang="scss" scoped>
 
+</style>
+
+<style lang="scss">
+.el-input--small{
+  font-size: 14px !important;
+}
 </style>

+ 2 - 2
src/components/skuModal/productModal.vue

@@ -47,7 +47,7 @@ export default class ProductModal extends Vue {
           }
         },{
           span:6,
-          label:'标题',
+          label:'商品名称',
           prop:'skuTitle',
           component:'by-input',
           compConfig:{
@@ -78,7 +78,7 @@ export default class ProductModal extends Vue {
         field:'id',
         width:100
       },{
-        title:'标题',
+        title:'商品名称',
         field:'skuTitle',
         ellipsis:true,
         // width:150

+ 3 - 2
src/views/oms/order/components/addOrder.vue

@@ -42,7 +42,7 @@
             <el-radio :label="1">快速支付&已付款</el-radio>
             <el-radio :label="2">手工添加支付信息</el-radio>
           </el-radio-group>
-          <div class="pay-row" v-else-if="orderValue.status != 'Split' && orderValue.status != 'Merged'">
+          <div class="pay-row" v-else-if="orderValue.status != 'Split' && orderValue.status != 'Merged' && orderValue.status != 'Cancelled'">
             <el-button type="text" v-if="!orderValue.pays || orderValue.pays.length == 0">快速支付</el-button>
             <el-button type="text" @click="radioPay = 2">添加手工支付</el-button>
           </div>
@@ -52,7 +52,7 @@
               <el-descriptions-item label="单号">{{item.outerPayId}}</el-descriptions-item>
               <el-descriptions-item label="金额">{{item.amount}}</el-descriptions-item>
               <el-descriptions-item label="支付日期">{{item.payDate}}</el-descriptions-item>
-              <el-descriptions-item v-if="orderValue.status == 'Split' || orderValue.status == 'Merged'" label="状态">
+              <el-descriptions-item v-if="orderValue.status == 'Split' || orderValue.status == 'Merged' || orderValue.status == 'Cancelled'" label="状态">
                 <el-tag type="info" size="mini">已失效</el-tag>
               </el-descriptions-item>
             </el-descriptions>
@@ -272,6 +272,7 @@ export default class AddOrder extends Vue {
         prop:'sourceFrom',
         descSlot:true,
         component:'by-select',
+        colspan:2,
         compConfig:{
           attr:{
             // placeholder:'请输入订单日期',

+ 63 - 0
src/views/oms/order/components/addQuest.vue

@@ -0,0 +1,63 @@
+<template>
+  <vxe-modal v-model="value" id="addQuest" width="400" v-loading="load" @show="show" @hide="hide" height="200" show-zoom resize transfer show-footer title="新增异常类型">
+    <by-form :propConfig="config" ref="form"></by-form>
+    <template #footer>
+      <div class="btn">
+        <el-button type="primary" size="small" @click="btn">确定</el-button>
+      </div>
+    </template>
+  </vxe-modal>
+</template>
+
+<script lang="ts">
+import { Component, Prop, Vue, Watch } from "vue-property-decorator";
+import { save } from '@/api/question'
+@Component({components:{}})
+export default class AddQuestModel extends Vue {
+  value = false;
+  load = false;
+  config:any={
+    attr:{
+      rules:{
+        type: [
+          { required: true, message: '请输入类型', trigger: 'blur' }
+        ]
+      }
+    },
+    columns:[
+      [{
+        label:'类型',
+        prop:'type',
+        component:'by-input'
+      }]
+    ]
+  }
+  show(){
+    
+  }
+  hide(){
+    (this.$refs.form as any).clearValidate();
+    (this.$refs.form as any).clearValue();
+  }
+  setShow(v:boolean){
+    this.value = v;
+  }
+  btn(){
+    (this.$refs.form as any).validate().then(()=>{
+      let data = (this.$refs.form as any).getValue();
+      this.load = true
+      save(data).then(()=>{
+        this.load = false;
+        this.$emit('handleSuccess');
+        this.value = false;
+      }).catch(()=>{
+        this.load = false;
+      })
+    })
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+
+</style>

+ 26 - 4
src/views/oms/order/components/cancelOrderModel.vue

@@ -2,7 +2,7 @@
   <vxe-modal v-model="value" id="purchaseModel" width="400" height="300" show-zoom resize transfer show-footer v-loading="load">
     <div class="info">
       <div class="label">类型:</div>
-      <el-select v-model="type" placeholder="请选择" size="mini" class="cancel-type">
+      <el-select v-model="type" placeholder="请选择" size="mini" class="cancel-type" clearable>
         <el-option
           v-for="item in options"
           :key="item.value"
@@ -13,7 +13,7 @@
     </div>
     <div class="info">
       <div class="label">原因:</div>
-      <el-input v-model="reason" placeholder="请输入内容" type="texterae" rows="3"></el-input>
+      <el-input v-model="reason" class="cancel-type" placeholder="请输入内容" type="textarea" :rows="3"></el-input>
     </div>
     <template #footer>
       <div class="btn">
@@ -25,6 +25,7 @@
 
 <script lang="ts">
 import { Component, Prop, Vue, Watch } from "vue-property-decorator";
+import { cancelOrder } from '@/api/omsOrder'
 @Component
 export default class CancelOrderModel extends Vue {
   value = false;
@@ -49,7 +50,28 @@ export default class CancelOrderModel extends Vue {
     this.ids = d;
   }
   btn(){
-
+    if(!this.type){
+      this.$message('请选择取消类型!');
+      return
+    }
+    this.load = true;
+    cancelOrder({
+      idList:this.ids,
+      cancelType:this.type,
+      remark:this.reason
+    }).then(()=>{
+      this.load = false;
+      this.$message({
+        message:'订单取消成功!',
+        type:'success'
+      });
+      this.value = false;
+      this.type='';
+      this.reason = '';
+      this.$emit('handleSuccess');
+    }).catch((err:any)=>{
+      this.load = false;
+    })
   }
 }
 </script>
@@ -61,7 +83,7 @@ export default class CancelOrderModel extends Vue {
   align-items: center;
   padding-bottom: 16px;
   .label{
-    width: 100px;
+    width: 80px;
     text-align: right;
     padding-right: 8px;
     box-sizing: border-box;

+ 0 - 1
src/views/oms/order/components/loadOrderModal.vue

@@ -243,7 +243,6 @@ export default class LoadOrderModal extends Vue {
           type: 'warning',
         });
       }
-      this.$emit('handleSuccess');
     }).catch((err:any) => {
       this.load = false;
     })

+ 8 - 1
src/views/oms/order/components/orderCheckbox.vue

@@ -6,7 +6,11 @@
       </el-checkbox>
     </template>
     <el-checkbox-group v-if="options.length > 0" v-model="value" @change="handleCheckedItemChange">
-      <el-checkbox v-for="dataItem in options" :label="dataItem.value || dataItem.value === 0?dataItem.value:dataItem.label" :key="dataItem.value">{{dataItem.label}}</el-checkbox>
+      <template v-for="dataItem in options">
+        <br :key="'s'+dataItem.value"/>
+        <el-checkbox :label="dataItem.value || dataItem.value === 0?dataItem.value:dataItem.label" :key="dataItem.value">{{dataItem.label}}</el-checkbox>
+        <slot v-if="dataItem.slot" :name='dataItem.slotName' :item='dataItem'></slot>
+      </template>
     </el-checkbox-group>
   </el-collapse-item>
 </template>
@@ -89,4 +93,7 @@ export default class OrderCheckbox extends Vue {
 .check-title{
   font-weight: 700;
 }
+.slot-box{
+  padding-left: 8px;
+}
 </style>

+ 137 - 0
src/views/oms/order/components/questModel.vue

@@ -0,0 +1,137 @@
+<template>
+  <vxe-modal v-model="value" id="questModel" width="70%" v-loading="load" @show="show" height="80%" show-zoom resize transfer show-footer>
+    <template #title>
+      <span>异常类型</span>
+    </template>
+    <by-table :propConfig="tableConfig" ref="table">
+      <template v-slot:ordered="{row}">
+        <span v-if="row.isSystem == 1">{{ row.ordered }}</span>
+        <vxe-input v-else v-model="row.ordered" size="small" type="number"></vxe-input>
+      </template>
+      <template v-slot:priority="{row}">
+        <span v-if="row.isSystem == 1">{{ row.priority }}</span>
+        <vxe-input v-else v-model="row.priority" size="small" type="number"></vxe-input>
+      </template>
+      <template v-slot:isShow="{row}">
+        <el-switch
+          v-model="row.isShow"
+          :active-value="1"
+          :inactive-value="0"
+          :disabled="row.isSystem == 1">
+        </el-switch>
+      </template>
+    </by-table>
+    <template #footer>
+      <div class="btn">
+        <el-button type="primary" size="small" @click="add">新增</el-button>
+      </div>
+    </template>
+    <add-quest-model ref="addQuestModel" @handleSuccess="handleSuccess" />
+  </vxe-modal>
+</template>
+
+<script lang="ts">
+import { Component, Prop, Vue, Watch } from "vue-property-decorator";
+import { queryAll } from '@/api/question'
+import AddQuestModel from "./addQuest.vue";
+@Component({components:{AddQuestModel}})
+export default class QuestModel extends Vue {
+  value=false;
+  load=false;
+  tableConfig:any={
+    attr:{
+      size:'mini',
+      align:'center',
+      seq:true
+    },
+    columns:[{
+      title:'类型',
+      field:'type',
+      width:240
+    },{
+      title:'排序',
+      field:'ordered',
+      slot:true
+    },{
+      title:'优先级',
+      field:'priority',
+      slot:true
+    },{
+      title:'显示',
+      field:'isShow',
+      slot:true
+    },{
+      title:'操作',
+      action:true,
+      width:200,
+      plugins:[{
+        name:'排序',
+        event:{
+          show:(row:any) => {
+            return row.isSystem != 1
+          },
+          click:(row:any) => {
+
+          }
+        }
+      },{
+        name:'优先级',
+        event:{
+          show:(row:any) => {
+            return row.isSystem != 1
+          },
+          click:(row:any) => {
+            
+          }
+        }
+      },{
+        name:'删除',
+        event:{
+          show:(row:any) => {
+            return row.isSystem != 1
+          },
+          click:(row:any) => {
+            
+          }
+        }
+      }]
+    }]
+  }
+  questData:Array<any>=[]
+  
+  mounted(){
+    
+  }
+  show(){
+    this.getQuestionList()
+  }
+  handleSuccess(){
+    this.getQuestionList()
+  }
+  //获取异常数据
+  getQuestionList(){
+    this.load = true;
+    queryAll().then((res:any) => {
+      this.questData = res.data;
+      if(this.$refs.table){
+        (this.$refs.table as any).setValue(this.questData);
+      }
+      this.load = false;
+    }).catch((err:any) => {
+      this.load = false;
+    })
+  }
+
+  setShow(v:boolean){
+    this.value = v;
+  }
+
+  add(){
+    (this.$refs.addQuestModel as any).setShow(true)
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+
+</style>

+ 132 - 19
src/views/oms/order/index.vue

@@ -8,7 +8,24 @@
             <input-select :options="outLineOptions" @input="parameChangeBase($event,'idType','idValue')" ref="searchCom02" />
             <input-select :options="buyerOptions" @input="parameChangeInfo($event,'receiverInfo','receiverValue')" ref="searchCom03" />
           </el-collapse-item>
-          <order-checkbox title="订单状态" keyName="statusList" ref="searchCom04" :options="statusOptions" noLimit @checkboxChange="onChange($event,'statusList')" />
+          <order-checkbox title="订单状态" keyName="statusList" ref="searchCom04" :options="statusOptions" noLimit @checkboxChange="onChange($event,'statusList')">
+            <template v-slot:question>
+              <div class="ques-box">
+                <div class="questtion-top" @click="showQues = !showQues">
+                  <div class="quest-title">
+                    <span>异常类型</span>
+                    <i class="el-icon-setting" @click.stop="showQuestType"></i>
+                  </div>
+                  <i class="el-icon-arrow-down"></i>
+                </div>
+                <el-collapse-transition>
+                  <div class="ques-list"  v-show="showQues">
+                    <el-checkbox v-for="item of questData" :label="item.id" :key="item.value">{{item.type}}</el-checkbox>
+                  </div>
+                </el-collapse-transition>
+              </div>
+            </template>
+          </order-checkbox>
           <order-radio title="提交状态" keyName="isSubmitted" ref="searchComsubmitStatus" :options="submitOption" noLimit @radioChange="onChangeSmt" />
           <order-radio title="买家留言" keyName="buyerMessageFilter" ref="searchCom05" :options="buyerMessageOptions" noLimit @radioChange="onChange($event,'buyerMessageFilter')">
             <template v-slot:buyerMessage>
@@ -144,20 +161,30 @@
     </div>
     <div class="order-right">
       <div class="tool">
-        <order-tool @addOrder="addOrder" @smt="smtOrder" @reSmt="reSmt" @loadOrder="loadOrder" @producePurchase="producePurchase"/>
+        <order-tool @addOrder="addOrder" @smt="smtOrder" @reSmt="reSmt" @loadOrder="loadOrder" @producePurchase="producePurchase" @cancelOrder="cancelOrder" 
+        @reCancelOrder="reCancelOrder"/>
       </div>
       <div class="table">
-        <order-table :data="data" ref="orderTable" class="order-table" @detail="detail" @mergeHandle="mergeHandle" @splitHandle="splitHandle" @cancelOrder="cancelOrder"/>
+        <order-table :data="data" ref="orderTable" class="order-table" @detail="detail" @mergeHandle="mergeHandle" @splitHandle="splitHandle"/>
         <div class="page">
           <el-pagination v-if="page.total > 0" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="page.pageNo" :page-size="page.pageSize"
             :layout="'total, sizes, prev, pager, next, jumper'" :total="page.total"></el-pagination>
         </div>
       </div>
+      <!-- 手工下单 -->
       <add-order ref="addOrder" @handleSuccess="handleSuccess" />
+      <!-- 手工下载 -->
       <load-order-modal ref="loadOrder" @handleSuccess="handleSuccess" />
+      <!-- 生成采购单 -->
       <purchase-model ref="purchaseModel" @handleSuccess="handleSuccess" />
+      <!-- 合并 -->
       <merge-model ref="mergeModel" @handleSuccess="handleSuccess" />
+      <!-- 拆分 -->
       <split-model ref="splitModel" @handleSuccess="handleSuccess" />
+      <!-- 取消订单 -->
+      <cancel-order-model ref="cancelOrderModel" @handleSuccess="handleSuccess" />
+      <!-- 异常 -->
+      <quest-model ref="questModel" />
     </div>
   </div>
 </template>
@@ -177,20 +204,25 @@ import loadOrderModal from './components/loadOrderModal.vue' //手工下载
 import PurchaseModel from "./components/purchaseModel.vue"; //生成采购单
 import MergeModel from "./components/mergeMedal.vue"; //合并
 import SplitModel from "./components/splitModal.vue"; //拆分
-import { query,getProvince,smt,unSmt,purchaseQty } from '@/api/omsOrder'
+import CancelOrderModel from "./components/cancelOrderModel.vue"; //取消订单
+import QuestModel from "./components/questModel.vue";
+import { query,getProvince,smt,unSmt,purchaseQty,unCancel } from '@/api/omsOrder'
+import { queryAll } from '@/api/question'
 @Component({components:{filterInput,OrderCheckbox,OrderRadio,filterDate,OrderTool,OrderTable,AddOrder,InputSelect,OrderProduct,
-  filterMinMax,loadOrderModal,PurchaseModel,MergeModel,SplitModel}})
+  filterMinMax,loadOrderModal,PurchaseModel,MergeModel,SplitModel,CancelOrderModel,QuestModel}})
 export default class Order extends Vue {
   activeNames:Array<any>=['1','status']
   radio=''
   radio2=''
   data:Array<any> = []
   load = false;
+  showQues=false;
   page:any={
     pageNo: 1, //当前页
     pageSize: 20, //每页条数
     total: 0 //总条数
   }
+  questData:Array<any>=[]
   value:any={
     // sourceId:'',  //线上订单号
     // shopBuyerId:'', //买家昵称
@@ -409,15 +441,9 @@ export default class Order extends Vue {
   statusOptions:Array<any>=[{
     label:'待付款',
     value:'WaitPay'
-  },{
-    label:'发货中',
-    value:'Delivering'
   },{
     label:'被合并',
     value:'Merged'
-  },{
-    label:'异常',
-    value:'Question'
   },{
     label:'被拆分',
     value:'Split'
@@ -430,12 +456,20 @@ export default class Order extends Vue {
   },{
     label:'已客审待财审',
     value:'WaitFConfirm'
+  },{
+    label:'发货中',
+    value:'Delivering'
   },{
     label:'已发货',
     value:'Sent'
   },{
     label:'取消',
     value:'Cancelled'
+  },{
+    label:'异常',
+    value:'Question',
+    slot:true,
+    slotName:'question'
   }]
   shopIdListOptions:Array<any>=[]
 
@@ -443,8 +477,20 @@ export default class Order extends Vue {
   provinceOptions:Array<any>=[]
 
   mounted(){
-    this.getList()
-    this.getProvince()
+    this.getList();
+    this.getProvince();
+    this.getQuestionList();
+  }
+  showQuestType(){
+    (this.$refs.questModel as any).setShow(true);
+  }
+  //获取异常数据
+  getQuestionList(){
+    queryAll().then((res:any) => {
+      this.questData = res.data;
+    }).catch((err:any) => {
+
+    })
   }
 
   //生成采购单
@@ -556,7 +602,7 @@ export default class Order extends Vue {
           smtMst = item.sourceId
         }
       }
-      if(item.status != 'WaitConfirm'){
+      if(!item.pays && item.pays.length == 0){
         if(msg){
           msg = msg + ',' + item.sourceId
         }else{
@@ -573,7 +619,7 @@ export default class Order extends Vue {
     }
     if(msg){
       this.$message({
-        message:'订单“'+msg + '”不是“已付款待审核”状态,不能提交!'
+        message:'订单“'+msg + '”未付款,不能提交!'
       })
       return
     }
@@ -584,7 +630,7 @@ export default class Order extends Vue {
       this.load = false;
       // if(res.data == data.length){
         (this as any).$message({
-          message: '订单提交成功!',
+          message: res.msg,
           type: 'success'
         });
       // }else{
@@ -781,11 +827,49 @@ export default class Order extends Vue {
     }
     if(msgIds){
       this.$message({
-        message:'订单“'+msgIds + '”不满足取消订单操作!'
+        message:'订单“'+msgIds + '”已经是取消状态,不能重复操作!'
       })
       return
     }
-
+    (this.$refs.cancelOrderModel as any).setShow(true);
+    (this.$refs.cancelOrderModel as any).setData(ids);
+  }
+  //反取消订单
+  reCancelOrder(){
+    let data:Array<any>= (this.$refs.orderTable as any).getSelectData();
+    if(data.length == 0){
+      this.$message('请选择订单!');
+      return
+    }
+    let ids:Array<any>=[];
+    let msgIds='';
+    for(const item of data){
+      if(item.status == 'Cancelled'){
+        ids.push(item.id)
+      }else{
+        if(msgIds){
+          msgIds = msgIds + ',' + item.sourceId
+        }else{
+          msgIds = item.sourceId
+        }
+      }
+    }
+    if(msgIds){
+      this.$message({
+        message:'订单“'+msgIds + '”订单未取消,不能执行此操作!'
+      })
+      return
+    }
+    this.load = true;
+    unCancel({idList:ids}).then((res:any)=>{
+      this.load = false;
+      this.$message({
+        message:'反取消订单操作成功!'
+      })
+      this.handleSuccess();
+    }).catch(()=>{
+      this.load = false
+    })
   }
 
   //同步店铺订单
@@ -882,7 +966,36 @@ export default class Order extends Vue {
   display: flex;
   align-items: center;
   padding-bottom: 4px;
-  
+}
+.ques-box{
+  .questtion-top{
+    height: 30px;
+    display: flex;
+    justify-content:space-between;
+    align-items: center;
+    padding: 0 16px;
+    background-color: #EEE;
+    cursor: pointer;
+    .quest-title{
+      height: 30px;
+      font-size: 12px;
+      display: flex;
+      align-items: center;
+    }
+    .el-icon-setting{
+      padding-right: 8px;
+      color: #2d99f7;
+      margin-left: 4px;
+    }
+    i{
+      font-size: 16px;
+      cursor: pointer;
+    }
+  }
+  .ques-list{
+    overflow: hidden;
+    padding-left: 16px;
+  }
 }
 </style>